aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/.bear-tidy-config21
-rw-r--r--src/.clang-tidy1
-rw-r--r--src/CMakeLists.txt445
-rw-r--r--src/Makefile.am1133
-rw-r--r--src/Makefile.bench.include114
-rw-r--r--src/Makefile.crc32c.include81
-rw-r--r--src/Makefile.leveldb.include153
-rw-r--r--src/Makefile.minisketch.include39
-rw-r--r--src/Makefile.qt.include409
-rw-r--r--src/Makefile.qt_locale.include124
-rw-r--r--src/Makefile.qttest.include74
-rw-r--r--src/Makefile.test.include493
-rw-r--r--src/Makefile.test_fuzz.include26
-rw-r--r--src/Makefile.test_util.include55
-rw-r--r--src/Makefile.univalue.include6
-rw-r--r--src/addrman.cpp57
-rw-r--r--src/addrman.h5
-rw-r--r--src/addrman_impl.h4
-rw-r--r--src/banman.cpp6
-rw-r--r--src/bench/.gitignore1
-rw-r--r--src/bench/CMakeLists.txt84
-rw-r--r--src/bench/addrman.cpp8
-rw-r--r--src/bench/base58.cpp5
-rw-r--r--src/bench/bech32.cpp9
-rw-r--r--src/bench/bench.cpp7
-rw-r--r--src/bench/bench.h5
-rw-r--r--src/bench/bench_bitcoin.cpp7
-rw-r--r--src/bench/bip324_ecdh.cpp2
-rw-r--r--src/bench/block_assemble.cpp12
-rw-r--r--src/bench/ccoins_caching.cpp5
-rw-r--r--src/bench/chacha20.cpp5
-rw-r--r--src/bench/checkblock.cpp13
-rw-r--r--src/bench/checkblockindex.cpp2
-rw-r--r--src/bench/checkqueue.cpp4
-rw-r--r--src/bench/cluster_linearize.cpp197
-rw-r--r--src/bench/coin_selection.cpp15
-rw-r--r--src/bench/crypto_hash.cpp5
-rw-r--r--src/bench/data.cpp14
-rw-r--r--src/bench/data.h19
-rw-r--r--src/bench/descriptors.cpp11
-rw-r--r--src/bench/disconnected_transactions.cpp11
-rw-r--r--src/bench/duplicate_inputs.cpp15
-rw-r--r--src/bench/ellswift.cpp7
-rw-r--r--src/bench/gcs_filter.cpp5
-rw-r--r--src/bench/hashpadding.cpp2
-rw-r--r--src/bench/index_blockfilter.cpp26
-rw-r--r--src/bench/load_external.cpp17
-rw-r--r--src/bench/lockedpool.cpp3
-rw-r--r--src/bench/logging.cpp64
-rw-r--r--src/bench/mempool_eviction.cpp11
-rw-r--r--src/bench/mempool_stress.cpp11
-rw-r--r--src/bench/merkle_root.cpp3
-rw-r--r--src/bench/peer_eviction.cpp5
-rw-r--r--src/bench/poly1305.cpp5
-rw-r--r--src/bench/pool.cpp4
-rw-r--r--src/bench/prevector.cpp6
-rw-r--r--src/bench/random.cpp2
-rw-r--r--src/bench/readblock.cpp15
-rw-r--r--src/bench/rollingbloom.cpp2
-rw-r--r--src/bench/rpc_blockchain.cpp16
-rw-r--r--src/bench/rpc_mempool.cpp11
-rw-r--r--src/bench/sign_transaction.cpp17
-rw-r--r--src/bench/strencodings.cpp5
-rw-r--r--src/bench/verify_script.cpp11
-rw-r--r--src/bench/wallet_balance.cpp16
-rw-r--r--src/bench/wallet_create.cpp17
-rw-r--r--src/bench/wallet_create_tx.cpp29
-rw-r--r--src/bench/wallet_ismine.cpp23
-rw-r--r--src/bench/wallet_loading.cpp24
-rw-r--r--src/bench/xor.cpp2
-rw-r--r--src/bitcoin-chainstate.cpp2
-rw-r--r--src/bitcoin-cli.cpp9
-rw-r--r--src/bitcoind.cpp7
-rw-r--r--src/blockencodings.cpp6
-rw-r--r--src/chainparamsseeds.h3824
-rw-r--r--src/clientversion.cpp2
-rw-r--r--src/cluster_linearize.h304
-rw-r--r--src/common/args.cpp24
-rw-r--r--src/common/args.h9
-rw-r--r--src/consensus/consensus.h7
-rw-r--r--src/consensus/params.h4
-rw-r--r--src/crypto/CMakeLists.txt68
-rw-r--r--src/dbwrapper.cpp6
-rw-r--r--src/external_signer.cpp4
-rw-r--r--src/flatfile.cpp2
-rw-r--r--src/headerssync.cpp28
-rw-r--r--src/httprpc.cpp11
-rw-r--r--src/httpserver.cpp40
-rw-r--r--src/index/base.cpp5
-rw-r--r--src/index/base.h5
-rw-r--r--src/init.cpp93
-rw-r--r--src/init.h2
-rw-r--r--src/init/bitcoin-gui.cpp5
-rw-r--r--src/init/bitcoin-node.cpp1
-rw-r--r--src/interfaces/chain.h24
-rw-r--r--src/interfaces/init.h1
-rw-r--r--src/interfaces/ipc.h16
-rw-r--r--src/interfaces/mining.h37
-rw-r--r--src/interfaces/node.h3
-rw-r--r--src/ipc/CMakeLists.txt18
-rw-r--r--src/ipc/capnp/.gitignore2
-rw-r--r--src/ipc/capnp/protocol.cpp15
-rw-r--r--src/ipc/interfaces.cpp34
-rw-r--r--src/ipc/process.cpp96
-rw-r--r--src/ipc/process.h10
-rw-r--r--src/ipc/protocol.h28
-rw-r--r--src/kernel/CMakeLists.txt146
-rw-r--r--src/kernel/chainparams.cpp88
-rw-r--r--src/logging.h73
-rw-r--r--src/logging/timer.h4
-rw-r--r--src/net.cpp149
-rw-r--r--src/net.h12
-rw-r--r--src/net_processing.cpp297
-rw-r--r--src/net_processing.h5
-rw-r--r--src/netaddress.cpp4
-rw-r--r--src/netbase.cpp15
-rw-r--r--src/netbase.h7
-rw-r--r--src/node/blockstorage.cpp12
-rw-r--r--src/node/blockstorage.h3
-rw-r--r--src/node/caches.cpp1
-rw-r--r--src/node/chainstatemanager_args.cpp15
-rw-r--r--src/node/context.h2
-rw-r--r--src/node/interfaces.cpp83
-rw-r--r--src/node/miner.cpp14
-rw-r--r--src/policy/fees.cpp20
-rw-r--r--src/pow.cpp11
-rw-r--r--src/pow.h1
-rw-r--r--src/prevector.h20
-rw-r--r--src/pubkey.cpp11
-rw-r--r--src/pubkey.h2
-rw-r--r--src/qt/CMakeLists.txt331
-rw-r--r--src/qt/Makefile11
-rw-r--r--src/qt/README.md4
-rw-r--r--src/qt/bitcoin.cpp19
-rw-r--r--src/qt/bitcoin_locale.qrc2
-rw-r--r--src/qt/forms/optionsdialog.ui2
-rw-r--r--src/qt/locale/bitcoin_af.ts315
-rw-r--r--src/qt/locale/bitcoin_am.ts189
-rw-r--r--src/qt/locale/bitcoin_ar.ts2899
-rw-r--r--src/qt/locale/bitcoin_az.ts57
-rw-r--r--src/qt/locale/bitcoin_az@latin.ts31
-rw-r--r--src/qt/locale/bitcoin_bg.ts36
-rw-r--r--src/qt/locale/bitcoin_bn.ts8
-rw-r--r--src/qt/locale/bitcoin_bs.ts21
-rw-r--r--src/qt/locale/bitcoin_ca.ts73
-rw-r--r--src/qt/locale/bitcoin_cmn.ts305
-rw-r--r--src/qt/locale/bitcoin_cs.ts74
-rw-r--r--src/qt/locale/bitcoin_da.ts57
-rw-r--r--src/qt/locale/bitcoin_de.ts400
-rw-r--r--src/qt/locale/bitcoin_de_AT.ts4582
-rw-r--r--src/qt/locale/bitcoin_de_CH.ts224
-rw-r--r--src/qt/locale/bitcoin_el.ts106
-rw-r--r--src/qt/locale/bitcoin_eo.ts28
-rw-r--r--src/qt/locale/bitcoin_es.ts493
-rw-r--r--src/qt/locale/bitcoin_es_CL.ts297
-rw-r--r--src/qt/locale/bitcoin_es_CO.ts273
-rw-r--r--src/qt/locale/bitcoin_es_DO.ts337
-rw-r--r--src/qt/locale/bitcoin_es_MX.ts737
-rw-r--r--src/qt/locale/bitcoin_es_SV.ts351
-rw-r--r--src/qt/locale/bitcoin_es_VE.ts327
-rw-r--r--src/qt/locale/bitcoin_et.ts4
-rw-r--r--src/qt/locale/bitcoin_eu.ts20
-rw-r--r--src/qt/locale/bitcoin_fa.ts2636
-rw-r--r--src/qt/locale/bitcoin_fi.ts105
-rw-r--r--src/qt/locale/bitcoin_fil.ts62
-rw-r--r--src/qt/locale/bitcoin_fo.ts16
-rw-r--r--src/qt/locale/bitcoin_fr.ts251
-rw-r--r--src/qt/locale/bitcoin_fr_CM.ts243
-rw-r--r--src/qt/locale/bitcoin_fr_LU.ts243
-rw-r--r--src/qt/locale/bitcoin_ga.ts212
-rw-r--r--src/qt/locale/bitcoin_ga_IE.ts213
-rw-r--r--src/qt/locale/bitcoin_gl.ts28
-rw-r--r--src/qt/locale/bitcoin_gl_ES.ts45
-rw-r--r--src/qt/locale/bitcoin_gu.ts76
-rw-r--r--src/qt/locale/bitcoin_hak.ts307
-rw-r--r--src/qt/locale/bitcoin_he.ts75
-rw-r--r--src/qt/locale/bitcoin_hi.ts187
-rw-r--r--src/qt/locale/bitcoin_hr.ts49
-rw-r--r--src/qt/locale/bitcoin_hu.ts232
-rw-r--r--src/qt/locale/bitcoin_id.ts223
-rw-r--r--src/qt/locale/bitcoin_it.ts221
-rw-r--r--src/qt/locale/bitcoin_ja.ts275
-rw-r--r--src/qt/locale/bitcoin_ka.ts36
-rw-r--r--src/qt/locale/bitcoin_kk.ts6
-rw-r--r--src/qt/locale/bitcoin_kk@latin.ts6
-rw-r--r--src/qt/locale/bitcoin_km.ts144
-rw-r--r--src/qt/locale/bitcoin_ko.ts74
-rw-r--r--src/qt/locale/bitcoin_ku.ts22
-rw-r--r--src/qt/locale/bitcoin_ku_IQ.ts20
-rw-r--r--src/qt/locale/bitcoin_la.ts924
-rw-r--r--src/qt/locale/bitcoin_lt.ts32
-rw-r--r--src/qt/locale/bitcoin_lv.ts4
-rw-r--r--src/qt/locale/bitcoin_mi.ts6
-rw-r--r--src/qt/locale/bitcoin_mk.ts28
-rw-r--r--src/qt/locale/bitcoin_ml.ts31
-rw-r--r--src/qt/locale/bitcoin_mn.ts4
-rw-r--r--src/qt/locale/bitcoin_ms.ts37
-rw-r--r--src/qt/locale/bitcoin_mt.ts21
-rw-r--r--src/qt/locale/bitcoin_nb.ts84
-rw-r--r--src/qt/locale/bitcoin_ne.ts4
-rw-r--r--src/qt/locale/bitcoin_nl.ts57
-rw-r--r--src/qt/locale/bitcoin_pam.ts4
-rw-r--r--src/qt/locale/bitcoin_pl.ts94
-rw-r--r--src/qt/locale/bitcoin_pt.ts310
-rw-r--r--src/qt/locale/bitcoin_pt_BR.ts218
-rw-r--r--src/qt/locale/bitcoin_ro.ts55
-rw-r--r--src/qt/locale/bitcoin_ru.ts2612
-rw-r--r--src/qt/locale/bitcoin_si.ts32
-rw-r--r--src/qt/locale/bitcoin_sk.ts46
-rw-r--r--src/qt/locale/bitcoin_sl.ts152
-rw-r--r--src/qt/locale/bitcoin_sn.ts4
-rw-r--r--src/qt/locale/bitcoin_sr.ts45
-rw-r--r--src/qt/locale/bitcoin_sr@ijekavianlatin.ts51
-rw-r--r--src/qt/locale/bitcoin_sr@latin.ts47
-rw-r--r--src/qt/locale/bitcoin_sv.ts125
-rw-r--r--src/qt/locale/bitcoin_sw.ts275
-rw-r--r--src/qt/locale/bitcoin_szl.ts23
-rw-r--r--src/qt/locale/bitcoin_ta.ts76
-rw-r--r--src/qt/locale/bitcoin_te.ts41
-rw-r--r--src/qt/locale/bitcoin_th.ts340
-rw-r--r--src/qt/locale/bitcoin_tk.ts33
-rw-r--r--src/qt/locale/bitcoin_tl.ts33
-rw-r--r--src/qt/locale/bitcoin_tr.ts388
-rw-r--r--src/qt/locale/bitcoin_uk.ts91
-rw-r--r--src/qt/locale/bitcoin_ur.ts154
-rw-r--r--src/qt/locale/bitcoin_uz.ts82
-rw-r--r--src/qt/locale/bitcoin_uz@Cyrl.ts26
-rw-r--r--src/qt/locale/bitcoin_uz@Latn.ts68
-rw-r--r--src/qt/locale/bitcoin_vi.ts86
-rw-r--r--src/qt/locale/bitcoin_yue.ts279
-rw-r--r--src/qt/locale/bitcoin_zh-Hans.ts127
-rw-r--r--src/qt/locale/bitcoin_zh-Hant.ts305
-rw-r--r--src/qt/locale/bitcoin_zh.ts379
-rw-r--r--src/qt/locale/bitcoin_zh_CN.ts135
-rw-r--r--src/qt/locale/bitcoin_zh_HK.ts301
-rw-r--r--src/qt/locale/bitcoin_zh_TW.ts202
-rw-r--r--src/qt/optionsdialog.cpp3
-rw-r--r--src/qt/test/CMakeLists.txt56
-rw-r--r--src/qt/test/Makefile6
-rw-r--r--src/qt/test/test_main.cpp16
-rw-r--r--src/qt/test/wallettests.cpp8
-rw-r--r--src/qt/walletcontroller.cpp18
-rw-r--r--src/qt/walletcontroller.h3
-rw-r--r--src/random.cpp4
-rw-r--r--src/rest.cpp7
-rw-r--r--src/rpc/blockchain.cpp316
-rw-r--r--src/rpc/blockchain.h3
-rw-r--r--src/rpc/client.cpp2
-rw-r--r--src/rpc/mining.cpp121
-rw-r--r--src/rpc/node.cpp6
-rw-r--r--src/rpc/output_script.cpp122
-rw-r--r--src/rpc/rawtransaction.cpp9
-rw-r--r--src/rpc/request.cpp4
-rw-r--r--src/rpc/server.cpp8
-rw-r--r--src/rpc/txoutproof.cpp5
-rw-r--r--src/rpc/util.cpp33
-rw-r--r--src/script/descriptor.cpp577
-rw-r--r--src/script/descriptor.h4
-rw-r--r--src/script/script.h6
-rw-r--r--src/secp256k1/.github/workflows/ci.yml4
-rw-r--r--src/secp256k1/CHANGELOG.md3
-rw-r--r--src/secp256k1/CMakeLists.txt15
-rw-r--r--src/secp256k1/ci/linux-debian.Dockerfile2
-rw-r--r--src/secp256k1/configure.ac6
-rw-r--r--src/secp256k1/examples/schnorr.c4
-rw-r--r--src/secp256k1/include/secp256k1_ellswift.h2
-rw-r--r--src/secp256k1/src/modules/ellswift/tests_impl.h6
-rw-r--r--src/secp256k1/src/modules/schnorrsig/main_impl.h2
-rw-r--r--src/secp256k1/src/modules/schnorrsig/tests_impl.h10
-rw-r--r--src/secp256k1/src/testrand_impl.h2
-rw-r--r--src/signet.cpp15
-rw-r--r--src/span.h9
-rw-r--r--src/test/.gitignore2
-rw-r--r--src/test/CMakeLists.txt224
-rw-r--r--src/test/Makefile6
-rw-r--r--src/test/README.md87
-rw-r--r--src/test/addrman_tests.cpp55
-rw-r--r--src/test/arith_uint256_tests.cpp89
-rw-r--r--src/test/base32_tests.cpp4
-rw-r--r--src/test/base58_tests.cpp13
-rw-r--r--src/test/base64_tests.cpp4
-rw-r--r--src/test/bip324_tests.cpp25
-rw-r--r--src/test/blockencodings_tests.cpp6
-rw-r--r--src/test/blockfilter_index_tests.cpp2
-rw-r--r--src/test/bloom_tests.cpp108
-rw-r--r--src/test/checkqueue_tests.cpp18
-rw-r--r--src/test/coins_tests.cpp139
-rw-r--r--src/test/compress_tests.cpp2
-rw-r--r--src/test/crypto_tests.cpp80
-rw-r--r--src/test/cuckoocache_tests.cpp44
-rw-r--r--src/test/dbwrapper_tests.cpp46
-rw-r--r--src/test/denialofservice_tests.cpp12
-rw-r--r--src/test/descriptor_tests.cpp375
-rw-r--r--src/test/fuzz/CMakeLists.txt147
-rw-r--r--src/test/fuzz/addrman.cpp40
-rw-r--r--src/test/fuzz/banman.cpp8
-rw-r--r--src/test/fuzz/bip324.cpp7
-rw-r--r--src/test/fuzz/buffered_file.cpp4
-rw-r--r--src/test/fuzz/cluster_linearize.cpp88
-rw-r--r--src/test/fuzz/connman.cpp16
-rw-r--r--src/test/fuzz/crypto.cpp8
-rw-r--r--src/test/fuzz/crypto_chacha20.cpp9
-rw-r--r--src/test/fuzz/crypto_chacha20poly1305.cpp2
-rw-r--r--src/test/fuzz/cuckoocache.cpp4
-rw-r--r--src/test/fuzz/descriptor_parse.cpp30
-rw-r--r--src/test/fuzz/fuzz.cpp4
-rw-r--r--src/test/fuzz/hex.cpp15
-rw-r--r--src/test/fuzz/integer.cpp4
-rw-r--r--src/test/fuzz/message.cpp4
-rw-r--r--src/test/fuzz/miniscript.cpp4
-rw-r--r--src/test/fuzz/p2p_handshake.cpp2
-rw-r--r--src/test/fuzz/p2p_headers_presync.cpp200
-rw-r--r--src/test/fuzz/p2p_transport_serialization.cpp7
-rw-r--r--src/test/fuzz/policy_estimator.cpp13
-rw-r--r--src/test/fuzz/poolresource.cpp2
-rw-r--r--src/test/fuzz/pow.cpp2
-rw-r--r--src/test/fuzz/prevector.cpp33
-rw-r--r--src/test/fuzz/script_format.cpp4
-rw-r--r--src/test/fuzz/script_interpreter.cpp10
-rw-r--r--src/test/fuzz/script_sign.cpp9
-rw-r--r--src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp2
-rw-r--r--src/test/fuzz/socks5.cpp8
-rw-r--r--src/test/fuzz/span.cpp6
-rw-r--r--src/test/fuzz/system.cpp18
-rw-r--r--src/test/fuzz/util/CMakeLists.txt23
-rw-r--r--src/test/fuzz/util/net.cpp12
-rw-r--r--src/test/fuzz/utxo_snapshot.cpp4
-rw-r--r--src/test/hash_tests.cpp4
-rw-r--r--src/test/ipc_test.cpp99
-rw-r--r--src/test/ipc_test.h5
-rw-r--r--src/test/ipc_tests.cpp33
-rw-r--r--src/test/key_io_tests.cpp5
-rw-r--r--src/test/key_tests.cpp30
-rw-r--r--src/test/logging_tests.cpp6
-rw-r--r--src/test/merkle_tests.cpp4
-rw-r--r--src/test/miner_tests.cpp7
-rw-r--r--src/test/miniscript_tests.cpp29
-rw-r--r--src/test/minisketch_tests.cpp10
-rw-r--r--src/test/net_peer_connection_tests.cpp10
-rw-r--r--src/test/net_tests.cpp253
-rw-r--r--src/test/orphanage_tests.cpp36
-rw-r--r--src/test/pmt_tests.cpp12
-rw-r--r--src/test/pool_tests.cpp8
-rw-r--r--src/test/pow_tests.cpp8
-rw-r--r--src/test/prevector_tests.cpp78
-rw-r--r--src/test/raii_event_tests.cpp8
-rw-r--r--src/test/script_standard_tests.cpp7
-rw-r--r--src/test/script_tests.cpp90
-rw-r--r--src/test/serfloat_tests.cpp2
-rw-r--r--src/test/sighash_tests.cpp32
-rw-r--r--src/test/skiplist_tests.cpp10
-rw-r--r--src/test/streams_tests.cpp14
-rw-r--r--src/test/system_tests.cpp11
-rw-r--r--src/test/transaction_tests.cpp23
-rw-r--r--src/test/txpackage_tests.cpp38
-rw-r--r--src/test/txrequest_tests.cpp120
-rw-r--r--src/test/uint256_tests.cpp153
-rw-r--r--src/test/util/CMakeLists.txt29
-rw-r--r--src/test/util/cluster_linearize.h44
-rw-r--r--src/test/util/coins.cpp6
-rw-r--r--src/test/util/coins.h3
-rw-r--r--src/test/util/json.cpp8
-rw-r--r--src/test/util/json.h8
-rw-r--r--src/test/util/random.cpp24
-rw-r--r--src/test/util/random.h56
-rw-r--r--src/test/util/setup_common.cpp55
-rw-r--r--src/test/util/setup_common.h40
-rw-r--r--src/test/util/transaction_utils.cpp21
-rw-r--r--src/test/util/transaction_utils.h4
-rw-r--r--src/test/util_string_tests.cpp86
-rw-r--r--src/test/util_tests.cpp107
-rw-r--r--src/test/validation_block_tests.cpp8
-rw-r--r--src/test/validation_chainstate_tests.cpp4
-rw-r--r--src/test/validation_chainstatemanager_tests.cpp76
-rw-r--r--src/test/validation_flush_tests.cpp14
-rw-r--r--src/test/versionbits_tests.cpp17
-rw-r--r--src/torcontrol.cpp36
-rw-r--r--src/txdb.cpp6
-rw-r--r--src/txdb.h2
-rw-r--r--src/txmempool.cpp6
-rw-r--r--src/txorphanage.cpp16
-rw-r--r--src/uint256.h47
-rw-r--r--src/univalue/.gitignore32
-rw-r--r--src/univalue/CMakeLists.txt41
-rw-r--r--src/univalue/lib/.gitignore2
-rw-r--r--src/univalue/sources.mk86
-rw-r--r--src/univalue/test/.gitignore7
-rw-r--r--src/util/CMakeLists.txt45
-rw-r--r--src/util/strencodings.cpp10
-rw-r--r--src/util/strencodings.h81
-rw-r--r--src/util/string.h72
-rw-r--r--src/validation.cpp84
-rw-r--r--src/validation.h13
-rw-r--r--src/validationinterface.cpp2
-rw-r--r--src/wallet/CMakeLists.txt59
-rw-r--r--src/wallet/bdb.cpp18
-rw-r--r--src/wallet/coinselection.cpp2
-rw-r--r--src/wallet/crypter.cpp66
-rw-r--r--src/wallet/crypter.h12
-rw-r--r--src/wallet/db.cpp5
-rw-r--r--src/wallet/load.cpp12
-rw-r--r--src/wallet/rpc/backup.cpp202
-rw-r--r--src/wallet/rpc/spend.cpp8
-rw-r--r--src/wallet/scriptpubkeyman.cpp14
-rw-r--r--src/wallet/scriptpubkeyman.h2
-rw-r--r--src/wallet/test/CMakeLists.txt32
-rw-r--r--src/wallet/test/fuzz/CMakeLists.txt16
-rw-r--r--src/wallet/test/fuzz/coinselection.cpp2
-rw-r--r--src/wallet/test/fuzz/crypter.cpp10
-rw-r--r--src/wallet/test/fuzz/notifications.cpp2
-rw-r--r--src/wallet/test/fuzz/scriptpubkeyman.cpp11
-rw-r--r--src/wallet/test/fuzz/wallet_bdb_parser.cpp15
-rw-r--r--src/wallet/test/ismine_tests.cpp12
-rw-r--r--src/wallet/test/psbt_wallet_tests.cpp13
-rw-r--r--src/wallet/test/util.cpp5
-rw-r--r--src/wallet/test/wallet_crypto_tests.cpp113
-rw-r--r--src/wallet/test/wallet_tests.cpp41
-rw-r--r--src/wallet/wallet.cpp93
-rw-r--r--src/wallet/wallet.h2
-rw-r--r--src/wallet/walletdb.cpp6
-rw-r--r--src/wallet/walletutil.cpp4
-rw-r--r--src/wallet/walletutil.h8
-rw-r--r--src/zmq/CMakeLists.txt24
-rw-r--r--src/zmq/zmqnotificationinterface.cpp12
-rw-r--r--src/zmq/zmqpublishnotifier.cpp24
-rw-r--r--src/zmq/zmqutil.cpp2
426 files changed, 18010 insertions, 25586 deletions
diff --git a/src/.bear-tidy-config b/src/.bear-tidy-config
deleted file mode 100644
index 0ab30a8d9d..0000000000
--- a/src/.bear-tidy-config
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "output": {
- "content": {
- "include_only_existing_source": true,
- "paths_to_include": [],
- "paths_to_exclude": [
- "src/crc32c",
- "src/crypto/ctaes",
- "src/leveldb",
- "src/minisketch",
- "src/bench/nanobench.cpp",
- "src/bench/nanobench.h",
- "src/secp256k1"
- ]
- },
- "format": {
- "command_as_array": true,
- "drop_output_field": false
- }
- }
-}
diff --git a/src/.clang-tidy b/src/.clang-tidy
index 3569dd04b1..1cf270833a 100644
--- a/src/.clang-tidy
+++ b/src/.clang-tidy
@@ -14,6 +14,7 @@ modernize-use-emplace,
modernize-use-equals-default,
modernize-use-noexcept,
modernize-use-nullptr,
+modernize-use-starts-ends-with,
performance-*,
-performance-avoid-endl,
-performance-enum-size,
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000000..895c17541f
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,445 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+include(GNUInstallDirs)
+include(AddWindowsResources)
+
+configure_file(${PROJECT_SOURCE_DIR}/cmake/bitcoin-config.h.in config/bitcoin-config.h USE_SOURCE_PERMISSIONS @ONLY)
+include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+
+# TODO: After the transition from Autotools to CMake, the obj/ subdirectory
+# could be dropped as its only purpose was to separate a generated header
+# from source files.
+add_custom_target(generate_build_info
+ BYPRODUCTS ${PROJECT_BINARY_DIR}/src/obj/build.h
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/src/obj
+ COMMAND ${CMAKE_COMMAND} -DBUILD_INFO_HEADER_PATH=${PROJECT_BINARY_DIR}/src/obj/build.h -DSOURCE_DIR=${PROJECT_SOURCE_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateBuildInfo.cmake
+ COMMENT "Generating obj/build.h"
+ VERBATIM
+)
+add_library(bitcoin_clientversion OBJECT EXCLUDE_FROM_ALL
+ clientversion.cpp
+)
+target_compile_definitions(bitcoin_clientversion
+ PRIVATE
+ HAVE_BUILD_INFO
+)
+target_link_libraries(bitcoin_clientversion
+ PRIVATE
+ core_interface
+)
+add_dependencies(bitcoin_clientversion generate_build_info)
+
+add_subdirectory(crypto)
+add_subdirectory(univalue)
+add_subdirectory(util)
+if(WITH_MULTIPROCESS)
+ add_subdirectory(ipc)
+endif()
+
+#=============================
+# secp256k1 subtree
+#=============================
+message("")
+message("Configuring secp256k1 subtree...")
+set(SECP256K1_DISABLE_SHARED ON CACHE BOOL "" FORCE)
+set(SECP256K1_ENABLE_MODULE_ECDH OFF CACHE BOOL "" FORCE)
+set(SECP256K1_ENABLE_MODULE_RECOVERY ON CACHE BOOL "" FORCE)
+set(SECP256K1_BUILD_BENCHMARK OFF CACHE BOOL "" FORCE)
+set(SECP256K1_BUILD_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
+set(SECP256K1_BUILD_EXHAUSTIVE_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
+if(NOT BUILD_TESTS)
+ # Always skip the ctime tests, if we are building no other tests.
+ # Otherwise, they are built if Valgrind is available. See SECP256K1_VALGRIND.
+ set(SECP256K1_BUILD_CTIME_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
+endif()
+set(SECP256K1_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
+include(GetTargetInterface)
+# -fsanitize and related flags apply to both C++ and C,
+# so we can pass them down to libsecp256k1 as CFLAGS and LDFLAGS.
+get_target_interface(core_sanitizer_cxx_flags "" sanitize_interface COMPILE_OPTIONS)
+set(SECP256K1_APPEND_CFLAGS ${core_sanitizer_cxx_flags} CACHE STRING "" FORCE)
+unset(core_sanitizer_cxx_flags)
+get_target_interface(core_sanitizer_linker_flags "" sanitize_interface LINK_OPTIONS)
+set(SECP256K1_APPEND_LDFLAGS ${core_sanitizer_linker_flags} CACHE STRING "" FORCE)
+unset(core_sanitizer_linker_flags)
+# We want to build libsecp256k1 with the most tested RelWithDebInfo configuration.
+enable_language(C)
+foreach(config IN LISTS CMAKE_BUILD_TYPE CMAKE_CONFIGURATION_TYPES)
+ if(config STREQUAL "")
+ continue()
+ endif()
+ string(TOUPPER "${config}" config)
+ set(CMAKE_C_FLAGS_${config} "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+endforeach()
+# If the CFLAGS environment variable is defined during building depends
+# and configuring this build system, its content might be duplicated.
+if(DEFINED ENV{CFLAGS})
+ deduplicate_flags(CMAKE_C_FLAGS)
+endif()
+set(CMAKE_EXPORT_COMPILE_COMMANDS OFF)
+add_subdirectory(secp256k1)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+string(APPEND CMAKE_C_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CFLAGS}")
+
+add_library(bitcoin_consensus STATIC EXCLUDE_FROM_ALL
+ arith_uint256.cpp
+ consensus/merkle.cpp
+ consensus/tx_check.cpp
+ hash.cpp
+ primitives/block.cpp
+ primitives/transaction.cpp
+ pubkey.cpp
+ script/interpreter.cpp
+ script/script.cpp
+ script/script_error.cpp
+ uint256.cpp
+)
+target_link_libraries(bitcoin_consensus
+ PRIVATE
+ core_interface
+ bitcoin_crypto
+ secp256k1
+)
+
+if(WITH_ZMQ)
+ add_subdirectory(zmq)
+endif()
+
+# Home for common functionality shared by different executables and libraries.
+# Similar to `bitcoin_util` library, but higher-level.
+add_library(bitcoin_common STATIC EXCLUDE_FROM_ALL
+ addresstype.cpp
+ base58.cpp
+ bech32.cpp
+ chainparams.cpp
+ chainparamsbase.cpp
+ coins.cpp
+ common/args.cpp
+ common/bloom.cpp
+ common/config.cpp
+ common/init.cpp
+ common/interfaces.cpp
+ common/messages.cpp
+ common/run_command.cpp
+ common/settings.cpp
+ common/signmessage.cpp
+ common/system.cpp
+ common/url.cpp
+ compressor.cpp
+ core_read.cpp
+ core_write.cpp
+ deploymentinfo.cpp
+ external_signer.cpp
+ init/common.cpp
+ kernel/chainparams.cpp
+ key.cpp
+ key_io.cpp
+ merkleblock.cpp
+ net_permissions.cpp
+ net_types.cpp
+ netaddress.cpp
+ netbase.cpp
+ outputtype.cpp
+ policy/feerate.cpp
+ policy/policy.cpp
+ protocol.cpp
+ psbt.cpp
+ rpc/external_signer.cpp
+ rpc/rawtransaction_util.cpp
+ rpc/request.cpp
+ rpc/util.cpp
+ scheduler.cpp
+ script/descriptor.cpp
+ script/miniscript.cpp
+ script/parsing.cpp
+ script/sign.cpp
+ script/signingprovider.cpp
+ script/solver.cpp
+)
+target_link_libraries(bitcoin_common
+ PRIVATE
+ core_interface
+ bitcoin_consensus
+ bitcoin_util
+ univalue
+ secp256k1
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:USDT::headers>
+ $<$<PLATFORM_ID:Windows>:ws2_32>
+)
+
+
+set(installable_targets)
+if(ENABLE_WALLET)
+ add_subdirectory(wallet)
+
+ if(BUILD_WALLET_TOOL)
+ add_executable(bitcoin-wallet
+ bitcoin-wallet.cpp
+ init/bitcoin-wallet.cpp
+ wallet/wallettool.cpp
+ )
+ add_windows_resources(bitcoin-wallet bitcoin-wallet-res.rc)
+ target_link_libraries(bitcoin-wallet
+ core_interface
+ bitcoin_wallet
+ bitcoin_common
+ bitcoin_util
+ Boost::headers
+ )
+ list(APPEND installable_targets bitcoin-wallet)
+ endif()
+endif()
+
+
+# P2P and RPC server functionality used by `bitcoind` and `bitcoin-qt` executables.
+add_library(bitcoin_node STATIC EXCLUDE_FROM_ALL
+ addrdb.cpp
+ addrman.cpp
+ banman.cpp
+ bip324.cpp
+ blockencodings.cpp
+ blockfilter.cpp
+ chain.cpp
+ consensus/tx_verify.cpp
+ dbwrapper.cpp
+ deploymentstatus.cpp
+ flatfile.cpp
+ headerssync.cpp
+ httprpc.cpp
+ httpserver.cpp
+ i2p.cpp
+ index/base.cpp
+ index/blockfilterindex.cpp
+ index/coinstatsindex.cpp
+ index/txindex.cpp
+ init.cpp
+ kernel/chain.cpp
+ kernel/checks.cpp
+ kernel/coinstats.cpp
+ kernel/context.cpp
+ kernel/cs_main.cpp
+ kernel/disconnected_transactions.cpp
+ kernel/mempool_removal_reason.cpp
+ mapport.cpp
+ net.cpp
+ net_processing.cpp
+ netgroup.cpp
+ node/abort.cpp
+ node/blockmanager_args.cpp
+ node/blockstorage.cpp
+ node/caches.cpp
+ node/chainstate.cpp
+ node/chainstatemanager_args.cpp
+ node/coin.cpp
+ node/coins_view_args.cpp
+ node/connection_types.cpp
+ node/context.cpp
+ node/database_args.cpp
+ node/eviction.cpp
+ node/interface_ui.cpp
+ node/interfaces.cpp
+ node/kernel_notifications.cpp
+ node/mempool_args.cpp
+ node/mempool_persist.cpp
+ node/mempool_persist_args.cpp
+ node/miner.cpp
+ node/mini_miner.cpp
+ node/minisketchwrapper.cpp
+ node/peerman_args.cpp
+ node/psbt.cpp
+ node/timeoffsets.cpp
+ node/transaction.cpp
+ node/txreconciliation.cpp
+ node/utxo_snapshot.cpp
+ node/warnings.cpp
+ noui.cpp
+ policy/fees.cpp
+ policy/fees_args.cpp
+ policy/packages.cpp
+ policy/rbf.cpp
+ policy/settings.cpp
+ policy/truc_policy.cpp
+ pow.cpp
+ rest.cpp
+ rpc/blockchain.cpp
+ rpc/fees.cpp
+ rpc/mempool.cpp
+ rpc/mining.cpp
+ rpc/net.cpp
+ rpc/node.cpp
+ rpc/output_script.cpp
+ rpc/rawtransaction.cpp
+ rpc/server.cpp
+ rpc/server_util.cpp
+ rpc/signmessage.cpp
+ rpc/txoutproof.cpp
+ script/sigcache.cpp
+ signet.cpp
+ torcontrol.cpp
+ txdb.cpp
+ txmempool.cpp
+ txorphanage.cpp
+ txrequest.cpp
+ validation.cpp
+ validationinterface.cpp
+ versionbits.cpp
+ $<$<TARGET_EXISTS:bitcoin_wallet>:wallet/init.cpp>
+ $<$<NOT:$<TARGET_EXISTS:bitcoin_wallet>>:dummywallet.cpp>
+)
+target_link_libraries(bitcoin_node
+ PRIVATE
+ core_interface
+ bitcoin_common
+ bitcoin_util
+ leveldb
+ minisketch
+ univalue
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:libevent::libevent>
+ $<TARGET_NAME_IF_EXISTS:libevent::pthreads>
+ $<TARGET_NAME_IF_EXISTS:NATPMP::NATPMP>
+ $<TARGET_NAME_IF_EXISTS:MiniUPnPc::MiniUPnPc>
+ $<TARGET_NAME_IF_EXISTS:bitcoin_zmq>
+ $<TARGET_NAME_IF_EXISTS:USDT::headers>
+)
+
+
+# Bitcoin Core bitcoind.
+if(BUILD_DAEMON)
+ add_executable(bitcoind
+ bitcoind.cpp
+ init/bitcoind.cpp
+ )
+ add_windows_resources(bitcoind bitcoind-res.rc)
+ target_link_libraries(bitcoind
+ core_interface
+ bitcoin_node
+ $<TARGET_NAME_IF_EXISTS:bitcoin_wallet>
+ )
+ list(APPEND installable_targets bitcoind)
+endif()
+if(WITH_MULTIPROCESS)
+ add_executable(bitcoin-node
+ bitcoind.cpp
+ init/bitcoin-node.cpp
+ )
+ target_link_libraries(bitcoin-node
+ core_interface
+ bitcoin_node
+ bitcoin_ipc
+ $<TARGET_NAME_IF_EXISTS:bitcoin_wallet>
+ )
+ list(APPEND installable_targets bitcoin-node)
+endif()
+
+
+add_library(bitcoin_cli STATIC EXCLUDE_FROM_ALL
+ compat/stdin.cpp
+ rpc/client.cpp
+)
+target_link_libraries(bitcoin_cli
+ PUBLIC
+ core_interface
+ univalue
+)
+
+
+# Bitcoin Core RPC client
+if(BUILD_CLI)
+ add_executable(bitcoin-cli bitcoin-cli.cpp)
+ add_windows_resources(bitcoin-cli bitcoin-cli-res.rc)
+ target_link_libraries(bitcoin-cli
+ core_interface
+ bitcoin_cli
+ bitcoin_common
+ bitcoin_util
+ $<TARGET_NAME_IF_EXISTS:libevent::libevent>
+ )
+ list(APPEND installable_targets bitcoin-cli)
+endif()
+
+
+if(BUILD_TX)
+ add_executable(bitcoin-tx bitcoin-tx.cpp)
+ add_windows_resources(bitcoin-tx bitcoin-tx-res.rc)
+ target_link_libraries(bitcoin-tx
+ core_interface
+ bitcoin_common
+ bitcoin_util
+ univalue
+ )
+ list(APPEND installable_targets bitcoin-tx)
+endif()
+
+
+if(BUILD_UTIL)
+ add_executable(bitcoin-util bitcoin-util.cpp)
+ add_windows_resources(bitcoin-util bitcoin-util-res.rc)
+ target_link_libraries(bitcoin-util
+ core_interface
+ bitcoin_common
+ bitcoin_util
+ )
+ list(APPEND installable_targets bitcoin-util)
+endif()
+
+
+if(BUILD_GUI)
+ add_subdirectory(qt)
+endif()
+
+
+if(BUILD_KERNEL_LIB)
+ add_subdirectory(kernel)
+endif()
+
+if(BUILD_UTIL_CHAINSTATE)
+ add_executable(bitcoin-chainstate
+ bitcoin-chainstate.cpp
+ )
+ # TODO: The `SKIP_BUILD_RPATH` property setting can be deleted
+ # in the future after reordering Guix script commands to
+ # perform binary checks after the installation step.
+ # Relevant discussions:
+ # - https://github.com/hebasto/bitcoin/pull/236#issuecomment-2183120953
+ # - https://github.com/bitcoin/bitcoin/pull/30312#issuecomment-2191235833
+ set_target_properties(bitcoin-chainstate PROPERTIES
+ SKIP_BUILD_RPATH OFF
+ )
+ target_link_libraries(bitcoin-chainstate
+ PRIVATE
+ core_interface
+ bitcoinkernel
+ )
+endif()
+
+
+add_subdirectory(test/util)
+if(BUILD_BENCH)
+ add_subdirectory(bench)
+endif()
+
+if(BUILD_TESTS)
+ add_subdirectory(test)
+endif()
+
+if(BUILD_FUZZ_BINARY)
+ add_subdirectory(test/fuzz)
+endif()
+
+
+install(TARGETS ${installable_targets}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+unset(installable_targets)
+
+if(INSTALL_MAN)
+ # TODO: these stubs are no longer needed. man pages should be generated at install time.
+ install(DIRECTORY ../doc/man/
+ DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
+ FILES_MATCHING PATTERN *.1
+ )
+endif()
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644
index 1ccb5332c4..0000000000
--- a/src/Makefile.am
+++ /dev/null
@@ -1,1133 +0,0 @@
-# Copyright (c) 2013-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-# Pattern rule to print variables, e.g. make print-top_srcdir
-print-%: FORCE
- @echo '$*'='$($*)'
-
-DIST_SUBDIRS = secp256k1
-
-AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS)
-AM_CXXFLAGS = $(CORE_CXXFLAGS) $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_CXXFLAGS) $(SANITIZER_CXXFLAGS)
-AM_OBJCXXFLAGS = $(AM_CXXFLAGS)
-AM_CPPFLAGS = $(DEBUG_CPPFLAGS) $(HARDENED_CPPFLAGS) $(CORE_CPPFLAGS)
-AM_LIBTOOLFLAGS = --preserve-dup-deps
-PTHREAD_FLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
-EXTRA_LIBRARIES =
-
-lib_LTLIBRARIES =
-noinst_LTLIBRARIES =
-
-bin_PROGRAMS =
-noinst_PROGRAMS =
-check_PROGRAMS =
-TESTS =
-BENCHMARKS =
-
-BITCOIN_INCLUDES=-I$(builddir) -I$(srcdir)/$(MINISKETCH_INCLUDE_DIR_INT) -I$(srcdir)/secp256k1/include -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT)
-
-LIBBITCOIN_NODE=libbitcoin_node.a
-LIBBITCOIN_COMMON=libbitcoin_common.a
-LIBBITCOIN_CONSENSUS=libbitcoin_consensus.a
-LIBBITCOIN_CLI=libbitcoin_cli.a
-LIBBITCOIN_UTIL=libbitcoin_util.a
-LIBBITCOIN_CRYPTO_BASE=crypto/libbitcoin_crypto_base.la
-LIBBITCOINQT=qt/libbitcoinqt.a
-LIBSECP256K1=secp256k1/libsecp256k1.la
-
-if ENABLE_ZMQ
-LIBBITCOIN_ZMQ=libbitcoin_zmq.a
-endif
-if BUILD_BITCOIN_KERNEL_LIB
-LIBBITCOINKERNEL=libbitcoinkernel.la
-endif
-if ENABLE_WALLET
-LIBBITCOIN_WALLET=libbitcoin_wallet.a
-LIBBITCOIN_WALLET_TOOL=libbitcoin_wallet_tool.a
-endif
-
-LIBBITCOIN_CRYPTO = $(LIBBITCOIN_CRYPTO_BASE)
-if ENABLE_SSE41
-LIBBITCOIN_CRYPTO_SSE41 = crypto/libbitcoin_crypto_sse41.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_SSE41)
-if ENABLE_X86_SHANI
-LIBBITCOIN_CRYPTO_X86_SHANI = crypto/libbitcoin_crypto_x86_shani.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_X86_SHANI)
-endif
-endif
-if ENABLE_AVX2
-LIBBITCOIN_CRYPTO_AVX2 = crypto/libbitcoin_crypto_avx2.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_AVX2)
-endif
-if ENABLE_ARM_SHANI
-LIBBITCOIN_CRYPTO_ARM_SHANI = crypto/libbitcoin_crypto_arm_shani.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_ARM_SHANI)
-endif
-noinst_LTLIBRARIES += $(LIBBITCOIN_CRYPTO)
-
-$(LIBSECP256K1): $(wildcard secp256k1/src/*.h) $(wildcard secp256k1/src/*.c) $(wildcard secp256k1/include/*)
- $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F)
-
-# Make is not made aware of per-object dependencies to avoid limiting building parallelization
-# But to build the less dependent modules first, we manually select their order here:
-EXTRA_LIBRARIES += \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_NODE) \
- $(LIBBITCOIN_CLI) \
- $(LIBBITCOIN_IPC) \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_WALLET_TOOL) \
- $(LIBBITCOIN_ZMQ)
-
-if BUILD_BITCOIND
- bin_PROGRAMS += bitcoind
-endif
-
-if BUILD_BITCOIN_NODE
- bin_PROGRAMS += bitcoin-node
-endif
-
-if BUILD_BITCOIN_CLI
- bin_PROGRAMS += bitcoin-cli
-endif
-
-if BUILD_BITCOIN_TX
- bin_PROGRAMS += bitcoin-tx
-endif
-
-if ENABLE_WALLET
-if BUILD_BITCOIN_WALLET
- bin_PROGRAMS += bitcoin-wallet
-endif
-endif
-
-if BUILD_BITCOIN_UTIL
- bin_PROGRAMS += bitcoin-util
-endif
-
-if BUILD_BITCOIN_CHAINSTATE
- bin_PROGRAMS += bitcoin-chainstate
-endif
-
-.PHONY: FORCE check-symbols check-security
-# bitcoin core #
-BITCOIN_CORE_H = \
- addresstype.h \
- addrdb.h \
- addrman.h \
- addrman_impl.h \
- attributes.h \
- banman.h \
- base58.h \
- bech32.h \
- bip324.h \
- blockencodings.h \
- blockfilter.h \
- chain.h \
- chainparams.h \
- chainparamsbase.h \
- chainparamsseeds.h \
- checkqueue.h \
- clientversion.h \
- cluster_linearize.h \
- coins.h \
- common/args.h \
- common/bloom.h \
- common/init.h \
- common/run_command.h \
- common/types.h \
- common/url.h \
- compat/assumptions.h \
- compat/byteswap.h \
- compat/compat.h \
- compat/cpuid.h \
- compat/endian.h \
- common/messages.h \
- common/settings.h \
- common/signmessage.h \
- common/system.h \
- compressor.h \
- consensus/consensus.h \
- consensus/tx_check.h \
- consensus/tx_verify.h \
- core_io.h \
- core_memusage.h \
- cuckoocache.h \
- dbwrapper.h \
- deploymentinfo.h \
- deploymentstatus.h \
- external_signer.h \
- flatfile.h \
- headerssync.h \
- httprpc.h \
- httpserver.h \
- i2p.h \
- index/base.h \
- index/blockfilterindex.h \
- index/coinstatsindex.h \
- index/disktxpos.h \
- index/txindex.h \
- indirectmap.h \
- init.h \
- init/common.h \
- interfaces/chain.h \
- interfaces/echo.h \
- interfaces/handler.h \
- interfaces/init.h \
- interfaces/ipc.h \
- interfaces/mining.h \
- interfaces/node.h \
- interfaces/wallet.h \
- kernel/blockmanager_opts.h \
- kernel/chain.h \
- kernel/chainparams.h \
- kernel/chainstatemanager_opts.h \
- kernel/checks.h \
- kernel/coinstats.h \
- kernel/context.h \
- kernel/cs_main.h \
- kernel/disconnected_transactions.h \
- kernel/mempool_entry.h \
- kernel/mempool_limits.h \
- kernel/mempool_options.h \
- kernel/mempool_removal_reason.h \
- kernel/messagestartchars.h \
- kernel/notifications_interface.h \
- kernel/warning.h \
- key.h \
- key_io.h \
- logging.h \
- logging/timer.h \
- mapport.h \
- memusage.h \
- merkleblock.h \
- net.h \
- net_permissions.h \
- net_processing.h \
- net_types.h \
- netaddress.h \
- netbase.h \
- netgroup.h \
- netmessagemaker.h \
- node/abort.h \
- node/blockmanager_args.h \
- node/blockstorage.h \
- node/caches.h \
- node/chainstate.h \
- node/chainstatemanager_args.h \
- node/coin.h \
- node/coins_view_args.h \
- node/connection_types.h \
- node/context.h \
- node/database_args.h \
- node/eviction.h \
- node/interface_ui.h \
- node/kernel_notifications.h \
- node/mempool_args.h \
- node/mempool_persist.h \
- node/mempool_persist_args.h \
- node/miner.h \
- node/mini_miner.h \
- node/minisketchwrapper.h \
- node/peerman_args.h \
- node/protocol_version.h \
- node/psbt.h \
- node/timeoffsets.h \
- node/transaction.h \
- node/txreconciliation.h \
- node/types.h \
- node/utxo_snapshot.h \
- node/warnings.h \
- noui.h \
- outputtype.h \
- policy/feerate.h \
- policy/fees.h \
- policy/fees_args.h \
- policy/packages.h \
- policy/policy.h \
- policy/rbf.h \
- policy/settings.h \
- policy/truc_policy.h \
- pow.h \
- protocol.h \
- psbt.h \
- random.h \
- randomenv.h \
- rest.h \
- rpc/blockchain.h \
- rpc/client.h \
- rpc/mempool.h \
- rpc/mining.h \
- rpc/protocol.h \
- rpc/rawtransaction_util.h \
- rpc/register.h \
- rpc/request.h \
- rpc/server.h \
- rpc/server_util.h \
- rpc/util.h \
- scheduler.h \
- script/descriptor.h \
- script/keyorigin.h \
- script/miniscript.h \
- script/parsing.h \
- script/sigcache.h \
- script/sign.h \
- script/signingprovider.h \
- script/solver.h \
- signet.h \
- streams.h \
- support/allocators/pool.h \
- support/allocators/secure.h \
- support/allocators/zeroafterfree.h \
- support/cleanse.h \
- support/events.h \
- support/lockedpool.h \
- sync.h \
- threadsafety.h \
- torcontrol.h \
- txdb.h \
- txmempool.h \
- txorphanage.h \
- txrequest.h \
- undo.h \
- util/any.h \
- util/asmap.h \
- util/batchpriority.h \
- util/bip32.h \
- util/bitdeque.h \
- util/bitset.h \
- util/bytevectorhash.h \
- util/chaintype.h \
- util/check.h \
- util/epochguard.h \
- util/exception.h \
- util/fastrange.h \
- util/feefrac.h \
- util/fs.h \
- util/fs_helpers.h \
- util/golombrice.h \
- util/hash_type.h \
- util/hasher.h \
- util/insert.h \
- util/macros.h \
- util/moneystr.h \
- util/overflow.h \
- util/overloaded.h \
- util/rbf.h \
- util/readwritefile.h \
- util/result.h \
- util/serfloat.h \
- util/signalinterrupt.h \
- util/sock.h \
- util/strencodings.h \
- util/string.h \
- util/subprocess.h \
- util/syserror.h \
- util/task_runner.h \
- util/thread.h \
- util/threadinterrupt.h \
- util/threadnames.h \
- util/time.h \
- util/tokenpipe.h \
- util/trace.h \
- util/transaction_identifier.h \
- util/translation.h \
- util/types.h \
- util/ui_change_type.h \
- util/vecdeque.h \
- util/vector.h \
- validation.h \
- validationinterface.h \
- versionbits.h \
- wallet/bdb.h \
- wallet/coincontrol.h \
- wallet/coinselection.h \
- wallet/context.h \
- wallet/crypter.h \
- wallet/db.h \
- wallet/dump.h \
- wallet/external_signer_scriptpubkeyman.h \
- wallet/feebumper.h \
- wallet/fees.h \
- wallet/load.h \
- wallet/migrate.h \
- wallet/receive.h \
- wallet/rpc/util.h \
- wallet/rpc/wallet.h \
- wallet/salvage.h \
- wallet/scriptpubkeyman.h \
- wallet/spend.h \
- wallet/sqlite.h \
- wallet/transaction.h \
- wallet/types.h \
- wallet/wallet.h \
- wallet/walletdb.h \
- wallet/wallettool.h \
- wallet/walletutil.h \
- walletinitinterface.h \
- zmq/zmqabstractnotifier.h \
- zmq/zmqnotificationinterface.h \
- zmq/zmqpublishnotifier.h \
- zmq/zmqrpc.h \
- zmq/zmqutil.h
-
-
-obj/build.h: FORCE
- @$(MKDIR_P) $(builddir)/obj
- $(AM_V_GEN) $(top_srcdir)/share/genbuild.sh "$(abs_top_builddir)/src/obj/build.h" \
- "$(abs_top_srcdir)"
-libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h
-
-# node #
-libbitcoin_node_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(LEVELDB_CPPFLAGS) $(BOOST_CPPFLAGS) $(MINIUPNPC_CPPFLAGS) $(NATPMP_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS)
-libbitcoin_node_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_node_a_SOURCES = \
- addrdb.cpp \
- addrman.cpp \
- banman.cpp \
- bip324.cpp \
- blockencodings.cpp \
- blockfilter.cpp \
- chain.cpp \
- consensus/tx_verify.cpp \
- dbwrapper.cpp \
- deploymentstatus.cpp \
- flatfile.cpp \
- headerssync.cpp \
- httprpc.cpp \
- httpserver.cpp \
- i2p.cpp \
- index/base.cpp \
- index/blockfilterindex.cpp \
- index/coinstatsindex.cpp \
- index/txindex.cpp \
- init.cpp \
- kernel/chain.cpp \
- kernel/checks.cpp \
- kernel/coinstats.cpp \
- kernel/context.cpp \
- kernel/cs_main.cpp \
- kernel/disconnected_transactions.cpp \
- kernel/mempool_removal_reason.cpp \
- mapport.cpp \
- net.cpp \
- net_processing.cpp \
- netgroup.cpp \
- node/abort.cpp \
- node/blockmanager_args.cpp \
- node/blockstorage.cpp \
- node/caches.cpp \
- node/chainstate.cpp \
- node/chainstatemanager_args.cpp \
- node/coin.cpp \
- node/coins_view_args.cpp \
- node/connection_types.cpp \
- node/context.cpp \
- node/database_args.cpp \
- node/eviction.cpp \
- node/interface_ui.cpp \
- node/interfaces.cpp \
- node/kernel_notifications.cpp \
- node/mempool_args.cpp \
- node/mempool_persist.cpp \
- node/mempool_persist_args.cpp \
- node/miner.cpp \
- node/mini_miner.cpp \
- node/minisketchwrapper.cpp \
- node/peerman_args.cpp \
- node/psbt.cpp \
- node/timeoffsets.cpp \
- node/transaction.cpp \
- node/txreconciliation.cpp \
- node/utxo_snapshot.cpp \
- node/warnings.cpp \
- noui.cpp \
- policy/fees.cpp \
- policy/fees_args.cpp \
- policy/packages.cpp \
- policy/rbf.cpp \
- policy/settings.cpp \
- policy/truc_policy.cpp \
- pow.cpp \
- rest.cpp \
- rpc/blockchain.cpp \
- rpc/fees.cpp \
- rpc/mempool.cpp \
- rpc/mining.cpp \
- rpc/net.cpp \
- rpc/node.cpp \
- rpc/output_script.cpp \
- rpc/rawtransaction.cpp \
- rpc/server.cpp \
- rpc/server_util.cpp \
- rpc/signmessage.cpp \
- rpc/txoutproof.cpp \
- script/sigcache.cpp \
- signet.cpp \
- torcontrol.cpp \
- txdb.cpp \
- txmempool.cpp \
- txorphanage.cpp \
- txrequest.cpp \
- validation.cpp \
- validationinterface.cpp \
- versionbits.cpp \
- $(BITCOIN_CORE_H)
-
-if ENABLE_WALLET
-libbitcoin_node_a_SOURCES += wallet/init.cpp
-libbitcoin_node_a_CPPFLAGS += $(BDB_CPPFLAGS)
-endif
-if !ENABLE_WALLET
-libbitcoin_node_a_SOURCES += dummywallet.cpp
-endif
-#
-
-# zmq #
-if ENABLE_ZMQ
-libbitcoin_zmq_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(ZMQ_CFLAGS)
-libbitcoin_zmq_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_zmq_a_SOURCES = \
- zmq/zmqabstractnotifier.cpp \
- zmq/zmqnotificationinterface.cpp \
- zmq/zmqpublishnotifier.cpp \
- zmq/zmqrpc.cpp \
- zmq/zmqutil.cpp
-endif
-#
-
-# wallet #
-libbitcoin_wallet_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(BDB_CPPFLAGS) $(SQLITE_CFLAGS)
-libbitcoin_wallet_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_wallet_a_SOURCES = \
- wallet/coincontrol.cpp \
- wallet/context.cpp \
- wallet/crypter.cpp \
- wallet/db.cpp \
- wallet/dump.cpp \
- wallet/external_signer_scriptpubkeyman.cpp \
- wallet/feebumper.cpp \
- wallet/fees.cpp \
- wallet/interfaces.cpp \
- wallet/load.cpp \
- wallet/migrate.cpp \
- wallet/receive.cpp \
- wallet/rpc/addresses.cpp \
- wallet/rpc/backup.cpp \
- wallet/rpc/coins.cpp \
- wallet/rpc/encrypt.cpp \
- wallet/rpc/spend.cpp \
- wallet/rpc/signmessage.cpp \
- wallet/rpc/transactions.cpp \
- wallet/rpc/util.cpp \
- wallet/rpc/wallet.cpp \
- wallet/scriptpubkeyman.cpp \
- wallet/spend.cpp \
- wallet/transaction.cpp \
- wallet/wallet.cpp \
- wallet/walletdb.cpp \
- wallet/walletutil.cpp \
- wallet/coinselection.cpp \
- $(BITCOIN_CORE_H)
-
-if USE_SQLITE
-libbitcoin_wallet_a_SOURCES += wallet/sqlite.cpp
-endif
-if USE_BDB
-libbitcoin_wallet_a_SOURCES += wallet/bdb.cpp wallet/salvage.cpp
-endif
-#
-
-# wallet tool #
-libbitcoin_wallet_tool_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libbitcoin_wallet_tool_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_wallet_tool_a_SOURCES = \
- wallet/wallettool.cpp \
- $(BITCOIN_CORE_H)
-#
-
-# crypto #
-
-# crypto_base contains the unspecialized (unoptimized) versions of our
-# crypto functions. Functions that require custom compiler flags and/or
-# runtime opt-in are omitted.
-crypto_libbitcoin_crypto_base_la_CPPFLAGS = $(AM_CPPFLAGS)
-
-# Specify -static in both CXXFLAGS and LDFLAGS so libtool will only build a
-# static version of this library. We don't need a dynamic version, and a dynamic
-# version can't be used on windows anyway because the library doesn't currently
-# export DLL symbols.
-crypto_libbitcoin_crypto_base_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_base_la_LDFLAGS = $(AM_LDFLAGS) -static
-
-crypto_libbitcoin_crypto_base_la_SOURCES = \
- crypto/aes.cpp \
- crypto/aes.h \
- crypto/chacha20.h \
- crypto/chacha20.cpp \
- crypto/chacha20poly1305.h \
- crypto/chacha20poly1305.cpp \
- crypto/common.h \
- crypto/hex_base.cpp \
- crypto/hex_base.h \
- crypto/hkdf_sha256_32.cpp \
- crypto/hkdf_sha256_32.h \
- crypto/hmac_sha256.cpp \
- crypto/hmac_sha256.h \
- crypto/hmac_sha512.cpp \
- crypto/hmac_sha512.h \
- crypto/poly1305.h \
- crypto/poly1305.cpp \
- crypto/muhash.h \
- crypto/muhash.cpp \
- crypto/ripemd160.cpp \
- crypto/ripemd160.h \
- crypto/sha1.cpp \
- crypto/sha1.h \
- crypto/sha256.cpp \
- crypto/sha256.h \
- crypto/sha256_sse4.cpp \
- crypto/sha3.cpp \
- crypto/sha3.h \
- crypto/sha512.cpp \
- crypto/sha512.h \
- crypto/siphash.cpp \
- crypto/siphash.h \
- support/cleanse.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
-crypto_libbitcoin_crypto_sse41_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_sse41_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_sse41_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_sse41_la_CXXFLAGS += $(SSE41_CXXFLAGS)
-crypto_libbitcoin_crypto_sse41_la_CPPFLAGS += -DENABLE_SSE41
-crypto_libbitcoin_crypto_sse41_la_SOURCES = crypto/sha256_sse41.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
-crypto_libbitcoin_crypto_avx2_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_avx2_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_avx2_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_avx2_la_CXXFLAGS += $(AVX2_CXXFLAGS)
-crypto_libbitcoin_crypto_avx2_la_CPPFLAGS += -DENABLE_AVX2
-crypto_libbitcoin_crypto_avx2_la_SOURCES = crypto/sha256_avx2.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
-crypto_libbitcoin_crypto_x86_shani_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_x86_shani_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_x86_shani_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_x86_shani_la_CXXFLAGS += $(X86_SHANI_CXXFLAGS)
-crypto_libbitcoin_crypto_x86_shani_la_CPPFLAGS += -DENABLE_SSE41 -DENABLE_X86_SHANI
-crypto_libbitcoin_crypto_x86_shani_la_SOURCES = crypto/sha256_x86_shani.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
-crypto_libbitcoin_crypto_arm_shani_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_arm_shani_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_arm_shani_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_arm_shani_la_CXXFLAGS += $(ARM_SHANI_CXXFLAGS)
-crypto_libbitcoin_crypto_arm_shani_la_CPPFLAGS += -DENABLE_ARM_SHANI
-crypto_libbitcoin_crypto_arm_shani_la_SOURCES = crypto/sha256_arm_shani.cpp
-#
-
-# consensus #
-libbitcoin_consensus_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-libbitcoin_consensus_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_consensus_a_SOURCES = \
- arith_uint256.cpp \
- arith_uint256.h \
- consensus/amount.h \
- consensus/merkle.cpp \
- consensus/merkle.h \
- consensus/params.h \
- consensus/tx_check.cpp \
- consensus/validation.h \
- hash.cpp \
- hash.h \
- prevector.h \
- primitives/block.cpp \
- primitives/block.h \
- primitives/transaction.cpp \
- primitives/transaction.h \
- pubkey.cpp \
- pubkey.h \
- script/interpreter.cpp \
- script/interpreter.h \
- script/script.cpp \
- script/script.h \
- script/script_error.cpp \
- script/script_error.h \
- serialize.h \
- span.h \
- tinyformat.h \
- uint256.cpp \
- uint256.h
-#
-
-# common #
-libbitcoin_common_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libbitcoin_common_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_common_a_SOURCES = \
- addresstype.cpp \
- base58.cpp \
- bech32.cpp \
- chainparamsbase.cpp \
- chainparams.cpp \
- coins.cpp \
- common/args.cpp \
- common/bloom.cpp \
- common/config.cpp \
- common/init.cpp \
- common/interfaces.cpp \
- common/messages.cpp \
- common/run_command.cpp \
- common/settings.cpp \
- common/signmessage.cpp \
- common/system.cpp \
- common/url.cpp \
- compressor.cpp \
- core_read.cpp \
- core_write.cpp \
- deploymentinfo.cpp \
- external_signer.cpp \
- init/common.cpp \
- kernel/chainparams.cpp \
- key.cpp \
- key_io.cpp \
- merkleblock.cpp \
- net_types.cpp \
- netaddress.cpp \
- netbase.cpp \
- net_permissions.cpp \
- outputtype.cpp \
- policy/feerate.cpp \
- policy/policy.cpp \
- protocol.cpp \
- psbt.cpp \
- rpc/external_signer.cpp \
- rpc/rawtransaction_util.cpp \
- rpc/request.cpp \
- rpc/util.cpp \
- scheduler.cpp \
- script/descriptor.cpp \
- script/miniscript.cpp \
- script/parsing.cpp \
- script/sign.cpp \
- script/signingprovider.cpp \
- script/solver.cpp \
- $(BITCOIN_CORE_H)
-#
-
-# util #
-libbitcoin_util_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-libbitcoin_util_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_util_a_SOURCES = \
- support/lockedpool.cpp \
- clientversion.cpp \
- logging.cpp \
- random.cpp \
- randomenv.cpp \
- streams.cpp \
- sync.cpp \
- util/asmap.cpp \
- util/batchpriority.cpp \
- util/bip32.cpp \
- util/bytevectorhash.cpp \
- util/chaintype.cpp \
- util/check.cpp \
- util/exception.cpp \
- util/feefrac.cpp \
- util/fs.cpp \
- util/fs_helpers.cpp \
- util/hasher.cpp \
- util/sock.cpp \
- util/syserror.cpp \
- util/moneystr.cpp \
- util/rbf.cpp \
- util/readwritefile.cpp \
- util/signalinterrupt.cpp \
- util/thread.cpp \
- util/threadinterrupt.cpp \
- util/threadnames.cpp \
- util/serfloat.cpp \
- util/strencodings.cpp \
- util/string.cpp \
- util/time.cpp \
- util/tokenpipe.cpp \
- $(BITCOIN_CORE_H)
-#
-
-# cli #
-libbitcoin_cli_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-libbitcoin_cli_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_cli_a_SOURCES = \
- compat/stdin.h \
- compat/stdin.cpp \
- rpc/client.cpp \
- $(BITCOIN_CORE_H)
-
-nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h
-#
-
-# bitcoind & bitcoin-node binaries #
-bitcoin_daemon_sources = bitcoind.cpp
-bitcoin_bin_cppflags = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-bitcoin_bin_cxxflags = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bitcoin_bin_ldflags = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-if TARGET_WINDOWS
-bitcoin_daemon_sources += bitcoind-res.rc
-endif
-
-bitcoin_bin_ldadd = \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_ZMQ) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBLEVELDB) \
- $(LIBMEMENV) \
- $(LIBSECP256K1)
-
-bitcoin_bin_ldadd += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(SQLITE_LIBS)
-
-bitcoind_SOURCES = $(bitcoin_daemon_sources) init/bitcoind.cpp
-bitcoind_CPPFLAGS = $(bitcoin_bin_cppflags)
-bitcoind_CXXFLAGS = $(bitcoin_bin_cxxflags)
-bitcoind_LDFLAGS = $(bitcoin_bin_ldflags)
-bitcoind_LDADD = $(LIBBITCOIN_NODE) $(bitcoin_bin_ldadd)
-
-bitcoin_node_SOURCES = $(bitcoin_daemon_sources) init/bitcoin-node.cpp
-bitcoin_node_CPPFLAGS = $(bitcoin_bin_cppflags)
-bitcoin_node_CXXFLAGS = $(bitcoin_bin_cxxflags)
-bitcoin_node_LDFLAGS = $(bitcoin_bin_ldflags)
-bitcoin_node_LDADD = $(LIBBITCOIN_NODE) $(bitcoin_bin_ldadd) $(LIBBITCOIN_IPC) $(LIBMULTIPROCESS_LIBS)
-
-# bitcoin-cli binary #
-bitcoin_cli_SOURCES = bitcoin-cli.cpp
-bitcoin_cli_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS)
-bitcoin_cli_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-if TARGET_WINDOWS
-bitcoin_cli_SOURCES += bitcoin-cli-res.rc
-endif
-
-bitcoin_cli_LDADD = \
- $(LIBBITCOIN_CLI) \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CRYPTO)
-
-bitcoin_cli_LDADD += $(EVENT_LIBS)
-#
-
-# bitcoin-tx binary #
-bitcoin_tx_SOURCES = bitcoin-tx.cpp
-bitcoin_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-bitcoin_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-if TARGET_WINDOWS
-bitcoin_tx_SOURCES += bitcoin-tx-res.rc
-endif
-
-bitcoin_tx_LDADD = \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBSECP256K1)
-#
-
-# bitcoin-wallet binary #
-bitcoin_wallet_SOURCES = bitcoin-wallet.cpp
-bitcoin_wallet_SOURCES += init/bitcoin-wallet.cpp
-bitcoin_wallet_CPPFLAGS = $(bitcoin_bin_cppflags)
-bitcoin_wallet_CXXFLAGS = $(bitcoin_bin_cxxflags)
-bitcoin_wallet_LDFLAGS = $(bitcoin_bin_ldflags)
-bitcoin_wallet_LDADD = \
- $(LIBBITCOIN_WALLET_TOOL) \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBSECP256K1) \
- $(BDB_LIBS) \
- $(SQLITE_LIBS)
-
-if TARGET_WINDOWS
-bitcoin_wallet_SOURCES += bitcoin-wallet-res.rc
-endif
-#
-
-# bitcoin-util binary #
-bitcoin_util_SOURCES = bitcoin-util.cpp
-bitcoin_util_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-bitcoin_util_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bitcoin_util_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-if TARGET_WINDOWS
-bitcoin_util_SOURCES += bitcoin-util-res.rc
-endif
-
-bitcoin_util_LDADD = \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBSECP256K1)
-#
-
-# bitcoin-chainstate binary #
-bitcoin_chainstate_SOURCES = bitcoin-chainstate.cpp
-bitcoin_chainstate_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-bitcoin_chainstate_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-
-bitcoin_chainstate_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(PTHREAD_FLAGS) $(LIBTOOL_APP_LDFLAGS) -static
-bitcoin_chainstate_LDADD = $(LIBBITCOINKERNEL)
-
-# libtool is unable to calculate this indirect dependency, presumably because it's a subproject.
-# libsecp256k1 only needs to be linked in when libbitcoinkernel is static.
-bitcoin_chainstate_LDADD += $(LIBSECP256K1)
-#
-
-# bitcoinkernel library #
-if BUILD_BITCOIN_KERNEL_LIB
-lib_LTLIBRARIES += $(LIBBITCOINKERNEL)
-
-libbitcoinkernel_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS) $(PTHREAD_FLAGS)
-libbitcoinkernel_la_LIBADD = $(LIBBITCOIN_CRYPTO) $(LIBLEVELDB) $(LIBMEMENV) $(LIBSECP256K1)
-libbitcoinkernel_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS)
-
-# libbitcoinkernel requires default symbol visibility, explicitly specify that
-# here so that things still work even when user configures with
-# --enable-reduce-exports
-#
-# Note this is a quick hack that will be removed as we incrementally define what
-# to export from the library.
-libbitcoinkernel_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -fvisibility=default
-
-# TODO: libbitcoinkernel is a work in progress consensus engine library, as more
-# and more modules are decoupled from the consensus engine, this list will
-# shrink to only those which are absolutely necessary.
-libbitcoinkernel_la_SOURCES = \
- kernel/bitcoinkernel.cpp \
- arith_uint256.cpp \
- chain.cpp \
- clientversion.cpp \
- coins.cpp \
- compressor.cpp \
- consensus/merkle.cpp \
- consensus/tx_check.cpp \
- consensus/tx_verify.cpp \
- core_read.cpp \
- dbwrapper.cpp \
- deploymentinfo.cpp \
- deploymentstatus.cpp \
- flatfile.cpp \
- hash.cpp \
- kernel/chain.cpp \
- kernel/checks.cpp \
- kernel/chainparams.cpp \
- kernel/coinstats.cpp \
- kernel/context.cpp \
- kernel/cs_main.cpp \
- kernel/disconnected_transactions.cpp \
- kernel/mempool_removal_reason.cpp \
- logging.cpp \
- node/blockstorage.cpp \
- node/chainstate.cpp \
- node/utxo_snapshot.cpp \
- policy/feerate.cpp \
- policy/packages.cpp \
- policy/policy.cpp \
- policy/rbf.cpp \
- policy/settings.cpp \
- policy/truc_policy.cpp \
- pow.cpp \
- primitives/block.cpp \
- primitives/transaction.cpp \
- pubkey.cpp \
- random.cpp \
- randomenv.cpp \
- script/interpreter.cpp \
- script/script.cpp \
- script/script_error.cpp \
- script/sigcache.cpp \
- script/solver.cpp \
- signet.cpp \
- streams.cpp \
- support/lockedpool.cpp \
- sync.cpp \
- txdb.cpp \
- txmempool.cpp \
- uint256.cpp \
- util/chaintype.cpp \
- util/check.cpp \
- util/feefrac.cpp \
- util/fs.cpp \
- util/fs_helpers.cpp \
- util/hasher.cpp \
- util/moneystr.cpp \
- util/rbf.cpp \
- util/serfloat.cpp \
- util/signalinterrupt.cpp \
- util/strencodings.cpp \
- util/string.cpp \
- util/syserror.cpp \
- util/threadnames.cpp \
- util/time.cpp \
- util/tokenpipe.cpp \
- validation.cpp \
- validationinterface.cpp \
- versionbits.cpp
-
-# Required for obj/build.h to be generated first.
-# More details: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html
-libbitcoinkernel_la-clientversion.l$(OBJEXT): obj/build.h
-endif # BUILD_BITCOIN_KERNEL_LIB
-#
-
-CTAES_DIST = crypto/ctaes/bench.c
-CTAES_DIST += crypto/ctaes/ctaes.c
-CTAES_DIST += crypto/ctaes/ctaes.h
-CTAES_DIST += crypto/ctaes/README.md
-CTAES_DIST += crypto/ctaes/test.c
-
-CLEANFILES = $(EXTRA_LIBRARIES)
-
-CLEANFILES += *.gcda *.gcno
-CLEANFILES += compat/*.gcda compat/*.gcno
-CLEANFILES += consensus/*.gcda consensus/*.gcno
-CLEANFILES += crc32c/src/*.gcda crc32c/src/*.gcno
-CLEANFILES += crypto/*.gcda crypto/*.gcno
-CLEANFILES += index/*.gcda index/*.gcno
-CLEANFILES += interfaces/*.gcda interfaces/*.gcno
-CLEANFILES += node/*.gcda node/*.gcno
-CLEANFILES += policy/*.gcda policy/*.gcno
-CLEANFILES += primitives/*.gcda primitives/*.gcno
-CLEANFILES += rpc/*.gcda rpc/*.gcno
-CLEANFILES += script/*.gcda script/*.gcno
-CLEANFILES += support/*.gcda support/*.gcno
-CLEANFILES += univalue/*.gcda univalue/*.gcno
-CLEANFILES += util/*.gcda util/*.gcno
-CLEANFILES += wallet/*.gcda wallet/*.gcno
-CLEANFILES += wallet/test/*.gcda wallet/test/*.gcno
-CLEANFILES += zmq/*.gcda zmq/*.gcno
-CLEANFILES += obj/build.h
-
-EXTRA_DIST = $(CTAES_DIST)
-
-
-config/bitcoin-config.h: config/stamp-h1
- @$(MAKE) -C $(top_builddir) $(subdir)/$(@)
-config/stamp-h1: $(top_srcdir)/$(subdir)/config/bitcoin-config.h.in $(top_builddir)/config.status
- $(AM_V_at)$(MAKE) -C $(top_builddir) $(subdir)/$(@)
-$(top_srcdir)/$(subdir)/config/bitcoin-config.h.in: $(am__configure_deps)
- $(AM_V_at)$(MAKE) -C $(top_srcdir) $(subdir)/config/bitcoin-config.h.in
-
-clean-local:
- -$(MAKE) -C secp256k1 clean
- -rm -f leveldb/*/*.gcda leveldb/*/*.gcno leveldb/helpers/memenv/*.gcda leveldb/helpers/memenv/*.gcno
- -rm -f config.h
- -rm -rf test/__pycache__
-
-.rc.o:
- @test -f $(WINDRES) || (echo "windres $(WINDRES) not found, but is required to compile windows resource files"; exit 1)
- ## FIXME: How to get the appropriate modulename_CPPFLAGS in here?
- $(AM_V_GEN) $(WINDRES) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) -DWINDRES_PREPROC -i $< -o $@
-
-check-symbols: $(bin_PROGRAMS)
- @echo "Running symbol and dynamic library checks..."
- $(AM_V_at) $(PYTHON) $(top_srcdir)/contrib/devtools/symbol-check.py $(bin_PROGRAMS)
-
-check-security: $(bin_PROGRAMS)
-if HARDEN
- @echo "Checking binary security..."
- $(AM_V_at) $(PYTHON) $(top_srcdir)/contrib/devtools/security-check.py $(bin_PROGRAMS)
-endif
-
-libbitcoin_ipc_mpgen_input = \
- ipc/capnp/echo.capnp \
- ipc/capnp/init.capnp
-EXTRA_DIST += $(libbitcoin_ipc_mpgen_input)
-%.capnp:
-
-# Explicitly list dependencies on generated headers as described in
-# https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
-ipc/capnp/libbitcoin_ipc_a-protocol.$(OBJEXT): $(libbitcoin_ipc_mpgen_input:=.h)
-
-if BUILD_MULTIPROCESS
-LIBBITCOIN_IPC=libbitcoin_ipc.a
-libbitcoin_ipc_a_SOURCES = \
- ipc/capnp/common-types.h \
- ipc/capnp/context.h \
- ipc/capnp/init-types.h \
- ipc/capnp/protocol.cpp \
- ipc/capnp/protocol.h \
- ipc/context.h \
- ipc/exception.h \
- ipc/interfaces.cpp \
- ipc/process.cpp \
- ipc/process.h \
- ipc/protocol.h
-libbitcoin_ipc_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libbitcoin_ipc_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) $(LIBMULTIPROCESS_CFLAGS)
-
-include $(MPGEN_PREFIX)/include/mpgen.mk
-libbitcoin_ipc_mpgen_output = \
- $(libbitcoin_ipc_mpgen_input:=.c++) \
- $(libbitcoin_ipc_mpgen_input:=.h) \
- $(libbitcoin_ipc_mpgen_input:=.proxy-client.c++) \
- $(libbitcoin_ipc_mpgen_input:=.proxy-server.c++) \
- $(libbitcoin_ipc_mpgen_input:=.proxy-types.c++) \
- $(libbitcoin_ipc_mpgen_input:=.proxy-types.h) \
- $(libbitcoin_ipc_mpgen_input:=.proxy.h)
-nodist_libbitcoin_ipc_a_SOURCES = $(libbitcoin_ipc_mpgen_output)
-CLEANFILES += $(libbitcoin_ipc_mpgen_output)
-endif
-
-%.raw.h: %.raw
- @$(MKDIR_P) $(@D)
- $(AM_V_GEN) { \
- echo "static unsigned const char $(*F)_raw[] = {" && \
- $(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' && \
- echo "};"; \
- } > "$@.new" && mv -f "$@.new" "$@"
-
-include Makefile.minisketch.include
-
-include Makefile.crc32c.include
-include Makefile.leveldb.include
-
-include Makefile.test_util.include
-include Makefile.test_fuzz.include
-
-include Makefile.test.include
-
-if ENABLE_BENCH
-include Makefile.bench.include
-endif
-
-if ENABLE_QT
-include Makefile.qt.include
-endif
-
-if ENABLE_QT_TESTS
-include Makefile.qttest.include
-endif
-
-include Makefile.univalue.include
diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
deleted file mode 100644
index fe6333d8c0..0000000000
--- a/src/Makefile.bench.include
+++ /dev/null
@@ -1,114 +0,0 @@
-# Copyright (c) 2015-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-bin_PROGRAMS += bench/bench_bitcoin
-BENCH_SRCDIR = bench
-BENCH_BINARY = bench/bench_bitcoin$(EXEEXT)
-
-RAW_BENCH_FILES = \
- bench/data/block413567.raw
-GENERATED_BENCH_FILES = $(RAW_BENCH_FILES:.raw=.raw.h)
-
-bench_bench_bitcoin_SOURCES = \
- $(RAW_BENCH_FILES) \
- bench/addrman.cpp \
- bench/base58.cpp \
- bench/bech32.cpp \
- bench/bench.cpp \
- bench/bench.h \
- bench/bench_bitcoin.cpp \
- bench/bip324_ecdh.cpp \
- bench/block_assemble.cpp \
- bench/ccoins_caching.cpp \
- bench/chacha20.cpp \
- bench/checkblock.cpp \
- bench/checkblockindex.cpp \
- bench/checkqueue.cpp \
- bench/cluster_linearize.cpp \
- bench/crypto_hash.cpp \
- bench/data.cpp \
- bench/data.h \
- bench/descriptors.cpp \
- bench/disconnected_transactions.cpp \
- bench/duplicate_inputs.cpp \
- bench/ellswift.cpp \
- bench/examples.cpp \
- bench/gcs_filter.cpp \
- bench/hashpadding.cpp \
- bench/index_blockfilter.cpp \
- bench/load_external.cpp \
- bench/lockedpool.cpp \
- bench/logging.cpp \
- bench/mempool_eviction.cpp \
- bench/mempool_stress.cpp \
- bench/merkle_root.cpp \
- bench/nanobench.cpp \
- bench/nanobench.h \
- bench/parse_hex.cpp \
- bench/peer_eviction.cpp \
- bench/poly1305.cpp \
- bench/pool.cpp \
- bench/prevector.cpp \
- bench/random.cpp \
- bench/readblock.cpp \
- bench/rollingbloom.cpp \
- bench/rpc_blockchain.cpp \
- bench/rpc_mempool.cpp \
- bench/sign_transaction.cpp \
- bench/streams_findbyte.cpp \
- bench/strencodings.cpp \
- bench/util_time.cpp \
- bench/verify_script.cpp \
- bench/xor.cpp
-
-nodist_bench_bench_bitcoin_SOURCES = $(GENERATED_BENCH_FILES)
-
-bench_bench_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/
-bench_bench_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bench_bench_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-bench_bench_bitcoin_LDADD = \
- $(LIBTEST_UTIL) \
- $(LIBBITCOIN_NODE) \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBLEVELDB) \
- $(LIBMEMENV) \
- $(LIBSECP256K1) \
- $(LIBUNIVALUE) \
- $(EVENT_PTHREADS_LIBS) \
- $(EVENT_LIBS) \
- $(MINIUPNPC_LIBS) \
- $(NATPMP_LIBS)
-
-if ENABLE_ZMQ
-bench_bench_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-
-if ENABLE_WALLET
-bench_bench_bitcoin_SOURCES += bench/coin_selection.cpp
-bench_bench_bitcoin_SOURCES += bench/wallet_balance.cpp
-bench_bench_bitcoin_SOURCES += bench/wallet_create.cpp
-bench_bench_bitcoin_SOURCES += bench/wallet_loading.cpp
-bench_bench_bitcoin_SOURCES += bench/wallet_create_tx.cpp
-bench_bench_bitcoin_SOURCES += bench/wallet_ismine.cpp
-
-bench_bench_bitcoin_LDADD += $(BDB_LIBS) $(SQLITE_LIBS)
-endif
-
-CLEAN_BITCOIN_BENCH = bench/*.gcda bench/*.gcno $(GENERATED_BENCH_FILES)
-
-CLEANFILES += $(CLEAN_BITCOIN_BENCH)
-
-bench/data.cpp: bench/data/block413567.raw.h
-
-bitcoin_bench: $(BENCH_BINARY)
-
-bench: $(BENCH_BINARY) FORCE
- $(BENCH_BINARY)
-
-bitcoin_bench_clean : FORCE
- rm -f $(CLEAN_BITCOIN_BENCH) $(bench_bench_bitcoin_OBJECTS) $(BENCH_BINARY)
diff --git a/src/Makefile.crc32c.include b/src/Makefile.crc32c.include
deleted file mode 100644
index c4dd84991d..0000000000
--- a/src/Makefile.crc32c.include
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright (c) 2019 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-LIBCRC32C_INT = crc32c/libcrc32c.la
-
-noinst_LTLIBRARIES += $(LIBCRC32C_INT)
-
-LIBCRC32C = $(LIBCRC32C_INT)
-
-CRC32C_CPPFLAGS_INT =
-CRC32C_CPPFLAGS_INT += -I$(srcdir)/crc32c/include
-CRC32C_CPPFLAGS_INT += -DHAVE_BUILTIN_PREFETCH=@HAVE_BUILTIN_PREFETCH@
-CRC32C_CPPFLAGS_INT += -DHAVE_MM_PREFETCH=@HAVE_MM_PREFETCH@
-CRC32C_CPPFLAGS_INT += -DHAVE_STRONG_GETAUXVAL=@HAVE_STRONG_GETAUXVAL@
-CRC32C_CPPFLAGS_INT += -DCRC32C_TESTS_BUILT_WITH_GLOG=0
-
-if ENABLE_SSE42
-CRC32C_CPPFLAGS_INT += -DHAVE_SSE42=1
-else
-CRC32C_CPPFLAGS_INT += -DHAVE_SSE42=0
-endif
-
-if ENABLE_ARM_CRC
-CRC32C_CPPFLAGS_INT += -DHAVE_ARM64_CRC32C=1
-else
-CRC32C_CPPFLAGS_INT += -DHAVE_ARM64_CRC32C=0
-endif
-
-if WORDS_BIGENDIAN
-CRC32C_CPPFLAGS_INT += -DBYTE_ORDER_BIG_ENDIAN=1
-else
-CRC32C_CPPFLAGS_INT += -DBYTE_ORDER_BIG_ENDIAN=0
-endif
-
-crc32c_libcrc32c_la_CPPFLAGS = $(AM_CPPFLAGS) $(CRC32C_CPPFLAGS_INT) $(CRC32C_CPPFLAGS)
-
-# Specify -static in both CXXFLAGS and LDFLAGS so libtool will only build a
-# static version of this library. We don't need a dynamic version, and a dynamic
-# version can't be used on windows anyway because the library doesn't currently
-# export DLL symbols.
-crc32c_libcrc32c_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crc32c_libcrc32c_la_LDFLAGS = $(AM_LDFLAGS) -static
-
-crc32c_libcrc32c_la_SOURCES =
-crc32c_libcrc32c_la_SOURCES += crc32c/include/crc32c/crc32c.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_arm64.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_arm64_check.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_internal.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_prefetch.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_read_le.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_round_up.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_sse42_check.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_sse42.h
-
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c.cc
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_portable.cc
-
-if ENABLE_SSE42
-LIBCRC32C_SSE42_INT = crc32c/libcrc32c_sse42.la
-noinst_LTLIBRARIES += $(LIBCRC32C_SSE42_INT)
-LIBCRC32C += $(LIBCRC32C_SSE42_INT)
-
-crc32c_libcrc32c_sse42_la_CPPFLAGS = $(crc32c_libcrc32c_la_CPPFLAGS)
-crc32c_libcrc32c_sse42_la_CXXFLAGS = $(crc32c_libcrc32c_la_CXXFLAGS) $(SSE42_CXXFLAGS)
-crc32c_libcrc32c_sse42_la_LDFLAGS = $(crc32c_libcrc32c_la_LDFLAGS)
-
-crc32c_libcrc32c_sse42_la_SOURCES = crc32c/src/crc32c_sse42.cc
-endif
-
-if ENABLE_ARM_CRC
-LIBCRC32C_ARM_CRC_INT = crc32c/libcrc32c_arm_crc.la
-noinst_LTLIBRARIES += $(LIBCRC32C_ARM_CRC_INT)
-LIBCRC32C += $(LIBCRC32C_ARM_CRC_INT)
-
-crc32c_libcrc32c_arm_crc_la_CPPFLAGS = $(crc32c_libcrc32c_la_CPPFLAGS)
-crc32c_libcrc32c_arm_crc_la_CXXFLAGS = $(crc32c_libcrc32c_la_CXXFLAGS) $(ARM_CRC_CXXFLAGS)
-crc32c_libcrc32c_arm_crc_la_LDFLAGS = $(crc32c_libcrc32c_la_LDFLAGS)
-
-crc32c_libcrc32c_arm_crc_la_SOURCES = crc32c/src/crc32c_arm64.cc
-endif
diff --git a/src/Makefile.leveldb.include b/src/Makefile.leveldb.include
deleted file mode 100644
index bf14fe206b..0000000000
--- a/src/Makefile.leveldb.include
+++ /dev/null
@@ -1,153 +0,0 @@
-# Copyright (c) 2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-LIBLEVELDB_INT = leveldb/libleveldb.la
-LIBMEMENV_INT = leveldb/libmemenv.la
-
-noinst_LTLIBRARIES += $(LIBLEVELDB_INT)
-noinst_LTLIBRARIES += $(LIBMEMENV_INT)
-
-LIBLEVELDB = $(LIBLEVELDB_INT) $(LIBCRC32C)
-LIBMEMENV = $(LIBMEMENV_INT)
-
-LEVELDB_CPPFLAGS =
-LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include
-
-LEVELDB_CPPFLAGS_INT =
-LEVELDB_CPPFLAGS_INT += -I$(srcdir)/leveldb
-LEVELDB_CPPFLAGS_INT += -I$(srcdir)/crc32c/include
-LEVELDB_CPPFLAGS_INT += -D__STDC_LIMIT_MACROS
-LEVELDB_CPPFLAGS_INT += -DHAVE_SNAPPY=0 -DHAVE_CRC32C=1
-LEVELDB_CPPFLAGS_INT += -DHAVE_FDATASYNC=@HAVE_FDATASYNC@
-LEVELDB_CPPFLAGS_INT += -DHAVE_FULLFSYNC=@HAVE_FULLFSYNC@
-LEVELDB_CPPFLAGS_INT += -DHAVE_O_CLOEXEC=@HAVE_O_CLOEXEC@
-LEVELDB_CPPFLAGS_INT += -DFALLTHROUGH_INTENDED=[[fallthrough]]
-
-if WORDS_BIGENDIAN
-LEVELDB_CPPFLAGS_INT += -DLEVELDB_IS_BIG_ENDIAN=1
-else
-LEVELDB_CPPFLAGS_INT += -DLEVELDB_IS_BIG_ENDIAN=0
-endif
-
-if TARGET_WINDOWS
-LEVELDB_CPPFLAGS_INT += -DLEVELDB_PLATFORM_WINDOWS -D_UNICODE -DUNICODE -D__USE_MINGW_ANSI_STDIO=1
-else
-LEVELDB_CPPFLAGS_INT += -DLEVELDB_PLATFORM_POSIX
-endif
-
-leveldb_libleveldb_la_CPPFLAGS = $(AM_CPPFLAGS) $(LEVELDB_CPPFLAGS_INT) $(LEVELDB_CPPFLAGS)
-
-# Specify -static in both CXXFLAGS and LDFLAGS so libtool will only build a
-# static version of this library. We don't need a dynamic version, and a dynamic
-# version can't be used on windows anyway because the library doesn't currently
-# export DLL symbols.
-leveldb_libleveldb_la_CXXFLAGS = $(filter-out -Wconditional-uninitialized -Werror=conditional-uninitialized -Wsuggest-override -Werror=suggest-override, $(AM_CXXFLAGS)) $(PIE_FLAGS) -static
-leveldb_libleveldb_la_LDFLAGS = $(AM_LDFLAGS) -static
-
-leveldb_libleveldb_la_SOURCES=
-leveldb_libleveldb_la_SOURCES += leveldb/port/port_stdcxx.h
-leveldb_libleveldb_la_SOURCES += leveldb/port/port.h
-leveldb_libleveldb_la_SOURCES += leveldb/port/thread_annotations.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/db.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/options.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/comparator.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/filter_policy.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/slice.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/table_builder.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/env.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/export.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/c.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/iterator.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/cache.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/dumpfile.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/table.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/write_batch.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/status.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_format.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/memtable.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/version_set.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/write_batch_internal.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/filename.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/version_edit.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/dbformat.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/builder.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_writer.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/db_iter.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/skiplist.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/db_impl.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/table_cache.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/snapshot.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_reader.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/filter_block.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/block_builder.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/block.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/two_level_iterator.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/merger.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/format.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/iterator_wrapper.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/crc32c.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/env_posix_test_helper.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/env_windows_test_helper.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/arena.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/random.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/posix_logger.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/hash.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/histogram.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/coding.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/testutil.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/mutexlock.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/logging.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/no_destructor.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/testharness.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/windows_logger.h
-
-leveldb_libleveldb_la_SOURCES += leveldb/db/builder.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/c.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/dbformat.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/db_impl.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/db_iter.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/dumpfile.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/filename.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_reader.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_writer.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/memtable.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/repair.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/table_cache.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/version_edit.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/version_set.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/write_batch.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/block_builder.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/block.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/filter_block.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/format.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/iterator.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/merger.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/table_builder.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/table.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/two_level_iterator.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/arena.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/bloom.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/cache.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/coding.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/comparator.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/crc32c.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/env.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/filter_policy.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/hash.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/histogram.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/logging.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/options.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/status.cc
-
-if TARGET_WINDOWS
-leveldb_libleveldb_la_SOURCES += leveldb/util/env_windows.cc
-else
-leveldb_libleveldb_la_SOURCES += leveldb/util/env_posix.cc
-endif
-
-leveldb_libmemenv_la_CPPFLAGS = $(leveldb_libleveldb_la_CPPFLAGS)
-leveldb_libmemenv_la_CXXFLAGS = $(leveldb_libleveldb_la_CXXFLAGS)
-leveldb_libmemenv_la_LDFLAGS = $(leveldb_libleveldb_la_LDFLAGS)
-leveldb_libmemenv_la_SOURCES = leveldb/helpers/memenv/memenv.cc
-leveldb_libmemenv_la_SOURCES += leveldb/helpers/memenv/memenv.h
diff --git a/src/Makefile.minisketch.include b/src/Makefile.minisketch.include
deleted file mode 100644
index c6f894f0ca..0000000000
--- a/src/Makefile.minisketch.include
+++ /dev/null
@@ -1,39 +0,0 @@
-include minisketch/sources.mk
-
-LIBMINISKETCH_CPPFLAGS=
-LIBMINISKETCH_CPPFLAGS += -DDISABLE_DEFAULT_FIELDS -DENABLE_FIELD_32
-
-LIBMINISKETCH = minisketch/libminisketch.a
-MINISKETCH_LIBS = $(LIBMINISKETCH)
-
-if ENABLE_CLMUL
-LIBMINISKETCH_CLMUL = minisketch/libminisketch_clmul.a
-LIBMINISKETCH_CPPFLAGS += -DHAVE_CLMUL
-MINISKETCH_LIBS += $(LIBMINISKETCH_CLMUL)
-endif
-
-EXTRA_LIBRARIES += $(MINISKETCH_LIBS)
-
-minisketch_libminisketch_clmul_a_SOURCES = $(MINISKETCH_FIELD_CLMUL_SOURCES_INT) $(MINISKETCH_FIELD_CLMUL_HEADERS_INT)
-minisketch_libminisketch_clmul_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) $(CLMUL_CXXFLAGS)
-minisketch_libminisketch_clmul_a_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMINISKETCH_CPPFLAGS)
-
-minisketch_libminisketch_a_SOURCES = $(MINISKETCH_FIELD_GENERIC_SOURCES_INT) $(MINISKETCH_LIB_SOURCES_INT)
-minisketch_libminisketch_a_SOURCES += $(MINISKETCH_FIELD_GENERIC_HEADERS_INT) $(MINISKETCH_LIB_HEADERS_INT) $(MINISKETCH_DIST_HEADERS_INT)
-minisketch_libminisketch_a_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMINISKETCH_CPPFLAGS)
-minisketch_libminisketch_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-
-if ENABLE_TESTS
-if !ENABLE_FUZZ
-MINISKETCH_TEST = minisketch/test
-TESTS += $(MINISKETCH_TEST)
-check_PROGRAMS += $(MINISKETCH_TEST)
-
-minisketch_test_SOURCES = $(MINISKETCH_TEST_SOURCES_INT)
-minisketch_test_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMINISKETCH_CPPFLAGS)
-minisketch_test_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-minisketch_test_LDADD = $(MINISKETCH_LIBS)
-minisketch_test_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-endif
-endif
diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
deleted file mode 100644
index 1ac6b74688..0000000000
--- a/src/Makefile.qt.include
+++ /dev/null
@@ -1,409 +0,0 @@
-# Copyright (c) 2013-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-bin_PROGRAMS += qt/bitcoin-qt
-
-if BUILD_BITCOIN_GUI
- bin_PROGRAMS += bitcoin-gui
-endif
-
-EXTRA_LIBRARIES += qt/libbitcoinqt.a
-
-# bitcoin qt core #
-include Makefile.qt_locale.include
-
-QT_FORMS_UI = \
- qt/forms/addressbookpage.ui \
- qt/forms/askpassphrasedialog.ui \
- qt/forms/coincontroldialog.ui \
- qt/forms/createwalletdialog.ui \
- qt/forms/editaddressdialog.ui \
- qt/forms/helpmessagedialog.ui \
- qt/forms/intro.ui \
- qt/forms/modaloverlay.ui \
- qt/forms/openuridialog.ui \
- qt/forms/optionsdialog.ui \
- qt/forms/overviewpage.ui \
- qt/forms/psbtoperationsdialog.ui \
- qt/forms/receivecoinsdialog.ui \
- qt/forms/receiverequestdialog.ui \
- qt/forms/debugwindow.ui \
- qt/forms/sendcoinsdialog.ui \
- qt/forms/sendcoinsentry.ui \
- qt/forms/signverifymessagedialog.ui \
- qt/forms/transactiondescdialog.ui
-
-QT_MOC_CPP = \
- qt/moc_addressbookpage.cpp \
- qt/moc_addresstablemodel.cpp \
- qt/moc_askpassphrasedialog.cpp \
- qt/moc_createwalletdialog.cpp \
- qt/moc_bantablemodel.cpp \
- qt/moc_bitcoin.cpp \
- qt/moc_bitcoinaddressvalidator.cpp \
- qt/moc_bitcoinamountfield.cpp \
- qt/moc_bitcoingui.cpp \
- qt/moc_bitcoinunits.cpp \
- qt/moc_clientmodel.cpp \
- qt/moc_coincontroldialog.cpp \
- qt/moc_coincontroltreewidget.cpp \
- qt/moc_csvmodelwriter.cpp \
- qt/moc_editaddressdialog.cpp \
- qt/moc_guiutil.cpp \
- qt/moc_initexecutor.cpp \
- qt/moc_intro.cpp \
- qt/moc_macdockiconhandler.cpp \
- qt/moc_macnotificationhandler.cpp \
- qt/moc_modaloverlay.cpp \
- qt/moc_notificator.cpp \
- qt/moc_openuridialog.cpp \
- qt/moc_optionsdialog.cpp \
- qt/moc_optionsmodel.cpp \
- qt/moc_overviewpage.cpp \
- qt/moc_peertablemodel.cpp \
- qt/moc_peertablesortproxy.cpp \
- qt/moc_paymentserver.cpp \
- qt/moc_psbtoperationsdialog.cpp \
- qt/moc_qrimagewidget.cpp \
- qt/moc_qvalidatedlineedit.cpp \
- qt/moc_qvaluecombobox.cpp \
- qt/moc_receivecoinsdialog.cpp \
- qt/moc_receiverequestdialog.cpp \
- qt/moc_recentrequeststablemodel.cpp \
- qt/moc_rpcconsole.cpp \
- qt/moc_sendcoinsdialog.cpp \
- qt/moc_sendcoinsentry.cpp \
- qt/moc_signverifymessagedialog.cpp \
- qt/moc_splashscreen.cpp \
- qt/moc_trafficgraphwidget.cpp \
- qt/moc_transactiondesc.cpp \
- qt/moc_transactiondescdialog.cpp \
- qt/moc_transactionfilterproxy.cpp \
- qt/moc_transactionoverviewwidget.cpp \
- qt/moc_transactiontablemodel.cpp \
- qt/moc_transactionview.cpp \
- qt/moc_utilitydialog.cpp \
- qt/moc_walletcontroller.cpp \
- qt/moc_walletframe.cpp \
- qt/moc_walletmodel.cpp \
- qt/moc_walletview.cpp
-
-BITCOIN_MM = \
- qt/macdockiconhandler.mm \
- qt/macnotificationhandler.mm \
- qt/macos_appnap.mm
-
-QT_MOC = \
- qt/bitcoinamountfield.moc \
- qt/intro.moc \
- qt/overviewpage.moc \
- qt/rpcconsole.moc
-
-QT_QRC_CPP = qt/qrc_bitcoin.cpp
-QT_QRC = qt/bitcoin.qrc
-QT_QRC_LOCALE_CPP = qt/qrc_bitcoin_locale.cpp
-QT_QRC_LOCALE = qt/bitcoin_locale.qrc
-
-BITCOIN_QT_H = \
- qt/addressbookpage.h \
- qt/addresstablemodel.h \
- qt/askpassphrasedialog.h \
- qt/bantablemodel.h \
- qt/bitcoin.h \
- qt/bitcoinaddressvalidator.h \
- qt/bitcoinamountfield.h \
- qt/bitcoingui.h \
- qt/bitcoinunits.h \
- qt/clientmodel.h \
- qt/coincontroldialog.h \
- qt/coincontroltreewidget.h \
- qt/createwalletdialog.h \
- qt/csvmodelwriter.h \
- qt/editaddressdialog.h \
- qt/guiconstants.h \
- qt/guiutil.h \
- qt/initexecutor.h \
- qt/intro.h \
- qt/macdockiconhandler.h \
- qt/macnotificationhandler.h \
- qt/macos_appnap.h \
- qt/modaloverlay.h \
- qt/networkstyle.h \
- qt/notificator.h \
- qt/openuridialog.h \
- qt/optionsdialog.h \
- qt/optionsmodel.h \
- qt/overviewpage.h \
- qt/paymentserver.h \
- qt/peertablemodel.h \
- qt/peertablesortproxy.h \
- qt/platformstyle.h \
- qt/psbtoperationsdialog.h \
- qt/qrimagewidget.h \
- qt/qvalidatedlineedit.h \
- qt/qvaluecombobox.h \
- qt/receivecoinsdialog.h \
- qt/receiverequestdialog.h \
- qt/recentrequeststablemodel.h \
- qt/rpcconsole.h \
- qt/sendcoinsdialog.h \
- qt/sendcoinsentry.h \
- qt/sendcoinsrecipient.h \
- qt/signverifymessagedialog.h \
- qt/splashscreen.h \
- qt/trafficgraphwidget.h \
- qt/transactiondesc.h \
- qt/transactiondescdialog.h \
- qt/transactionfilterproxy.h \
- qt/transactionoverviewwidget.h \
- qt/transactionrecord.h \
- qt/transactiontablemodel.h \
- qt/transactionview.h \
- qt/utilitydialog.h \
- qt/walletcontroller.h \
- qt/walletframe.h \
- qt/walletmodel.h \
- qt/walletmodeltransaction.h \
- qt/walletview.h \
- qt/winshutdownmonitor.h
-
-QT_RES_FONTS = \
- qt/res/fonts/RobotoMono-Bold.ttf
-
-QT_RES_ICONS = \
- qt/res/icons/add.png \
- qt/res/icons/address-book.png \
- qt/res/icons/bitcoin.ico \
- qt/res/icons/bitcoin_testnet.ico \
- qt/res/icons/bitcoin.png \
- qt/res/icons/chevron.png \
- qt/res/icons/clock1.png \
- qt/res/icons/clock2.png \
- qt/res/icons/clock3.png \
- qt/res/icons/clock4.png \
- qt/res/icons/clock5.png \
- qt/res/icons/connect0.png \
- qt/res/icons/connect1.png \
- qt/res/icons/connect2.png \
- qt/res/icons/connect3.png \
- qt/res/icons/connect4.png \
- qt/res/icons/edit.png \
- qt/res/icons/editcopy.png \
- qt/res/icons/editpaste.png \
- qt/res/icons/export.png \
- qt/res/icons/eye.png \
- qt/res/icons/eye_minus.png \
- qt/res/icons/eye_plus.png \
- qt/res/icons/fontbigger.png \
- qt/res/icons/fontsmaller.png \
- qt/res/icons/hd_disabled.png \
- qt/res/icons/hd_enabled.png \
- qt/res/icons/history.png \
- qt/res/icons/lock_closed.png \
- qt/res/icons/lock_open.png \
- qt/res/icons/network_disabled.png \
- qt/res/icons/overview.png \
- qt/res/icons/proxy.png \
- qt/res/icons/receive.png \
- qt/res/icons/remove.png \
- qt/res/icons/send.png \
- qt/res/icons/synced.png \
- qt/res/icons/transaction0.png \
- qt/res/icons/transaction2.png \
- qt/res/icons/transaction_abandoned.png \
- qt/res/icons/transaction_conflicted.png \
- qt/res/icons/tx_inout.png \
- qt/res/icons/tx_input.png \
- qt/res/icons/tx_output.png \
- qt/res/icons/tx_mined.png \
- qt/res/icons/warning.png
-
-BITCOIN_QT_BASE_CPP = \
- qt/bantablemodel.cpp \
- qt/bitcoin.cpp \
- qt/bitcoinaddressvalidator.cpp \
- qt/bitcoinamountfield.cpp \
- qt/bitcoingui.cpp \
- qt/bitcoinunits.cpp \
- qt/clientmodel.cpp \
- qt/csvmodelwriter.cpp \
- qt/guiutil.cpp \
- qt/initexecutor.cpp \
- qt/intro.cpp \
- qt/modaloverlay.cpp \
- qt/networkstyle.cpp \
- qt/notificator.cpp \
- qt/optionsdialog.cpp \
- qt/optionsmodel.cpp \
- qt/peertablemodel.cpp \
- qt/peertablesortproxy.cpp \
- qt/platformstyle.cpp \
- qt/qvalidatedlineedit.cpp \
- qt/qvaluecombobox.cpp \
- qt/rpcconsole.cpp \
- qt/splashscreen.cpp \
- qt/trafficgraphwidget.cpp \
- qt/utilitydialog.cpp
-
-BITCOIN_QT_WINDOWS_CPP = qt/winshutdownmonitor.cpp
-
-BITCOIN_QT_WALLET_CPP = \
- qt/addressbookpage.cpp \
- qt/addresstablemodel.cpp \
- qt/askpassphrasedialog.cpp \
- qt/coincontroldialog.cpp \
- qt/coincontroltreewidget.cpp \
- qt/createwalletdialog.cpp \
- qt/editaddressdialog.cpp \
- qt/openuridialog.cpp \
- qt/overviewpage.cpp \
- qt/paymentserver.cpp \
- qt/psbtoperationsdialog.cpp \
- qt/qrimagewidget.cpp \
- qt/receivecoinsdialog.cpp \
- qt/receiverequestdialog.cpp \
- qt/recentrequeststablemodel.cpp \
- qt/sendcoinsdialog.cpp \
- qt/sendcoinsentry.cpp \
- qt/signverifymessagedialog.cpp \
- qt/transactiondesc.cpp \
- qt/transactiondescdialog.cpp \
- qt/transactionfilterproxy.cpp \
- qt/transactionoverviewwidget.cpp \
- qt/transactionrecord.cpp \
- qt/transactiontablemodel.cpp \
- qt/transactionview.cpp \
- qt/walletcontroller.cpp \
- qt/walletframe.cpp \
- qt/walletmodel.cpp \
- qt/walletmodeltransaction.cpp \
- qt/walletview.cpp
-
-BITCOIN_QT_CPP = $(BITCOIN_QT_BASE_CPP)
-if TARGET_WINDOWS
-BITCOIN_QT_CPP += $(BITCOIN_QT_WINDOWS_CPP)
-endif
-if ENABLE_WALLET
-BITCOIN_QT_CPP += $(BITCOIN_QT_WALLET_CPP)
-endif # ENABLE_WALLET
-
-QT_RES_ANIMATION = $(wildcard $(srcdir)/qt/res/animation/spinner-*.png)
-
-BITCOIN_QT_RC = qt/res/bitcoin-qt-res.rc
-
-BITCOIN_QT_INCLUDES = -DQT_NO_KEYWORDS -DQT_USE_QSTRINGBUILDER
-
-qt_libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
- $(QT_INCLUDES) $(QT_DBUS_INCLUDES) $(QR_CFLAGS) $(BOOST_CPPFLAGS)
-qt_libbitcoinqt_a_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
-qt_libbitcoinqt_a_OBJCXXFLAGS = $(AM_OBJCXXFLAGS) $(QT_PIE_FLAGS)
-
-qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \
- $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(QT_RES_FONTS) $(QT_RES_ICONS) $(QT_RES_ANIMATION)
-if TARGET_DARWIN
- qt_libbitcoinqt_a_SOURCES += $(BITCOIN_MM)
-endif
-
-nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP)
-
-# forms/foo.h -> forms/ui_foo.h
-QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h))))
-
-# Most files will depend on the forms and moc files as includes. Generate them
-# before anything else.
-$(QT_MOC): $(QT_FORMS_H)
-$(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) $(bitcoin_gui_OBJECTS) : | $(QT_MOC)
-
-# bitcoin-qt and bitcoin-gui binaries #
-bitcoin_qt_cppflags = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
- $(QT_INCLUDES) $(QR_CFLAGS)
-bitcoin_qt_cxxflags = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
-
-bitcoin_qt_sources = qt/main.cpp
-if TARGET_WINDOWS
- bitcoin_qt_sources += $(BITCOIN_QT_RC)
-endif
-bitcoin_qt_ldadd = qt/libbitcoinqt.a $(LIBBITCOIN_NODE)
-if ENABLE_WALLET
-bitcoin_qt_ldadd += $(LIBBITCOIN_UTIL) $(LIBBITCOIN_WALLET)
-endif
-if ENABLE_ZMQ
-bitcoin_qt_ldadd += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-bitcoin_qt_ldadd += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
- $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(LIBSECP256K1) \
- $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(SQLITE_LIBS)
-bitcoin_qt_ldflags = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-bitcoin_qt_libtoolflags = $(AM_LIBTOOLFLAGS) --tag CXX
-
-qt_bitcoin_qt_CPPFLAGS = $(bitcoin_qt_cppflags)
-qt_bitcoin_qt_CXXFLAGS = $(bitcoin_qt_cxxflags)
-qt_bitcoin_qt_SOURCES = $(bitcoin_qt_sources) init/bitcoin-qt.cpp
-qt_bitcoin_qt_LDADD = $(bitcoin_qt_ldadd)
-qt_bitcoin_qt_LDFLAGS = $(bitcoin_qt_ldflags)
-qt_bitcoin_qt_LIBTOOLFLAGS = $(bitcoin_qt_libtoolflags)
-
-bitcoin_gui_CPPFLAGS = $(bitcoin_qt_cppflags)
-bitcoin_gui_CXXFLAGS = $(bitcoin_qt_cxxflags)
-bitcoin_gui_SOURCES = $(bitcoin_qt_sources) init/bitcoin-gui.cpp
-bitcoin_gui_LDADD = $(bitcoin_qt_ldadd) $(LIBBITCOIN_IPC) $(LIBBITCOIN_UTIL) $(LIBMULTIPROCESS_LIBS)
-bitcoin_gui_LDFLAGS = $(bitcoin_qt_ldflags)
-bitcoin_gui_LIBTOOLFLAGS = $(bitcoin_qt_libtoolflags)
-
-#locale/foo.ts -> locale/foo.qm
-QT_QM=$(QT_TS:.ts=.qm)
-
-SECONDARY: $(QT_QM)
-
-$(srcdir)/qt/bitcoinstrings.cpp: FORCE
- @test -n $(XGETTEXT) || echo "xgettext is required for updating translations"
- $(AM_V_GEN) cd $(srcdir); XGETTEXT=$(XGETTEXT) COPYRIGHT_HOLDERS="$(COPYRIGHT_HOLDERS)" $(PYTHON) ../share/qt/extract_strings_qt.py \
- $(libbitcoin_node_a_SOURCES) $(libbitcoin_wallet_a_SOURCES) $(libbitcoin_common_a_SOURCES) \
- $(libbitcoin_zmq_a_SOURCES) $(libbitcoin_consensus_a_SOURCES) $(libbitcoin_util_a_SOURCES) \
- $(BITCOIN_QT_BASE_CPP) $(BITCOIN_QT_WINDOWS_CPP) $(BITCOIN_QT_WALLET_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
-
-# The resulted bitcoin_en.xlf source file should follow Transifex requirements.
-# See: https://docs.transifex.com/formats/xliff#how-to-distinguish-between-a-source-file-and-a-translation-file
-translate: $(srcdir)/qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_BASE_CPP) $(BITCOIN_QT_WINDOWS_CPP) $(BITCOIN_QT_WALLET_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
- @test -n $(LUPDATE) || echo "lupdate is required for updating translations"
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) -no-obsolete -I $(srcdir) -locations relative $^ -ts $(srcdir)/qt/locale/bitcoin_en.ts
- @test -n $(LCONVERT) || echo "lconvert is required for updating translations"
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LCONVERT) -drop-translations -o $(srcdir)/qt/locale/bitcoin_en.xlf -i $(srcdir)/qt/locale/bitcoin_en.ts
- @$(SED) -i.old -e 's|source-language="en" target-language="en"|source-language="en"|' -e '/<target xml:space="preserve"><\/target>/d' $(srcdir)/qt/locale/bitcoin_en.xlf
- @rm -f $(srcdir)/qt/locale/bitcoin_en.xlf.old
-
-$(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM)
- @test -f $(RCC) || (echo "rcc $(RCC) not found, but is required for generating qrc cpp files"; exit 1)
- @cp -f $< $(@D)/temp_$(<F)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin_locale --format-version 1 $(@D)/temp_$(<F) > $@
- @rm $(@D)/temp_$(<F)
-
-$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(QT_RES_FONTS) $(QT_RES_ICONS) $(QT_RES_ANIMATION)
- @test -f $(RCC) || (echo "rcc $(RCC) not found, but is required for generating qrc cpp files"; exit 1)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin --format-version 1 $< > $@
-
-CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno qt/temp_bitcoin_locale.qrc
-
-CLEANFILES += $(CLEAN_QT)
-
-bitcoin_qt_clean: FORCE
- rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) qt/bitcoin-qt$(EXEEXT) $(LIBBITCOINQT)
-
-bitcoin_qt : qt/bitcoin-qt$(EXEEXT)
-
-ui_%.h: %.ui
- @test -f $(UIC) || (echo "uic $(UIC) not found, but is required for generating ui headers"; exit 1)
- @$(MKDIR_P) $(@D)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(UIC) -o $@ $< || (echo "Error creating $@"; false)
-
-%.moc: %.cpp
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(DEFAULT_INCLUDES) $(QT_INCLUDES_UNSUPPRESSED) $(MOC_DEFS) $< > $@
-
-moc_%.cpp: %.h
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(DEFAULT_INCLUDES) $(QT_INCLUDES_UNSUPPRESSED) $(MOC_DEFS) $< > $@
-
-%.qm: %.ts
- @test -f $(LRELEASE) || (echo "lrelease $(LRELEASE) not found, but is required for generating translations"; exit 1)
- @$(MKDIR_P) $(@D)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LRELEASE) -silent $< -qm $@
diff --git a/src/Makefile.qt_locale.include b/src/Makefile.qt_locale.include
deleted file mode 100644
index 2af9fd01af..0000000000
--- a/src/Makefile.qt_locale.include
+++ /dev/null
@@ -1,124 +0,0 @@
-QT_TS = \
- qt/locale/bitcoin_af.ts \
- qt/locale/bitcoin_am.ts \
- qt/locale/bitcoin_ar.ts \
- qt/locale/bitcoin_az.ts \
- qt/locale/bitcoin_az@latin.ts \
- qt/locale/bitcoin_be.ts \
- qt/locale/bitcoin_bg.ts \
- qt/locale/bitcoin_bn.ts \
- qt/locale/bitcoin_br.ts \
- qt/locale/bitcoin_bs.ts \
- qt/locale/bitcoin_ca.ts \
- qt/locale/bitcoin_cmn.ts \
- qt/locale/bitcoin_cs.ts \
- qt/locale/bitcoin_cy.ts \
- qt/locale/bitcoin_da.ts \
- qt/locale/bitcoin_de.ts \
- qt/locale/bitcoin_de_AT.ts \
- qt/locale/bitcoin_de_CH.ts \
- qt/locale/bitcoin_el.ts \
- qt/locale/bitcoin_en.ts \
- qt/locale/bitcoin_eo.ts \
- qt/locale/bitcoin_es.ts \
- qt/locale/bitcoin_es_CL.ts \
- qt/locale/bitcoin_es_CO.ts \
- qt/locale/bitcoin_es_DO.ts \
- qt/locale/bitcoin_es_MX.ts \
- qt/locale/bitcoin_es_SV.ts \
- qt/locale/bitcoin_es_VE.ts \
- qt/locale/bitcoin_et.ts \
- qt/locale/bitcoin_eu.ts \
- qt/locale/bitcoin_fa.ts \
- qt/locale/bitcoin_fi.ts \
- qt/locale/bitcoin_fil.ts \
- qt/locale/bitcoin_fo.ts \
- qt/locale/bitcoin_fr.ts \
- qt/locale/bitcoin_fr_CM.ts \
- qt/locale/bitcoin_fr_LU.ts \
- qt/locale/bitcoin_ga.ts \
- qt/locale/bitcoin_ga_IE.ts \
- qt/locale/bitcoin_gd.ts \
- qt/locale/bitcoin_gl.ts \
- qt/locale/bitcoin_gl_ES.ts \
- qt/locale/bitcoin_gu.ts \
- qt/locale/bitcoin_ha.ts \
- qt/locale/bitcoin_hak.ts \
- qt/locale/bitcoin_he.ts \
- qt/locale/bitcoin_hi.ts \
- qt/locale/bitcoin_hr.ts \
- qt/locale/bitcoin_hu.ts \
- qt/locale/bitcoin_id.ts \
- qt/locale/bitcoin_is.ts \
- qt/locale/bitcoin_it.ts \
- qt/locale/bitcoin_ja.ts \
- qt/locale/bitcoin_ka.ts \
- qt/locale/bitcoin_kk.ts \
- qt/locale/bitcoin_kk@latin.ts \
- qt/locale/bitcoin_kl.ts \
- qt/locale/bitcoin_km.ts \
- qt/locale/bitcoin_kn.ts \
- qt/locale/bitcoin_ko.ts \
- qt/locale/bitcoin_ku.ts \
- qt/locale/bitcoin_ku_IQ.ts \
- qt/locale/bitcoin_ky.ts \
- qt/locale/bitcoin_la.ts \
- qt/locale/bitcoin_lb.ts \
- qt/locale/bitcoin_lt.ts \
- qt/locale/bitcoin_lv.ts \
- qt/locale/bitcoin_mg.ts \
- qt/locale/bitcoin_mi.ts \
- qt/locale/bitcoin_mk.ts \
- qt/locale/bitcoin_ml.ts \
- qt/locale/bitcoin_mn.ts \
- qt/locale/bitcoin_mr.ts \
- qt/locale/bitcoin_mr_IN.ts \
- qt/locale/bitcoin_ms.ts \
- qt/locale/bitcoin_mt.ts \
- qt/locale/bitcoin_my.ts \
- qt/locale/bitcoin_nb.ts \
- qt/locale/bitcoin_ne.ts \
- qt/locale/bitcoin_nl.ts \
- qt/locale/bitcoin_no.ts \
- qt/locale/bitcoin_pa.ts \
- qt/locale/bitcoin_pam.ts \
- qt/locale/bitcoin_pl.ts \
- qt/locale/bitcoin_pt.ts \
- qt/locale/bitcoin_pt_BR.ts \
- qt/locale/bitcoin_ro.ts \
- qt/locale/bitcoin_ru.ts \
- qt/locale/bitcoin_sc.ts \
- qt/locale/bitcoin_sd.ts \
- qt/locale/bitcoin_si.ts \
- qt/locale/bitcoin_sk.ts \
- qt/locale/bitcoin_sl.ts \
- qt/locale/bitcoin_sn.ts \
- qt/locale/bitcoin_so.ts \
- qt/locale/bitcoin_sq.ts \
- qt/locale/bitcoin_sr.ts \
- qt/locale/bitcoin_sr@ijekavianlatin.ts \
- qt/locale/bitcoin_sr@latin.ts \
- qt/locale/bitcoin_sv.ts \
- qt/locale/bitcoin_sw.ts \
- qt/locale/bitcoin_szl.ts \
- qt/locale/bitcoin_ta.ts \
- qt/locale/bitcoin_te.ts \
- qt/locale/bitcoin_tk.ts \
- qt/locale/bitcoin_tl.ts \
- qt/locale/bitcoin_tr.ts \
- qt/locale/bitcoin_ug.ts \
- qt/locale/bitcoin_uk.ts \
- qt/locale/bitcoin_ur.ts \
- qt/locale/bitcoin_uz.ts \
- qt/locale/bitcoin_uz@Cyrl.ts \
- qt/locale/bitcoin_uz@Latn.ts \
- qt/locale/bitcoin_vi.ts \
- qt/locale/bitcoin_yo.ts \
- qt/locale/bitcoin_yue.ts \
- qt/locale/bitcoin_zh-Hans.ts \
- qt/locale/bitcoin_zh-Hant.ts \
- qt/locale/bitcoin_zh.ts \
- qt/locale/bitcoin_zh_CN.ts \
- qt/locale/bitcoin_zh_HK.ts \
- qt/locale/bitcoin_zh_TW.ts \
- qt/locale/bitcoin_zu.ts
diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include
deleted file mode 100644
index 89c659d4b9..0000000000
--- a/src/Makefile.qttest.include
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright (c) 2013-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-bin_PROGRAMS += qt/test/test_bitcoin-qt
-TESTS += qt/test/test_bitcoin-qt
-
-TEST_QT_MOC_CPP = \
- qt/test/moc_apptests.cpp \
- qt/test/moc_optiontests.cpp \
- qt/test/moc_rpcnestedtests.cpp \
- qt/test/moc_uritests.cpp
-
-if ENABLE_WALLET
-TEST_QT_MOC_CPP += \
- qt/test/moc_addressbooktests.cpp \
- qt/test/moc_wallettests.cpp
-endif # ENABLE_WALLET
-
-TEST_QT_H = \
- qt/test/addressbooktests.h \
- qt/test/apptests.h \
- qt/test/optiontests.h \
- qt/test/rpcnestedtests.h \
- qt/test/uritests.h \
- qt/test/util.h \
- qt/test/wallettests.h
-
-qt_test_test_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
- $(QT_INCLUDES) $(QT_TEST_INCLUDES) $(BOOST_CPPFLAGS)
-
-qt_test_test_bitcoin_qt_SOURCES = \
- init/bitcoin-qt.cpp \
- qt/test/apptests.cpp \
- qt/test/optiontests.cpp \
- qt/test/rpcnestedtests.cpp \
- qt/test/test_main.cpp \
- qt/test/uritests.cpp \
- qt/test/util.cpp \
- $(TEST_QT_H)
-if ENABLE_WALLET
-qt_test_test_bitcoin_qt_SOURCES += \
- qt/test/addressbooktests.cpp \
- qt/test/wallettests.cpp \
- wallet/test/wallet_test_fixture.cpp
-endif # ENABLE_WALLET
-
-nodist_qt_test_test_bitcoin_qt_SOURCES = $(TEST_QT_MOC_CPP)
-
-qt_test_test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_NODE) $(LIBTEST_UTIL)
-if ENABLE_WALLET
-qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_UTIL) $(LIBBITCOIN_WALLET)
-endif
-if ENABLE_ZMQ
-qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) \
- $(LIBMEMENV) $(QT_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) \
- $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(LIBSECP256K1) \
- $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(SQLITE_LIBS)
-qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-qt_test_test_bitcoin_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
-
-CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno
-
-CLEANFILES += $(CLEAN_BITCOIN_QT_TEST)
-
-test_bitcoin_qt : qt/test/test_bitcoin-qt$(EXEEXT)
-
-test_bitcoin_qt_check : qt/test/test_bitcoin-qt$(EXEEXT) FORCE
- $(MAKE) check-TESTS TESTS=$^
-
-test_bitcoin_qt_clean: FORCE
- rm -f $(CLEAN_BITCOIN_QT_TEST) $(qt_test_test_bitcoin_qt_OBJECTS)
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
deleted file mode 100644
index c396cc2ebf..0000000000
--- a/src/Makefile.test.include
+++ /dev/null
@@ -1,493 +0,0 @@
-# Copyright (c) 2013-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-if ENABLE_FUZZ_BINARY
-noinst_PROGRAMS += test/fuzz/fuzz
-endif
-
-if ENABLE_TESTS
-bin_PROGRAMS += test/test_bitcoin
-endif
-
-TEST_SRCDIR = test
-TEST_BINARY=test/test_bitcoin$(EXEEXT)
-FUZZ_BINARY=test/fuzz/fuzz$(EXEEXT)
-
-JSON_TEST_FILES = \
- test/data/script_tests.json \
- test/data/bip341_wallet_vectors.json \
- test/data/base58_encode_decode.json \
- test/data/blockfilters.json \
- test/data/key_io_valid.json \
- test/data/key_io_invalid.json \
- test/data/script_tests.json \
- test/data/sighash.json \
- test/data/tx_invalid.json \
- test/data/tx_valid.json
-
-RAW_TEST_FILES = \
- test/data/asmap.raw
-
-GENERATED_TEST_FILES = $(JSON_TEST_FILES:.json=.json.h) $(RAW_TEST_FILES:.raw=.raw.h)
-
-BITCOIN_TEST_SUITE = \
- test/main.cpp \
- $(TEST_UTIL_H)
-
-FUZZ_SUITE_LD_COMMON = \
- $(LIBTEST_UTIL) \
- $(LIBTEST_FUZZ) \
- $(LIBBITCOIN_NODE) \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBBITCOIN_CLI) \
- $(LIBUNIVALUE) \
- $(LIBLEVELDB) \
- $(LIBMEMENV) \
- $(LIBSECP256K1) \
- $(MINISKETCH_LIBS) \
- $(EVENT_LIBS) \
- $(EVENT_PTHREADS_LIBS)
-
-if USE_UPNP
-FUZZ_SUITE_LD_COMMON += $(MINIUPNPC_LIBS)
-endif
-
-if USE_NATPMP
-FUZZ_SUITE_LD_COMMON += $(NATPMP_LIBS)
-endif
-
-# test_bitcoin binary #
-BITCOIN_TESTS =\
- test/addrman_tests.cpp \
- test/allocator_tests.cpp \
- test/amount_tests.cpp \
- test/argsman_tests.cpp \
- test/arith_uint256_tests.cpp \
- test/banman_tests.cpp \
- test/base32_tests.cpp \
- test/base58_tests.cpp \
- test/base64_tests.cpp \
- test/bech32_tests.cpp \
- test/bip32_tests.cpp \
- test/bip324_tests.cpp \
- test/blockchain_tests.cpp \
- test/blockencodings_tests.cpp \
- test/blockfilter_index_tests.cpp \
- test/blockfilter_tests.cpp \
- test/blockmanager_tests.cpp \
- test/bloom_tests.cpp \
- test/bswap_tests.cpp \
- test/checkqueue_tests.cpp \
- test/cluster_linearize_tests.cpp \
- test/coins_tests.cpp \
- test/coinscachepair_tests.cpp \
- test/coinstatsindex_tests.cpp \
- test/common_url_tests.cpp \
- test/compilerbug_tests.cpp \
- test/compress_tests.cpp \
- test/crypto_tests.cpp \
- test/cuckoocache_tests.cpp \
- test/dbwrapper_tests.cpp \
- test/denialofservice_tests.cpp \
- test/descriptor_tests.cpp \
- test/disconnected_transactions.cpp \
- test/feefrac_tests.cpp \
- test/flatfile_tests.cpp \
- test/fs_tests.cpp \
- test/getarg_tests.cpp \
- test/hash_tests.cpp \
- test/headers_sync_chainwork_tests.cpp \
- test/httpserver_tests.cpp \
- test/i2p_tests.cpp \
- test/interfaces_tests.cpp \
- test/key_io_tests.cpp \
- test/key_tests.cpp \
- test/logging_tests.cpp \
- test/mempool_tests.cpp \
- test/merkle_tests.cpp \
- test/merkleblock_tests.cpp \
- test/miner_tests.cpp \
- test/miniminer_tests.cpp \
- test/miniscript_tests.cpp \
- test/minisketch_tests.cpp \
- test/multisig_tests.cpp \
- test/net_peer_connection_tests.cpp \
- test/net_peer_eviction_tests.cpp \
- test/net_tests.cpp \
- test/netbase_tests.cpp \
- test/node_warnings_tests.cpp \
- test/orphanage_tests.cpp \
- test/peerman_tests.cpp \
- test/pmt_tests.cpp \
- test/policy_fee_tests.cpp \
- test/policyestimator_tests.cpp \
- test/pool_tests.cpp \
- test/pow_tests.cpp \
- test/prevector_tests.cpp \
- test/raii_event_tests.cpp \
- test/random_tests.cpp \
- test/rbf_tests.cpp \
- test/rest_tests.cpp \
- test/result_tests.cpp \
- test/reverselock_tests.cpp \
- test/rpc_tests.cpp \
- test/sanity_tests.cpp \
- test/scheduler_tests.cpp \
- test/script_p2sh_tests.cpp \
- test/script_parse_tests.cpp \
- test/script_segwit_tests.cpp \
- test/script_standard_tests.cpp \
- test/script_tests.cpp \
- test/scriptnum10.h \
- test/scriptnum_tests.cpp \
- test/serfloat_tests.cpp \
- test/serialize_tests.cpp \
- test/settings_tests.cpp \
- test/sighash_tests.cpp \
- test/sigopcount_tests.cpp \
- test/skiplist_tests.cpp \
- test/sock_tests.cpp \
- test/span_tests.cpp \
- test/streams_tests.cpp \
- test/sync_tests.cpp \
- test/system_tests.cpp \
- test/timeoffsets_tests.cpp \
- test/torcontrol_tests.cpp \
- test/transaction_tests.cpp \
- test/translation_tests.cpp \
- test/txindex_tests.cpp \
- test/txpackage_tests.cpp \
- test/txreconciliation_tests.cpp \
- test/txrequest_tests.cpp \
- test/txvalidation_tests.cpp \
- test/txvalidationcache_tests.cpp \
- test/uint256_tests.cpp \
- test/util_tests.cpp \
- test/util_threadnames_tests.cpp \
- test/validation_block_tests.cpp \
- test/validation_chainstate_tests.cpp \
- test/validation_chainstatemanager_tests.cpp \
- test/validation_flush_tests.cpp \
- test/validation_tests.cpp \
- test/validationinterface_tests.cpp \
- test/versionbits_tests.cpp
-
-if ENABLE_WALLET
-BITCOIN_TESTS += \
- wallet/test/feebumper_tests.cpp \
- wallet/test/psbt_wallet_tests.cpp \
- wallet/test/spend_tests.cpp \
- wallet/test/wallet_tests.cpp \
- wallet/test/walletdb_tests.cpp \
- wallet/test/wallet_crypto_tests.cpp \
- wallet/test/wallet_transaction_tests.cpp \
- wallet/test/coinselector_tests.cpp \
- wallet/test/init_tests.cpp \
- wallet/test/ismine_tests.cpp \
- wallet/test/rpc_util_tests.cpp \
- wallet/test/scriptpubkeyman_tests.cpp \
- wallet/test/walletload_tests.cpp \
- wallet/test/group_outputs_tests.cpp
-
-FUZZ_SUITE_LD_COMMON +=\
- $(SQLITE_LIBS) \
- $(BDB_LIBS)
-
-if USE_BDB
-BITCOIN_TESTS += wallet/test/db_tests.cpp
-endif
-
-FUZZ_WALLET_SRC = \
- wallet/test/fuzz/coincontrol.cpp \
- wallet/test/fuzz/coinselection.cpp \
- wallet/test/fuzz/crypter.cpp \
- wallet/test/fuzz/fees.cpp \
- wallet/test/fuzz/parse_iso8601.cpp \
- wallet/test/fuzz/wallet_bdb_parser.cpp
-
-if USE_SQLITE
-FUZZ_WALLET_SRC += \
- wallet/test/fuzz/notifications.cpp \
- wallet/test/fuzz/scriptpubkeyman.cpp
-endif # USE_SQLITE
-
-BITCOIN_TEST_SUITE += \
- wallet/test/wallet_test_fixture.cpp \
- wallet/test/wallet_test_fixture.h \
- wallet/test/init_test_fixture.cpp \
- wallet/test/init_test_fixture.h
-endif # ENABLE_WALLET
-
-if BUILD_MULTIPROCESS
-# Add boost ipc_tests definition to BITCOIN_TESTS
-BITCOIN_TESTS += test/ipc_tests.cpp
-
-# Build ipc_test code in a separate library so it can be compiled with custom
-# LIBMULTIPROCESS_CFLAGS without those flags affecting other tests
-LIBBITCOIN_IPC_TEST=libbitcoin_ipc_test.a
-EXTRA_LIBRARIES += $(LIBBITCOIN_IPC_TEST)
-libbitcoin_ipc_test_a_SOURCES = \
- test/ipc_test.cpp \
- test/ipc_test.h
-libbitcoin_ipc_test_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-libbitcoin_ipc_test_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) $(LIBMULTIPROCESS_CFLAGS)
-
-# Generate various .c++/.h files from the ipc_test.capnp file
-include $(MPGEN_PREFIX)/include/mpgen.mk
-EXTRA_DIST += test/ipc_test.capnp
-libbitcoin_ipc_test_mpgen_output = \
- test/ipc_test.capnp.c++ \
- test/ipc_test.capnp.h \
- test/ipc_test.capnp.proxy-client.c++ \
- test/ipc_test.capnp.proxy-server.c++ \
- test/ipc_test.capnp.proxy-types.c++ \
- test/ipc_test.capnp.proxy-types.h \
- test/ipc_test.capnp.proxy.h
-nodist_libbitcoin_ipc_test_a_SOURCES = $(libbitcoin_ipc_test_mpgen_output)
-CLEANFILES += $(libbitcoin_ipc_test_mpgen_output)
-endif
-
-# Explicitly list dependencies on generated headers as described in
-# https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
-test/libbitcoin_ipc_test_a-ipc_test.$(OBJEXT): test/ipc_test.capnp.h
-
-test_test_bitcoin_SOURCES = $(BITCOIN_TEST_SUITE) $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
-test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(TESTDEFS) $(BOOST_CPPFLAGS) $(EVENT_CFLAGS)
-test_test_bitcoin_LDADD = $(LIBTEST_UTIL)
-if ENABLE_WALLET
-test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET)
-test_test_bitcoin_CPPFLAGS += $(BDB_CPPFLAGS)
-endif
-if BUILD_MULTIPROCESS
-test_test_bitcoin_LDADD += $(LIBBITCOIN_IPC_TEST) $(LIBMULTIPROCESS_LIBS)
-endif
-
-test_test_bitcoin_LDADD += $(LIBBITCOIN_NODE) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) \
- $(LIBLEVELDB) $(LIBMEMENV) $(LIBSECP256K1) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS) $(MINISKETCH_LIBS)
-test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-
-test_test_bitcoin_LDADD += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS)
-test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) -static
-
-if ENABLE_ZMQ
-test_test_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-FUZZ_SUITE_LD_COMMON += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-
-if ENABLE_FUZZ_BINARY
-test_fuzz_fuzz_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(EVENT_CFLAGS)
-test_fuzz_fuzz_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-test_fuzz_fuzz_LDADD = $(FUZZ_SUITE_LD_COMMON)
-test_fuzz_fuzz_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-test_fuzz_fuzz_SOURCES = \
- $(FUZZ_WALLET_SRC) \
- test/fuzz/addition_overflow.cpp \
- test/fuzz/addrman.cpp \
- test/fuzz/asmap.cpp \
- test/fuzz/asmap_direct.cpp \
- test/fuzz/autofile.cpp \
- test/fuzz/banman.cpp \
- test/fuzz/base_encode_decode.cpp \
- test/fuzz/bech32.cpp \
- test/fuzz/bip324.cpp \
- test/fuzz/bitdeque.cpp \
- test/fuzz/bitset.cpp \
- test/fuzz/block.cpp \
- test/fuzz/block_header.cpp \
- test/fuzz/block_index.cpp \
- test/fuzz/blockfilter.cpp \
- test/fuzz/bloom_filter.cpp \
- test/fuzz/buffered_file.cpp \
- test/fuzz/chain.cpp \
- test/fuzz/checkqueue.cpp \
- test/fuzz/cluster_linearize.cpp \
- test/fuzz/coins_view.cpp \
- test/fuzz/coinscache_sim.cpp \
- test/fuzz/connman.cpp \
- test/fuzz/crypto.cpp \
- test/fuzz/crypto_aes256.cpp \
- test/fuzz/crypto_aes256cbc.cpp \
- test/fuzz/crypto_chacha20.cpp \
- test/fuzz/crypto_chacha20poly1305.cpp \
- test/fuzz/crypto_common.cpp \
- test/fuzz/crypto_diff_fuzz_chacha20.cpp \
- test/fuzz/crypto_hkdf_hmac_sha256_l32.cpp \
- test/fuzz/crypto_poly1305.cpp \
- test/fuzz/cuckoocache.cpp \
- test/fuzz/decode_tx.cpp \
- test/fuzz/descriptor_parse.cpp \
- test/fuzz/deserialize.cpp \
- test/fuzz/eval_script.cpp \
- test/fuzz/feefrac.cpp \
- test/fuzz/fee_rate.cpp \
- test/fuzz/feeratediagram.cpp \
- test/fuzz/fees.cpp \
- test/fuzz/flatfile.cpp \
- test/fuzz/float.cpp \
- test/fuzz/golomb_rice.cpp \
- test/fuzz/headerssync.cpp \
- test/fuzz/hex.cpp \
- test/fuzz/http_request.cpp \
- test/fuzz/i2p.cpp \
- test/fuzz/integer.cpp \
- test/fuzz/key.cpp \
- test/fuzz/key_io.cpp \
- test/fuzz/kitchen_sink.cpp \
- test/fuzz/load_external_block_file.cpp \
- test/fuzz/locale.cpp \
- test/fuzz/merkleblock.cpp \
- test/fuzz/message.cpp \
- test/fuzz/miniscript.cpp \
- test/fuzz/minisketch.cpp \
- test/fuzz/mini_miner.cpp \
- test/fuzz/muhash.cpp \
- test/fuzz/multiplication_overflow.cpp \
- test/fuzz/net.cpp \
- test/fuzz/net_permissions.cpp \
- test/fuzz/netaddress.cpp \
- test/fuzz/netbase_dns_lookup.cpp \
- test/fuzz/node_eviction.cpp \
- test/fuzz/p2p_handshake.cpp \
- test/fuzz/p2p_transport_serialization.cpp \
- test/fuzz/package_eval.cpp \
- test/fuzz/parse_hd_keypath.cpp \
- test/fuzz/parse_numbers.cpp \
- test/fuzz/parse_script.cpp \
- test/fuzz/parse_univalue.cpp \
- test/fuzz/partially_downloaded_block.cpp \
- test/fuzz/policy_estimator.cpp \
- test/fuzz/policy_estimator_io.cpp \
- test/fuzz/poolresource.cpp \
- test/fuzz/pow.cpp \
- test/fuzz/prevector.cpp \
- test/fuzz/primitives_transaction.cpp \
- test/fuzz/process_message.cpp \
- test/fuzz/process_messages.cpp \
- test/fuzz/protocol.cpp \
- test/fuzz/psbt.cpp \
- test/fuzz/random.cpp \
- test/fuzz/rbf.cpp \
- test/fuzz/rolling_bloom_filter.cpp \
- test/fuzz/rpc.cpp \
- test/fuzz/script.cpp \
- test/fuzz/script_assets_test_minimizer.cpp \
- test/fuzz/script_descriptor_cache.cpp \
- test/fuzz/script_flags.cpp \
- test/fuzz/script_format.cpp \
- test/fuzz/script_interpreter.cpp \
- test/fuzz/script_ops.cpp \
- test/fuzz/script_parsing.cpp \
- test/fuzz/script_sigcache.cpp \
- test/fuzz/script_sign.cpp \
- test/fuzz/scriptnum_ops.cpp \
- test/fuzz/secp256k1_ec_seckey_import_export_der.cpp \
- test/fuzz/secp256k1_ecdsa_signature_parse_der_lax.cpp \
- test/fuzz/signature_checker.cpp \
- test/fuzz/signet.cpp \
- test/fuzz/socks5.cpp \
- test/fuzz/span.cpp \
- test/fuzz/string.cpp \
- test/fuzz/strprintf.cpp \
- test/fuzz/system.cpp \
- test/fuzz/timeoffsets.cpp \
- test/fuzz/torcontrol.cpp \
- test/fuzz/transaction.cpp \
- test/fuzz/tx_in.cpp \
- test/fuzz/tx_out.cpp \
- test/fuzz/tx_pool.cpp \
- test/fuzz/txorphan.cpp \
- test/fuzz/txrequest.cpp \
- test/fuzz/utxo_snapshot.cpp \
- test/fuzz/utxo_total_supply.cpp \
- test/fuzz/validation_load_mempool.cpp \
- test/fuzz/vecdeque.cpp \
- test/fuzz/versionbits.cpp
-endif # ENABLE_FUZZ_BINARY
-
-nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES)
-
-$(BITCOIN_TESTS): $(GENERATED_TEST_FILES)
-
-CLEAN_BITCOIN_TEST = test/*.gcda test/*.gcno test/fuzz/*.gcda test/fuzz/*.gcno test/util/*.gcda test/util/*.gcno $(GENERATED_TEST_FILES) $(addsuffix .log,$(basename $(BITCOIN_TESTS)))
-
-CLEANFILES += $(CLEAN_BITCOIN_TEST)
-
-if TARGET_WINDOWS
-bitcoin_test: $(TEST_BINARY)
-else
-if ENABLE_BENCH
-bitcoin_test: $(TEST_BINARY) $(BENCH_BINARY)
-else
-bitcoin_test: $(TEST_BINARY)
-endif
-endif
-
-bitcoin_test_check: $(TEST_BINARY) FORCE
- $(MAKE) check-TESTS TESTS=$^
-
-bitcoin_test_clean : FORCE
- rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY)
-
-check-unit: $(BITCOIN_TESTS:.cpp=.cpp.test)
-
-check-local: check-unit
-if BUILD_BITCOIN_TX
- @echo "Running test/util/test_runner.py..."
- $(PYTHON) $(top_builddir)/test/util/test_runner.py
-endif
- @echo "Running test/util/rpcauth-test.py..."
- $(PYTHON) $(top_builddir)/test/util/rpcauth-test.py
-if TARGET_WINDOWS
-else
-if ENABLE_BENCH
- @echo "Running bench/bench_bitcoin (one iteration sanity check, only high priority)..."
- $(BENCH_BINARY) -sanity-check -priority-level=high
-endif
-endif
- $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C secp256k1 check
-
-if ENABLE_TESTS
-UNIVALUE_TESTS = univalue/test/object univalue/test/unitester
-noinst_PROGRAMS += $(UNIVALUE_TESTS)
-TESTS += $(UNIVALUE_TESTS)
-
-univalue_test_unitester_SOURCES = $(UNIVALUE_TEST_UNITESTER_INT)
-univalue_test_unitester_LDADD = $(LIBUNIVALUE)
-univalue_test_unitester_CPPFLAGS = -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT) -DJSON_TEST_SRC=\"$(srcdir)/$(UNIVALUE_TEST_DATA_DIR_INT)\"
-univalue_test_unitester_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
-
-univalue_test_object_SOURCES = $(UNIVALUE_TEST_OBJECT_INT)
-univalue_test_object_LDADD = $(LIBUNIVALUE)
-univalue_test_object_CPPFLAGS = -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT)
-univalue_test_object_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
-endif
-
-%.cpp.test: %.cpp
- @echo Running tests: $$(\
- cat $< | \
- grep -E "(BOOST_FIXTURE_TEST_SUITE\\(|BOOST_AUTO_TEST_SUITE\\()" | \
- cut -d '(' -f 2 | cut -d ',' -f 1 | cut -d ')' -f 1\
- ) from $<
- $(AM_V_at)export TEST_LOGFILE=$(abs_builddir)/$$(\
- echo $< | grep -E -o "(wallet/test/.*\.cpp|test/.*\.cpp)" | $(SED) -e s/\.cpp/.log/ \
- ) && \
- $(TEST_BINARY) --catch_system_errors=no -l test_suite -t "$$(\
- cat $< | \
- grep -E "(BOOST_FIXTURE_TEST_SUITE\\(|BOOST_AUTO_TEST_SUITE\\()" | \
- cut -d '(' -f 2 | cut -d ',' -f 1 | cut -d ')' -f 1\
- )" -- DEBUG_LOG_OUT > "$$TEST_LOGFILE" 2>&1 || (cat "$$TEST_LOGFILE" && false)
-
-%.json.h: %.json
- @$(MKDIR_P) $(@D)
- $(AM_V_GEN) { \
- echo "#include <string>" && \
- echo "namespace json_tests{" && \
- echo "static const std::string $(*F){" && \
- $(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' && \
- echo "};};"; \
- } > "$@.new" && mv -f "$@.new" "$@"
diff --git a/src/Makefile.test_fuzz.include b/src/Makefile.test_fuzz.include
deleted file mode 100644
index b4337991e4..0000000000
--- a/src/Makefile.test_fuzz.include
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2013-2020 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-LIBTEST_FUZZ=libtest_fuzz.a
-
-EXTRA_LIBRARIES += \
- $(LIBTEST_FUZZ)
-
-TEST_FUZZ_H = \
- test/fuzz/fuzz.h \
- test/fuzz/FuzzedDataProvider.h \
- test/fuzz/util.h \
- test/fuzz/util/descriptor.h \
- test/fuzz/util/mempool.h \
- test/fuzz/util/net.h
-
-libtest_fuzz_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libtest_fuzz_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libtest_fuzz_a_SOURCES = \
- test/fuzz/fuzz.cpp \
- test/fuzz/util.cpp \
- test/fuzz/util/descriptor.cpp \
- test/fuzz/util/mempool.cpp \
- test/fuzz/util/net.cpp \
- $(TEST_FUZZ_H)
diff --git a/src/Makefile.test_util.include b/src/Makefile.test_util.include
deleted file mode 100644
index 0c0e849fba..0000000000
--- a/src/Makefile.test_util.include
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (c) 2013-2019 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-LIBTEST_UTIL=libtest_util.a
-
-EXTRA_LIBRARIES += \
- $(LIBTEST_UTIL)
-
-TEST_UTIL_H = \
- test/util/blockfilter.h \
- test/util/chainstate.h \
- test/util/cluster_linearize.h \
- test/util/coins.h \
- test/util/index.h \
- test/util/json.h \
- test/util/logging.h \
- test/util/mining.h \
- test/util/net.h \
- test/util/poolresourcetester.h \
- test/util/random.h \
- test/util/script.h \
- test/util/setup_common.h \
- test/util/str.h \
- test/util/transaction_utils.h \
- test/util/txmempool.h \
- test/util/validation.h
-
-if ENABLE_WALLET
-TEST_UTIL_H += wallet/test/util.h
-endif # ENABLE_WALLET
-
-libtest_util_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libtest_util_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libtest_util_a_SOURCES = \
- test/util/blockfilter.cpp \
- test/util/coins.cpp \
- test/util/index.cpp \
- test/util/json.cpp \
- test/util/logging.cpp \
- test/util/mining.cpp \
- test/util/net.cpp \
- test/util/random.cpp \
- test/util/script.cpp \
- test/util/setup_common.cpp \
- test/util/str.cpp \
- test/util/transaction_utils.cpp \
- test/util/txmempool.cpp \
- test/util/validation.cpp
-
-if ENABLE_WALLET
-libtest_util_a_SOURCES += wallet/test/util.cpp
-endif # ENABLE_WALLET
-
-libtest_util_a_SOURCES += $(TEST_UTIL_H)
diff --git a/src/Makefile.univalue.include b/src/Makefile.univalue.include
deleted file mode 100644
index 3644e36368..0000000000
--- a/src/Makefile.univalue.include
+++ /dev/null
@@ -1,6 +0,0 @@
-include univalue/sources.mk
-
-LIBUNIVALUE = libunivalue.la
-noinst_LTLIBRARIES += $(LIBUNIVALUE)
-libunivalue_la_SOURCES = $(UNIVALUE_LIB_SOURCES_INT) $(UNIVALUE_DIST_HEADERS_INT) $(UNIVALUE_LIB_HEADERS_INT) $(UNIVALUE_TEST_FILES_INT)
-libunivalue_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT)
diff --git a/src/addrman.cpp b/src/addrman.cpp
index 054a9bee32..7aa97fa1b7 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -342,7 +342,7 @@ void AddrManImpl::Unserialize(Stream& s_)
serialized_asmap_checksum == supplied_asmap_checksum};
if (!restore_bucketing) {
- LogPrint(BCLog::ADDRMAN, "Bucketing method was updated, re-bucketing addrman entries from disk\n");
+ LogDebug(BCLog::ADDRMAN, "Bucketing method was updated, re-bucketing addrman entries from disk\n");
}
for (auto bucket_entry : bucket_entries) {
@@ -387,7 +387,7 @@ void AddrManImpl::Unserialize(Stream& s_)
}
}
if (nLost + nLostUnk > 0) {
- LogPrint(BCLog::ADDRMAN, "addrman lost %i new and %i tried addresses due to collisions or invalid addresses\n", nLostUnk, nLost);
+ LogDebug(BCLog::ADDRMAN, "addrman lost %i new and %i tried addresses due to collisions or invalid addresses\n", nLostUnk, nLost);
}
const int check_code{CheckAddrman()};
@@ -481,7 +481,7 @@ void AddrManImpl::ClearNew(int nUBucket, int nUBucketPos)
assert(infoDelete.nRefCount > 0);
infoDelete.nRefCount--;
vvNew[nUBucket][nUBucketPos] = -1;
- LogPrint(BCLog::ADDRMAN, "Removed %s from new[%i][%i]\n", infoDelete.ToStringAddrPort(), nUBucket, nUBucketPos);
+ LogDebug(BCLog::ADDRMAN, "Removed %s from new[%i][%i]\n", infoDelete.ToStringAddrPort(), nUBucket, nUBucketPos);
if (infoDelete.nRefCount == 0) {
Delete(nIdDelete);
}
@@ -536,7 +536,7 @@ void AddrManImpl::MakeTried(AddrInfo& info, int nId)
vvNew[nUBucket][nUBucketPos] = nIdEvict;
nNew++;
m_network_counts[infoOld.GetNetwork()].n_new++;
- LogPrint(BCLog::ADDRMAN, "Moved %s from tried[%i][%i] to new[%i][%i] to make space\n",
+ LogDebug(BCLog::ADDRMAN, "Moved %s from tried[%i][%i] to new[%i][%i] to make space\n",
infoOld.ToStringAddrPort(), nKBucket, nKBucketPos, nUBucket, nUBucketPos);
}
assert(vvTried[nKBucket][nKBucketPos] == -1);
@@ -612,7 +612,7 @@ bool AddrManImpl::AddSingle(const CAddress& addr, const CNetAddr& source, std::c
pinfo->nRefCount++;
vvNew[nUBucket][nUBucketPos] = nId;
const auto mapped_as{m_netgroupman.GetMappedAS(addr)};
- LogPrint(BCLog::ADDRMAN, "Added %s%s to new[%i][%i]\n",
+ LogDebug(BCLog::ADDRMAN, "Added %s%s to new[%i][%i]\n",
addr.ToStringAddrPort(), (mapped_as ? strprintf(" mapped to AS%i", mapped_as) : ""), nUBucket, nUBucketPos);
} else {
if (pinfo->nRefCount == 0) {
@@ -663,7 +663,7 @@ bool AddrManImpl::Good_(const CService& addr, bool test_before_evict, NodeSecond
}
// Output the entry we'd be colliding with, for debugging purposes
auto colliding_entry = mapInfo.find(vvTried[tried_bucket][tried_bucket_pos]);
- LogPrint(BCLog::ADDRMAN, "Collision with %s while attempting to move %s to tried table. Collisions=%d\n",
+ LogDebug(BCLog::ADDRMAN, "Collision with %s while attempting to move %s to tried table. Collisions=%d\n",
colliding_entry != mapInfo.end() ? colliding_entry->second.ToStringAddrPort() : "",
addr.ToStringAddrPort(),
m_tried_collisions.size());
@@ -672,7 +672,7 @@ bool AddrManImpl::Good_(const CService& addr, bool test_before_evict, NodeSecond
// move nId to the tried tables
MakeTried(info, nId);
const auto mapped_as{m_netgroupman.GetMappedAS(addr)};
- LogPrint(BCLog::ADDRMAN, "Moved %s%s to tried[%i][%i]\n",
+ LogDebug(BCLog::ADDRMAN, "Moved %s%s to tried[%i][%i]\n",
addr.ToStringAddrPort(), (mapped_as ? strprintf(" mapped to AS%i", mapped_as) : ""), tried_bucket, tried_bucket_pos);
return true;
}
@@ -685,7 +685,7 @@ bool AddrManImpl::Add_(const std::vector<CAddress>& vAddr, const CNetAddr& sourc
added += AddSingle(*it, source, time_penalty) ? 1 : 0;
}
if (added > 0) {
- LogPrint(BCLog::ADDRMAN, "Added %i addresses (of %i) from %s: %i tried, %i new\n", added, vAddr.size(), source.ToStringAddr(), nTried, nNew);
+ LogDebug(BCLog::ADDRMAN, "Added %i addresses (of %i) from %s: %i tried, %i new\n", added, vAddr.size(), source.ToStringAddr(), nTried, nNew);
}
return added > 0;
}
@@ -710,7 +710,7 @@ void AddrManImpl::Attempt_(const CService& addr, bool fCountFailure, NodeSeconds
}
}
-std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::optional<Network> network) const
+std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, const std::unordered_set<Network>& networks) const
{
AssertLockHeld(cs);
@@ -719,13 +719,18 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::option
size_t new_count = nNew;
size_t tried_count = nTried;
- if (network.has_value()) {
- auto it = m_network_counts.find(*network);
- if (it == m_network_counts.end()) return {};
-
- auto counts = it->second;
- new_count = counts.n_new;
- tried_count = counts.n_tried;
+ if (!networks.empty()) {
+ new_count = 0;
+ tried_count = 0;
+ for (auto& network : networks) {
+ auto it = m_network_counts.find(network);
+ if (it == m_network_counts.end()) {
+ continue;
+ }
+ auto counts = it->second;
+ new_count += counts.n_new;
+ tried_count += counts.n_tried;
+ }
}
if (new_only && new_count == 0) return {};
@@ -758,9 +763,9 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::option
position = (initial_position + i) % ADDRMAN_BUCKET_SIZE;
node_id = GetEntry(search_tried, bucket, position);
if (node_id != -1) {
- if (network.has_value()) {
+ if (!networks.empty()) {
const auto it{mapInfo.find(node_id)};
- if (Assume(it != mapInfo.end()) && it->second.GetNetwork() == *network) break;
+ if (Assume(it != mapInfo.end()) && networks.contains(it->second.GetNetwork())) break;
} else {
break;
}
@@ -777,7 +782,7 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::option
// With probability GetChance() * chance_factor, return the entry.
if (insecure_rand.randbits<30>() < chance_factor * info.GetChance() * (1 << 30)) {
- LogPrint(BCLog::ADDRMAN, "Selected %s from %s\n", info.ToStringAddrPort(), search_tried ? "tried" : "new");
+ LogDebug(BCLog::ADDRMAN, "Selected %s from %s\n", info.ToStringAddrPort(), search_tried ? "tried" : "new");
return {info, info.m_last_try};
}
@@ -837,7 +842,7 @@ std::vector<CAddress> AddrManImpl::GetAddr_(size_t max_addresses, size_t max_pct
addresses.push_back(ai);
}
- LogPrint(BCLog::ADDRMAN, "GetAddr returned %d random addresses\n", addresses.size());
+ LogDebug(BCLog::ADDRMAN, "GetAddr returned %d random addresses\n", addresses.size());
return addresses;
}
@@ -935,7 +940,7 @@ void AddrManImpl::ResolveCollisions_()
// Give address at least 60 seconds to successfully connect
if (current_time - info_old.m_last_try > 60s) {
- LogPrint(BCLog::ADDRMAN, "Replacing %s with %s in tried table\n", info_old.ToStringAddrPort(), info_new.ToStringAddrPort());
+ LogDebug(BCLog::ADDRMAN, "Replacing %s with %s in tried table\n", info_old.ToStringAddrPort(), info_new.ToStringAddrPort());
// Replaces an existing address already in the tried table with the new address
Good_(info_new, false, current_time);
@@ -945,7 +950,7 @@ void AddrManImpl::ResolveCollisions_()
// If the collision hasn't resolved in some reasonable amount of time,
// just evict the old entry -- we must not be able to
// connect to it for some reason.
- LogPrint(BCLog::ADDRMAN, "Unable to test; replacing %s with %s in tried table anyway\n", info_old.ToStringAddrPort(), info_new.ToStringAddrPort());
+ LogDebug(BCLog::ADDRMAN, "Unable to test; replacing %s with %s in tried table anyway\n", info_old.ToStringAddrPort(), info_new.ToStringAddrPort());
Good_(info_new, false, current_time);
erase_collision = true;
}
@@ -1208,11 +1213,11 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::SelectTriedCollision()
return ret;
}
-std::pair<CAddress, NodeSeconds> AddrManImpl::Select(bool new_only, std::optional<Network> network) const
+std::pair<CAddress, NodeSeconds> AddrManImpl::Select(bool new_only, const std::unordered_set<Network>& networks) const
{
LOCK(cs);
Check();
- auto addrRet = Select_(new_only, network);
+ auto addrRet = Select_(new_only, networks);
Check();
return addrRet;
}
@@ -1315,9 +1320,9 @@ std::pair<CAddress, NodeSeconds> AddrMan::SelectTriedCollision()
return m_impl->SelectTriedCollision();
}
-std::pair<CAddress, NodeSeconds> AddrMan::Select(bool new_only, std::optional<Network> network) const
+std::pair<CAddress, NodeSeconds> AddrMan::Select(bool new_only, const std::unordered_set<Network>& networks) const
{
- return m_impl->Select(new_only, network);
+ return m_impl->Select(new_only, networks);
}
std::vector<CAddress> AddrMan::GetAddr(size_t max_addresses, size_t max_pct, std::optional<Network> network, const bool filtered) const
diff --git a/src/addrman.h b/src/addrman.h
index be2ee8c2cb..ba6e13bf97 100644
--- a/src/addrman.h
+++ b/src/addrman.h
@@ -15,6 +15,7 @@
#include <cstdint>
#include <memory>
#include <optional>
+#include <unordered_set>
#include <utility>
#include <vector>
@@ -154,12 +155,12 @@ public:
* an address from the new table or an empty pair. Passing `false` will return an
* empty pair or an address from either the new or tried table (it does not
* guarantee a tried entry).
- * @param[in] network Select only addresses of this network (nullopt = all). Passing a network may
+ * @param[in] networks Select only addresses of these networks (empty = all). Passing networks may
* slow down the search.
* @return CAddress The record for the selected peer.
* seconds The last time we attempted to connect to that peer.
*/
- std::pair<CAddress, NodeSeconds> Select(bool new_only = false, std::optional<Network> network = std::nullopt) const;
+ std::pair<CAddress, NodeSeconds> Select(bool new_only = false, const std::unordered_set<Network>& networks = {}) const;
/**
* Return all or many randomly selected addresses, optionally by network.
diff --git a/src/addrman_impl.h b/src/addrman_impl.h
index dd7f7b318f..a581f1f6f9 100644
--- a/src/addrman_impl.h
+++ b/src/addrman_impl.h
@@ -125,7 +125,7 @@ public:
std::pair<CAddress, NodeSeconds> SelectTriedCollision() EXCLUSIVE_LOCKS_REQUIRED(!cs);
- std::pair<CAddress, NodeSeconds> Select(bool new_only, std::optional<Network> network) const
+ std::pair<CAddress, NodeSeconds> Select(bool new_only, const std::unordered_set<Network>& networks) const
EXCLUSIVE_LOCKS_REQUIRED(!cs);
std::vector<CAddress> GetAddr(size_t max_addresses, size_t max_pct, std::optional<Network> network, const bool filtered = true) const
@@ -252,7 +252,7 @@ private:
void Attempt_(const CService& addr, bool fCountFailure, NodeSeconds time) EXCLUSIVE_LOCKS_REQUIRED(cs);
- std::pair<CAddress, NodeSeconds> Select_(bool new_only, std::optional<Network> network) const EXCLUSIVE_LOCKS_REQUIRED(cs);
+ std::pair<CAddress, NodeSeconds> Select_(bool new_only, const std::unordered_set<Network>& networks) const EXCLUSIVE_LOCKS_REQUIRED(cs);
/** Helper to generalize looking up an addrman entry from either table.
*
diff --git a/src/banman.cpp b/src/banman.cpp
index 9f668d76a3..2dbfc76df2 100644
--- a/src/banman.cpp
+++ b/src/banman.cpp
@@ -36,7 +36,7 @@ void BanMan::LoadBanlist()
if (m_ban_db.Read(m_banned)) {
SweepBanned(); // sweep out unused entries
- LogPrint(BCLog::NET, "Loaded %d banned node addresses/subnets %dms\n", m_banned.size(),
+ LogDebug(BCLog::NET, "Loaded %d banned node addresses/subnets %dms\n", m_banned.size(),
Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
} else {
LogPrintf("Recreating the banlist database\n");
@@ -65,7 +65,7 @@ void BanMan::DumpBanlist()
m_is_dirty = true;
}
- LogPrint(BCLog::NET, "Flushed %d banned node addresses/subnets to disk %dms\n", banmap.size(),
+ LogDebug(BCLog::NET, "Flushed %d banned node addresses/subnets to disk %dms\n", banmap.size(),
Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
}
@@ -193,7 +193,7 @@ void BanMan::SweepBanned()
m_banned.erase(it++);
m_is_dirty = true;
notify_ui = true;
- LogPrint(BCLog::NET, "Removed banned node address/subnet: %s\n", sub_net.ToString());
+ LogDebug(BCLog::NET, "Removed banned node address/subnet: %s\n", sub_net.ToString());
} else {
++it;
}
diff --git a/src/bench/.gitignore b/src/bench/.gitignore
deleted file mode 100644
index e231fe4cab..0000000000
--- a/src/bench/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-bench_bitcoin
diff --git a/src/bench/CMakeLists.txt b/src/bench/CMakeLists.txt
new file mode 100644
index 0000000000..8a52980e07
--- /dev/null
+++ b/src/bench/CMakeLists.txt
@@ -0,0 +1,84 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+include(GenerateHeaders)
+generate_header_from_raw(data/block413567.raw benchmark::data)
+
+add_executable(bench_bitcoin
+ bench_bitcoin.cpp
+ bench.cpp
+ nanobench.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/data/block413567.raw.h
+# Benchmarks:
+ addrman.cpp
+ base58.cpp
+ bech32.cpp
+ bip324_ecdh.cpp
+ block_assemble.cpp
+ ccoins_caching.cpp
+ chacha20.cpp
+ checkblock.cpp
+ checkblockindex.cpp
+ checkqueue.cpp
+ cluster_linearize.cpp
+ crypto_hash.cpp
+ descriptors.cpp
+ disconnected_transactions.cpp
+ duplicate_inputs.cpp
+ ellswift.cpp
+ examples.cpp
+ gcs_filter.cpp
+ hashpadding.cpp
+ index_blockfilter.cpp
+ load_external.cpp
+ lockedpool.cpp
+ logging.cpp
+ mempool_eviction.cpp
+ mempool_stress.cpp
+ merkle_root.cpp
+ parse_hex.cpp
+ peer_eviction.cpp
+ poly1305.cpp
+ pool.cpp
+ prevector.cpp
+ random.cpp
+ readblock.cpp
+ rollingbloom.cpp
+ rpc_blockchain.cpp
+ rpc_mempool.cpp
+ sign_transaction.cpp
+ streams_findbyte.cpp
+ strencodings.cpp
+ util_time.cpp
+ verify_script.cpp
+ xor.cpp
+)
+
+target_link_libraries(bench_bitcoin
+ core_interface
+ test_util
+ bitcoin_node
+ Boost::headers
+)
+
+if(ENABLE_WALLET)
+ target_sources(bench_bitcoin
+ PRIVATE
+ coin_selection.cpp
+ wallet_balance.cpp
+ wallet_create.cpp
+ wallet_create_tx.cpp
+ wallet_loading.cpp
+ wallet_ismine.cpp
+ )
+ target_link_libraries(bench_bitcoin bitcoin_wallet)
+endif()
+
+add_test(NAME bench_sanity_check_high_priority
+ COMMAND bench_bitcoin -sanity-check -priority-level=high
+)
+
+install(TARGETS bench_bitcoin
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
diff --git a/src/bench/addrman.cpp b/src/bench/addrman.cpp
index f044feebba..ceef6c29ab 100644
--- a/src/bench/addrman.cpp
+++ b/src/bench/addrman.cpp
@@ -4,12 +4,18 @@
#include <addrman.h>
#include <bench/bench.h>
+#include <compat/compat.h>
+#include <netaddress.h>
#include <netbase.h>
#include <netgroup.h>
+#include <protocol.h>
#include <random.h>
+#include <span.h>
+#include <uint256.h>
#include <util/check.h>
#include <util/time.h>
+#include <cstring>
#include <optional>
#include <vector>
@@ -127,7 +133,7 @@ static void AddrManSelectByNetwork(benchmark::Bench& bench)
FillAddrMan(addrman);
bench.run([&] {
- (void)addrman.Select(/*new_only=*/false, NET_I2P);
+ (void)addrman.Select(/*new_only=*/false, {NET_I2P});
});
}
diff --git a/src/bench/base58.cpp b/src/bench/base58.cpp
index 78748bc5bd..f078c33964 100644
--- a/src/bench/base58.cpp
+++ b/src/bench/base58.cpp
@@ -2,11 +2,12 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <bench/bench.h>
-
#include <base58.h>
+#include <bench/bench.h>
+#include <span.h>
#include <array>
+#include <cstring>
#include <vector>
diff --git a/src/bench/bech32.cpp b/src/bench/bech32.cpp
index 9922653766..6aa73bd056 100644
--- a/src/bench/bech32.cpp
+++ b/src/bench/bech32.cpp
@@ -2,20 +2,19 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <bench/bench.h>
-
#include <bech32.h>
+#include <bench/bench.h>
#include <util/strencodings.h>
-#include <string>
#include <vector>
+using namespace util::hex_literals;
static void Bech32Encode(benchmark::Bench& bench)
{
- std::vector<uint8_t> v = ParseHex("c97f5a67ec381b760aeaf67573bc164845ff39a3bb26a1cee401ac67243b48db");
+ constexpr std::array<uint8_t, 32> v{"c97f5a67ec381b760aeaf67573bc164845ff39a3bb26a1cee401ac67243b48db"_hex_u8};
std::vector<unsigned char> tmp = {0};
- tmp.reserve(1 + 32 * 8 / 5);
+ tmp.reserve(1 + v.size() * 8 / 5);
ConvertBits<8, 5, true>([&](unsigned char c) { tmp.push_back(c); }, v.begin(), v.end());
bench.batch(v.size()).unit("byte").run([&] {
bech32::Encode(bech32::Encoding::BECH32, "bc", tmp);
diff --git a/src/bench/bench.cpp b/src/bench/bench.cpp
index 733f8085ca..a2dbb11888 100644
--- a/src/bench/bench.cpp
+++ b/src/bench/bench.cpp
@@ -4,16 +4,21 @@
#include <bench/bench.h>
-#include <test/util/setup_common.h>
+#include <test/util/setup_common.h> // IWYU pragma: keep
+#include <tinyformat.h>
#include <util/fs.h>
#include <util/string.h>
#include <chrono>
+#include <compare>
#include <fstream>
#include <functional>
#include <iostream>
#include <map>
+#include <ratio>
#include <regex>
+#include <set>
+#include <stdexcept>
#include <string>
#include <vector>
diff --git a/src/bench/bench.h b/src/bench/bench.h
index 6065ddf3fc..f0705f4fed 100644
--- a/src/bench/bench.h
+++ b/src/bench/bench.h
@@ -5,17 +5,18 @@
#ifndef BITCOIN_BENCH_BENCH_H
#define BITCOIN_BENCH_BENCH_H
+#include <bench/nanobench.h> // IWYU pragma: export
#include <util/fs.h>
#include <util/macros.h>
#include <chrono>
+#include <cstdint>
#include <functional>
#include <map>
#include <string>
+#include <utility>
#include <vector>
-#include <bench/nanobench.h> // IWYU pragma: export
-
/*
* Usage:
diff --git a/src/bench/bench_bitcoin.cpp b/src/bench/bench_bitcoin.cpp
index a1b880e40b..555dca7d59 100644
--- a/src/bench/bench_bitcoin.cpp
+++ b/src/bench/bench_bitcoin.cpp
@@ -3,15 +3,16 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
-#include <clientversion.h>
#include <common/args.h>
#include <crypto/sha256.h>
+#include <tinyformat.h>
#include <util/fs.h>
-#include <util/strencodings.h>
+#include <util/string.h>
#include <chrono>
#include <cstdint>
+#include <cstdlib>
+#include <exception>
#include <iostream>
#include <sstream>
#include <vector>
diff --git a/src/bench/bip324_ecdh.cpp b/src/bench/bip324_ecdh.cpp
index 88f3932ad8..e6a614dadf 100644
--- a/src/bench/bip324_ecdh.cpp
+++ b/src/bench/bip324_ecdh.cpp
@@ -3,12 +3,12 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
#include <key.h>
#include <pubkey.h>
#include <random.h>
#include <span.h>
+#include <algorithm>
#include <array>
#include <cstddef>
diff --git a/src/bench/block_assemble.cpp b/src/bench/block_assemble.cpp
index ba8ec16119..4005701cae 100644
--- a/src/bench/block_assemble.cpp
+++ b/src/bench/block_assemble.cpp
@@ -3,17 +3,21 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <consensus/validation.h>
-#include <crypto/sha256.h>
+#include <consensus/consensus.h>
#include <node/miner.h>
+#include <primitives/transaction.h>
#include <random.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/mining.h>
#include <test/util/script.h>
#include <test/util/setup_common.h>
-#include <txmempool.h>
#include <validation.h>
-
+#include <array>
+#include <cassert>
+#include <cstddef>
+#include <memory>
#include <vector>
static void AssembleBlock(benchmark::Bench& bench)
diff --git a/src/bench/ccoins_caching.cpp b/src/bench/ccoins_caching.cpp
index 05b2f5435c..351861536c 100644
--- a/src/bench/ccoins_caching.cpp
+++ b/src/bench/ccoins_caching.cpp
@@ -4,10 +4,15 @@
#include <bench/bench.h>
#include <coins.h>
+#include <consensus/amount.h>
+#include <key.h>
#include <policy/policy.h>
+#include <primitives/transaction.h>
+#include <script/script.h>
#include <script/signingprovider.h>
#include <test/util/transaction_utils.h>
+#include <cassert>
#include <vector>
// Microbenchmark for simple accesses to a CCoinsViewCache database. Note from
diff --git a/src/bench/chacha20.cpp b/src/bench/chacha20.cpp
index e0bb07d8be..f154d8c6be 100644
--- a/src/bench/chacha20.cpp
+++ b/src/bench/chacha20.cpp
@@ -6,6 +6,11 @@
#include <bench/bench.h>
#include <crypto/chacha20.h>
#include <crypto/chacha20poly1305.h>
+#include <span.h>
+
+#include <cstddef>
+#include <cstdint>
+#include <vector>
/* Number of bytes to process per iteration */
static const uint64_t BUFFER_SIZE_TINY = 64;
diff --git a/src/bench/checkblock.cpp b/src/bench/checkblock.cpp
index b81878006c..9558d64f19 100644
--- a/src/bench/checkblock.cpp
+++ b/src/bench/checkblock.cpp
@@ -3,15 +3,24 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
-
+#include <bench/data/block413567.raw.h>
#include <chainparams.h>
#include <common/args.h>
#include <consensus/validation.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <serialize.h>
+#include <span.h>
#include <streams.h>
#include <util/chaintype.h>
#include <validation.h>
+#include <cassert>
+#include <cstddef>
+#include <memory>
+#include <optional>
+#include <vector>
+
// These are the two major time-sinks which happen after we have fully received
// a block off the wire, but before we can relay the block on to peers using
// compact block relay.
diff --git a/src/bench/checkblockindex.cpp b/src/bench/checkblockindex.cpp
index e8a848dbd4..a5c152b387 100644
--- a/src/bench/checkblockindex.cpp
+++ b/src/bench/checkblockindex.cpp
@@ -6,6 +6,8 @@
#include <test/util/setup_common.h>
#include <validation.h>
+#include <memory>
+
static void CheckBlockIndex(benchmark::Bench& bench)
{
auto testing_setup{MakeNoLogFileContext<TestChain100Setup>()};
diff --git a/src/bench/checkqueue.cpp b/src/bench/checkqueue.cpp
index c973fe9f71..d1454f3634 100644
--- a/src/bench/checkqueue.cpp
+++ b/src/bench/checkqueue.cpp
@@ -7,9 +7,11 @@
#include <common/system.h>
#include <key.h>
#include <prevector.h>
-#include <pubkey.h>
#include <random.h>
+#include <cstddef>
+#include <cstdint>
+#include <utility>
#include <vector>
static const size_t BATCHES = 101;
diff --git a/src/bench/cluster_linearize.cpp b/src/bench/cluster_linearize.cpp
index 269648f4e2..cf071dda2d 100644
--- a/src/bench/cluster_linearize.cpp
+++ b/src/bench/cluster_linearize.cpp
@@ -3,11 +3,18 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
-#include <util/bitset.h>
#include <cluster_linearize.h>
+#include <test/util/cluster_linearize.h>
+#include <util/bitset.h>
+#include <util/strencodings.h>
+
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <vector>
using namespace cluster_linearize;
+using namespace util::hex_literals;
namespace {
@@ -41,8 +48,8 @@ DepGraph<SetType> MakeWideGraph(ClusterIndex ntx)
return depgraph;
}
-// Construct a difficult graph. These need at least sqrt(2^(n-1)) iterations in the best
-// known algorithms (purely empirically determined).
+// Construct a difficult graph. These need at least sqrt(2^(n-1)) iterations in the implemented
+// algorithm (purely empirically determined).
template<typename SetType>
DepGraph<SetType> MakeHardGraph(ClusterIndex ntx)
{
@@ -107,17 +114,18 @@ DepGraph<SetType> MakeHardGraph(ClusterIndex ntx)
return depgraph;
}
-/** Benchmark that does search-based candidate finding with 10000 iterations.
+/** Benchmark that does search-based candidate finding with a specified number of iterations.
*
- * Its goal is measuring how much time every additional search iteration in linearization costs.
+ * Its goal is measuring how much time every additional search iteration in linearization costs,
+ * by running with a low and a high count, subtracting the results, and divided by the number
+ * iterations difference.
*/
template<typename SetType>
-void BenchLinearizePerIterWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
+void BenchLinearizeWorstCase(ClusterIndex ntx, benchmark::Bench& bench, uint64_t iter_limit)
{
const auto depgraph = MakeHardGraph<SetType>(ntx);
- const auto iter_limit = std::min<uint64_t>(10000, uint64_t{1} << (ntx / 2 - 1));
uint64_t rng_seed = 0;
- bench.batch(iter_limit).unit("iters").run([&] {
+ bench.run([&] {
SearchCandidateFinder finder(depgraph, rng_seed++);
auto [candidate, iters_performed] = finder.FindCandidateSet(iter_limit, {});
assert(iters_performed == iter_limit);
@@ -128,11 +136,12 @@ void BenchLinearizePerIterWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
*
* Its goal is measuring how much time linearization may take without any search iterations.
*
- * If P is the resulting time of BenchLinearizePerIterWorstCase, and N is the resulting time of
- * BenchLinearizeNoItersWorstCase*, then an invocation of Linearize with max_iterations=m should
- * take no more than roughly N+m*P time. This may however be an overestimate, as the worst cases
- * do not coincide (the ones that are worst for linearization without any search happen to be ones
- * that do not need many search iterations).
+ * If P is the benchmarked per-iteration count (obtained by running BenchLinearizeWorstCase for a
+ * high and a low iteration count, subtracting them, and dividing by the difference in count), and
+ * N is the resulting time of BenchLinearizeNoItersWorstCase*, then an invocation of Linearize with
+ * max_iterations=m should take no more than roughly N+m*P time. This may however be an
+ * overestimate, as the worst cases do not coincide (the ones that are worst for linearization
+ * without any search happen to be ones that do not need many search iterations).
*
* This benchmark exercises a worst case for AncestorCandidateFinder, but for which improvement is
* cheap.
@@ -201,14 +210,57 @@ void BenchMergeLinearizationsWorstCase(ClusterIndex ntx, benchmark::Bench& bench
});
}
+template<size_t N>
+void BenchLinearizeOptimally(benchmark::Bench& bench, const std::array<uint8_t, N>& serialized)
+{
+ // Determine how many transactions the serialized cluster has.
+ ClusterIndex num_tx{0};
+ {
+ SpanReader reader{serialized};
+ DepGraph<BitSet<128>> depgraph;
+ reader >> Using<DepGraphFormatter>(depgraph);
+ num_tx = depgraph.TxCount();
+ assert(num_tx < 128);
+ }
+
+ SpanReader reader{serialized};
+ auto runner_fn = [&]<typename SetType>() noexcept {
+ DepGraph<SetType> depgraph;
+ reader >> Using<DepGraphFormatter>(depgraph);
+ uint64_t rng_seed = 0;
+ bench.run([&] {
+ auto res = Linearize(depgraph, /*max_iterations=*/10000000, rng_seed++);
+ assert(res.second);
+ });
+ };
+
+ if (num_tx <= 32) {
+ runner_fn.template operator()<BitSet<32>>();
+ } else if (num_tx <= 64) {
+ runner_fn.template operator()<BitSet<64>>();
+ } else if (num_tx <= 96) {
+ runner_fn.template operator()<BitSet<96>>();
+ } else if (num_tx <= 128) {
+ runner_fn.template operator()<BitSet<128>>();
+ } else {
+ assert(false);
+ }
+}
+
} // namespace
-static void LinearizePerIter16TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<16>>(16, bench); }
-static void LinearizePerIter32TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<32>>(32, bench); }
-static void LinearizePerIter48TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<48>>(48, bench); }
-static void LinearizePerIter64TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<64>>(64, bench); }
-static void LinearizePerIter75TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<75>>(75, bench); }
-static void LinearizePerIter99TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<99>>(99, bench); }
+static void Linearize16TxWorstCase20Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<16>>(16, bench, 20); }
+static void Linearize16TxWorstCase120Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<16>>(16, bench, 120); }
+static void Linearize32TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<32>>(32, bench, 5000); }
+static void Linearize32TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<32>>(32, bench, 15000); }
+static void Linearize48TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<48>>(48, bench, 5000); }
+static void Linearize48TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<48>>(48, bench, 15000); }
+static void Linearize64TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<64>>(64, bench, 5000); }
+static void Linearize64TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<64>>(64, bench, 15000); }
+static void Linearize75TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<75>>(75, bench, 5000); }
+static void Linearize75TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<75>>(75, bench, 15000); }
+static void Linearize99TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<99>>(99, bench, 5000); }
+static void Linearize99TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<99>>(99, bench, 15000); }
static void LinearizeNoIters16TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<16>>(16, bench); }
static void LinearizeNoIters32TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<32>>(32, bench); }
@@ -238,12 +290,84 @@ static void MergeLinearizations64TxWorstCase(benchmark::Bench& bench) { BenchMer
static void MergeLinearizations75TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<75>>(75, bench); }
static void MergeLinearizations99TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<99>>(99, bench); }
-BENCHMARK(LinearizePerIter16TxWorstCase, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LinearizePerIter32TxWorstCase, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LinearizePerIter48TxWorstCase, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LinearizePerIter64TxWorstCase, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LinearizePerIter75TxWorstCase, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LinearizePerIter99TxWorstCase, benchmark::PriorityLevel::HIGH);
+// The following example clusters were constructed by replaying historical mempool activity, and
+// selecting for ones that take many iterations (after the introduction of some but not all
+// linearization algorithm optimizations).
+
+/* 2023-05-05T23:12:21Z 71, 521780, 543141,*/
+static constexpr auto BENCH_EXAMPLE_00 = "801081a5360092239efc6201810982ab58029b6b98c86803800eed7804800ecb7e058f2f878778068030d43407853e81902a08962a81d176098010b6620a8010b2280b8010da3a0c9f069da9580d800db11e0e9d719ad37a0f967897ed5210990e99fc0e11812c81982012804685823e0f0a893982b6040a10804682c146110a6e80db5c120a8010819806130a8079858f0c140a8054829a120c12803483a1760c116f81843c0d11718189000e11800d81ac2c0f11800d81e50e10117181c77c1111822e87f2601012815983d17211127180f2121212811584a21e1312800e80d1781412813c83e81815126f80ef5016126f80ff6c16126f80f66017126e80fd541812800d81942a1912800e80dd781a12800d81f96c1b12805282e7581b127180fd721c1271a918230b805fc11a220d8118a15a2d036f80e5002011817684d8241e346f80e1181c37805082fc04260024800d81f8621734803382b354270b12805182ca2e162f800e80d52e0d32803dc360201b850e818c400b318c49808a5a290210805181d65823142a800d81a34e0850800e81fb3c0851886994fc0a280b00082c805482d208032e28805e83ba380059801081cd4a0159811884f770002e0015e17280e49024300a0000000000000031803dcb48014200"_hex_u8;
+/* 2023-12-06T09:30:01Z 81, 141675, 647053,*/
+static constexpr auto BENCH_EXAMPLE_01 = "b348f1fc4000f365818a9e2c01b44cf7ca0002b004f0b02003b33ef8ae3004b334f9e87005800d81c85e06b368fae26007b05ef2e14208be1a8093a50409b15cf5ee500a802c80a1420b802dea440c802ce50a0d802cdc320e802cd7220f802dd72210805380f74a118174f370126e96b32812127182c4701312817389d26414128035848c221512800e82bf3816126f81e4341712801082b228181280518af57418128040859a0019127182d0401a12803e858b641b127182c4421c126f82b3481d12811486b6301e12821d89e7281f126e8a8b421f127182d6642012806284c12021126e81d34822126e86a76222126e86d8102212805187b6542312800d82fc002412803d848e0e2512801082d27a26126e8589642612800e83a9602712800e83bd0028126e81ef1a29116e858d7228126f82db5e2912801083843c2a127181c93c2b126e85d0162b127181c5622c126e84f8262c12800f8392202d12800e82b66c2e126e81d0082f12803282d50430126e84f9003012805f84be6c3112846e88df0e2b12804080d44c340a8b31898808350a800ed760350b801083a1182b517182817e2a51800e82b6582951803583cb52420030806284cb6c204f7181d300204f82688ce0303e001d800e82bb200f488010808a182822a3289cd63041000a6fcd100a408a7caaa7024800002f803584e0741e27288f3386dd783b001000802683f27e004b8c44bcd0763f0000000000000000000100000e00"_hex_u8;
+/* 2023-04-04T00:26:50Z 90, 99930, 529375,*/
+static constexpr auto BENCH_EXAMPLE_02 = "815b80b61e00800da63001cd378da70e028010991a03800e9d3e0480109708058010991a068010973a07da738fa72408de7491831009b35b88f0080a9d4485de180b71974e0c71974e0d80108e500eb27988a75a0f719632108061a56c11801087761280108a1413807893441480538c1415a606828806168010893e1780548c40188e4b80bb2c196eab3e1718805ed60e18188051c97a19188010cf781a1871b11e1b1871c5281c1880508080581d186e80b13c1e188035cf421f18805fe0482018804caa661f198035a9001f156e80cb701d1871a2281e1871ad281f18817380a16020186f98642118805ee04821198010b6702219800ea12623196eb67024198035808b0025196fa65c26198054ba1c2719807680bf7c28198053cd782919803d80b80429198051db5a2a198040d3742b19976584bb1c28196efc1c281971b21a29198052bc762a1971a2502b196eb73c2c19976381ab0c2a18806290543409862081c3423b00336fbc70224d80109e7c1c52805ebd5c1942800eb57016468034ba423405158118da28350416927480f4743000159f6a81c9462e00188051ec5e380e00800e9e420775800d9e26007c906c82f754251d0025870480f12c14280023800d9e26027e9e1385ed08102900001a804fac7a018001719856028001800da87e0180039b1a868b60064102246e9f42018005800da87e028005850d81d600026d862381a2200e0008230015831480a5480342000524803eeb32006e873582a4700a0100351300"_hex_u8;
+/* 2023-05-08T15:51:59Z 87, 76869, 505222,*/
+static constexpr auto BENCH_EXAMPLE_03 = "c040b9e15a00b10eac842601805f85931802c104bae17403ae50aaa336049d76a9bf7005c55bbeab6606ae2aa9c72c07805e81992e08af7dab817a096e80a7e4520909803e92bd780a097185c76c0b096e98e7380b09850bb9953c0c09803389f6260d096f859d620e09803f88d3000f0971829c6e1009837690f6481109806285931811097181f56814076ea09b74120980408eb73213096f87853214096f86e2701509803f8c860016098a6fe6c3721709814f92a204180980628a8a441909803285df681a0980348498661b096e8290781c096e978e081c097187da1a1d097186c05c1e097185893c1f09805f8ad9002009800d84e74e21097183a67a22097182e23423097184b53a23096ea393062309840faddd46240980618eb732250980548bee6a2609807986883c2709718298402809815388b6582909805384ec742a097181b9142b096e97b5262b096e85e14e2c0980518abb5c2d09805489e75a2e09803187e3382f097180eb1c34046f87c34a2f098309a5c54430097186911831098054899c083209801083bc1033097081e02a3409805f848f0c35096e80d4343a057180c37040006f80a22438097180a0503f03816f8381444003803f80ef003f05800580a4283f066ef72845016efb91663e09923d808d8216470041803584837c46012f9247dc86684501268267a09610450222862184db68440712803585ea40440113835d97887805800b8723c7a40a4b00022f81529ae2143c0c1f80548b8f381b311980408e955c055e802589dc10037e801083b54602658010848130006700"_hex_u8;
+/* 2023-05-01T19:32:10Z 35, 55747, 504128,*/
+static constexpr auto BENCH_EXAMPLE_04 = "801af95c00801af72801801af95c02873e85f2180202873e85f2180202873e85f21802028018fb2802068018fb2803068018fb2804068018fb2805068018fb2806068018fb2807068018fb2808068018fb2809068018fb280a068018fb280a058018fb280b058018fb280c058018fb280d058018fb280e058018fb280f058018fb2810058018fb2811058018fb2812058018fb2813058018fb2814058018fb2815058018fb2815048018fb2816048018fb2817048018fb2818048018fb2819048018fb281a048018fb281b04810d80d9481f00000100"_hex_u8;
+/* 2023-02-27T17:06:38Z 60, 55680, 502749,*/
+static constexpr auto BENCH_EXAMPLE_05 = "b5108ab56600b26d89f85601b07383b01602b22683c96003b34a83d82e04b12f83b53a05b20e83c75a066e80840a06068040be0007066fb10608066fb2120906800eba320a06842b80b05a0a066eff420b067199300b068124c3140c0680618085180d066faa1c0e068010b4440f068051af541006800da1781106857881946812066eee1613068052b31014068324808d361506806180885c150671b03216066ef11017068052b63218066ef3521806803f80865419066e93441a068035a13e1b0680628085181c06806ec4481d068117e72c1e06719c721f068077c42420068159808d1821066eef0c21058010b90022056f9908230571993024058010b00a25058010b00a260580608087402705803fc10027068032b42828068051b6322906800db11e212a8324808d361933803ff400192f826381a7141a2f8032ac08152a800db54c044e8323808d3630010002018158d84000042d821cea12002807853580d462002d01891181d022002e00"_hex_u8;
+/* 2023-04-20T22:25:49Z 99, 49100, 578622,*/
+static constexpr auto BENCH_EXAMPLE_06 = "bf3c87c14c008010955a01b21d85e07002800d946c036e8e3404b77f86c26605b33c85f55e06bd06879852078010970a08bd4b87cf00098123a7720ab2158687680b8054d4440b0a8062fa4c0c0a71ac400d0a80628081540e0a8010a2580f0a8054b676100a8032b85c110a6e9a40120a6e809012130a817f80c31e140a8175808674150a719d46160a8172d86415098033c1481609800da4181709800ada2e1809803dc85219098034b4041a096ef5501b098052d67c1c098051d3281d09800ebc4a1e098175808c641f098061c55020098078c85021096e8081141f0b6faf1e200b8061da68210b8062f000220b800ebc20230b8035d058240b8053de32250b8050b610250b6fad32260b803dc276270b803d80a610280b6ef812290b8052b6322a0b800eb57e2b0b8052bd062c0b719e522d0b71a3762e0b8010bb1e2f0b80109a78310a80109962320a8051a60c330a6f9f3e320b6e808b24330b719e40340b8117cc50350b803d80971a360b8051b930370b6f9e0a380b719b10390b8052a6003a0b6e808c76390a7195603a0a6f935c3b0a8054a31a3c0a803ce30c3b0b803fa3003c0b800dbe2a3d0b8f3480a84244058005851a44069d1bf824400b83098f284507719c723d4f6f9c1c3449719c722f4f6eb23c304f8061c5502e528061da682b4e8118bb724e022a8054b35028476e941c1d51815be02c4f01148557808e3a4f070e8104af464e001180329d364e010d805f9f6a421b9c3387aa744c0d4d71ac400b800881748098444710338173809b780b80008054d444292c12821dc040550403078b4682b4664517003f00"_hex_u8;
+/* 2023-06-05T19:56:12Z 52, 44896, 540514,*/
+static constexpr auto BENCH_EXAMPLE_07 = "b317998a4000b40098d53e01b45b99814802b7289b940003b3699a9d1204b6619a807a05814682cb78050571d854060571d8540705800e808d7a0805803480c06a09056e8189280a056ffd060b05800d80ea7a0c05803c80b80c0c03803e80d86e0d036ed2280e03811581804a0f036fd34e1003805380eb6811036e81f60e12038010ec101204805f80e83a13048033809534140471e00a15048010f95816046e81fa301704805180a74c1705800d808f1018056fd55c1905800e8091481a056e80a76e1b05805f80e2741c0571809b021c05826382c8401d0571df201e05800e809d2c1f05850083e87c1f05811580af68200571f20a21056ff9042205803e80df1e23056e81956c24056e9f542604805180e83829000e800e8080621325803380b0402a020d6ef8100e2c8c4889a96a2c000f803580ce4c2c000b6e9f54062a803480c96406260500"_hex_u8;
+/* 2023-12-05T23:48:44Z 69, 44283, 586734,*/
+static constexpr auto BENCH_EXAMPLE_08 = "83728ce80000b90befca1001806083b24002b40de6da3203b545e9c35c04b34beede3005b068e8883006d41c80b1e14c07b337e7841208b26beadb2e096e83892e090980518487380a096e82815c0a096e81ce3c0b097181db200c097181d4020d09810084ed600e096e96b0100f0971819a0210086e93da2e0f09803583ee5e1009803583c66c1109800d82bb6e1209800d81d56a1309803c82e622140971819f521509803d84a55c15057181d6161605806283ac5217056e949c5a18056e89e8641806815889e23419067181de321a066e8af2641a076e82a70a1b07803583f2081c076f81e76e1d076e81d33e1e07800d83b8761e086e82a5541f087181de302008805f84ad0021086e81c74022086e81bd3e23086e9288182408806184b3102409803283816025096e91ed662609830a88e70827096e81d14a27097181ce6028096e8cf03829097181883832016f81835c3103806181e0103203804180b8103204863584fe183304800de66434046e9e4c34056e81d6742f429213c0eb602e3d6483b06c283a6e81d73c263d6e82f9581831805485ab360e37805080c62609398b3189880838010603916db1f3583a03000110873199f8623c000000011100"_hex_u8;
+/* 2023-04-14T19:36:52Z 77, 20418, 501117,*/
+static constexpr auto BENCH_EXAMPLE_09 = "bf2989d00400815bca5c01af1e86f97602800d9d6c03800d8a3404b47988866e05b36287f92e0680109f68078010991a08805ecf1208076e80933e09078062d01c0a078054b6760b078053b6760c076f9c1c0d078054b6760e0771af260f0771b17e10078032f57011078035d56812078054e1581307886b83dc301407817480d13013068005a6001406803d80821a15066ef3201606800ea2181706800da628180671ab1219068054db0c1a06719b001b06815b80a11c1c068050b9301d066fac2a1e068033ab481f06719b1020068035ab721e07803dc2761f0771ae3c20078040f60e210771ce282207800ea4322307882a81a66024078035ad4625076efe7e26078162808e1827078118bb7228076eac7428088010bf58290871a04c2a0871bc722b086fa8382c08803d80a0142d088035d6282e088051c30c2f086efc623008800d9f6231086f986432088117bb7237028010a63034068010c84e2740800ea64c2237832c80933e1f3b830880c454390208813c80955c3905068032c73611348010a03c093c837a808a101b278050ac34093a8051ac34291b8f3b8187401d28881a82cb3a3a0a37977b86d20843000028996686a7083f030f8078d3761b27106e995a08499070839b5a1131000b00"_hex_u8;
+/* 2023-11-07T17:59:35Z 48, 4792, 498995,*/
+static constexpr auto BENCH_EXAMPLE_10 = "875f89aa1000b51ec09d7201c55cc7a72e02a11aa1fb3203b233a7f95204800ef56205b33ea9d13006803e80b26e07d90ec9dd4008b45eabbe6c09806080ca000a815984e8680a0a6f80925e0a0a803f80e1660c09937c94b7420d086e82f5640a086e80997e0b086f808d320c08800580a5640d086f8089100e08804080c9060f088115819a1c10086e82961a0f0a805f81bc0a100a6ff826110a6ef53e120a807584c60c110a6e818f32120a803c81c246130a805481d508140a8159838410150a7180a55c160a6f80821c170a6fe6101c066fe6101d06805080f854190a6e81b27c1a0a8155819c701e06805180ae0c21046e8b9a222501805180f53422001680f26880f8a62a220116803580da582007058153838e6e21000c800d80a712033a807681ae1c23000308834a82d36023020205815981e03a051a08001700"_hex_u8;
+/* 2023-11-16T10:47:08Z 77, 473962, 486863,*/
+static constexpr auto BENCH_EXAMPLE_11 = "801980c06000801980c06001801980c06002801980c06003801980c06004801980c06005801980c06006801980c06007801980c06008801980c06009801980c0600a801980c0600b801980c0600c801980c0600d801980c0600e801980c0600f801980c060108019d12c11800f80b1601111800f80b1601111801080b1601111800f80b160100e800f80b160100f801980c060110f800f80b160140d801180b1601111801180b160100d801180b160120c801180b1600f10801180b1600f11801980c0601011800f80b160140e800f80b160110f801980c060170a801180b1601210801980c060140f800f80b1601311801980c0602005801180b1601f07800f80b1601b0c800fca7c1611812081f9601638812081f9601637812081fb001636801080b160142f801980c0600e2a801080b1600f2a801180b1600d25801980c0600e25800f80b1600d27801980c0600e27801980c0600d27801180b1600e26812080b1500c27812081f960201025812081f960200f27812081fc201d101c812081fc201d101d812081fc201d0f1f812081fc201d0f20812081f9601b1016800f80b1600a35800f80b1600a36800f80b1600e32801080b160122f812081f960280040812081fc20121d1b812081f960112713812081f960160d37812081fc20140d2b812081f960130d2d812081fc20130c2c812081fb001b0157812081fb001a0245812081fc20140030812081fc20092747812081fb000b152500"_hex_u8;
+/* 2023-10-06T20:44:09Z 40, 341438, 341438,*/
+static constexpr auto BENCH_EXAMPLE_12 = "80318f4c0080318f4c0180318f4c0280318f4c0380318f4c0480318f4c0580318f4c0680318f4c078033a57807078033a57807078033a57807078033a57807078033a57807078033a57807078033a57807078033a578070780318f4c0e0180318f4c0d0380318f4c0c0580318f4c0b078033a57803128033a57803128033a57803128033a578031280318f4c0412810b9c28140300810c9c281303028033a57802188033a57802188033a5780218810c9c280b01108033a578001c810c9c2807050f8033a578001b810c98040700158033a578001c810c98040301158033a5780019806ca1240101118033a578001300"_hex_u8;
+/* 2023-11-15T21:40:46Z 96, 23608, 138286,*/
+static constexpr auto BENCH_EXAMPLE_13 = "8060829f4000b157bab07a01b27cc2b16802b22fbce54603826480a95804803da81a05bc7bcac93806800de55207800daf0608805bc71809805bc7180a800d9d4a0b805bbc700c8152d7180d805bb9380e850a8886260f800d80d33410bf38d3d55011b41dc4eb6012bd70d2ce2e138d3596af7812137180cd501313805e81f7281413718092001513803d81f90016136e8b916c1713801081861a17106e80cd2a18106f80cc3c19106e80cf161911800d80fe781b107180d87c1c106e80fb081d10803e8286701d11800d81c4781f10804082a6002010801081912e21107180ff0021116e81da4a2310850b8b864023116e89db3224116e84ff7e2610897c95993427106f80bb1a240b803581c272250b8032828c10260b6e80d42a270b804082b35a280b800d80fe3e290b805cc0282312821d8697022b0b6e8add562c0b805281c8063007811883f1082313800d80fe3e24137180c9142513800d8380102613803382c00e2713805eb32228136e8494542913800e8186742913806082b74c2a1380528285782b13800d818f7a2c136e84a5562d1380508286702e136f80a46e3e04803f8191364102805481ad4c3d076e809a5a3e077180fe4032136e838b7233138c4790cf384106853584ab624206805b80932a4801806280966c48028168ef04400b7181bd524903806282db5c375b9316acbf703a599c68c5a454385c6e81d63e364a6f80ff64334e817485a6784f023171819536234e800d81826e1e498053829a12420018834c87cb14291d2e840e8bc94c1d2825800d81b7220368811783fe0e271f1f811783e758380f001ecd55809edf6e56000000003a815984ba76008010d54d80aebb4e2c22000000000000002c807682f150007a00"_hex_u8;
+/* 2023-12-06T09:18:20Z 93, 68130, 122830,*/
+static constexpr auto BENCH_EXAMPLE_14 = "b26beadb2e00800d80ca0a01d41c80b1e14c02b068e8883003800d81af1604b34beede30056e80b14006b151f5d46c07b93e8085b02608b30cf98b1009b14ef6b3040ab176f6ab480bb7078082b8640c800d81c6460d802c80a8080e802c80a8080f802c80a14210802ce50a11802cd722127181ce6012126e81d14a13126e9b8b00141282428dd42c15128051828408150e6e81bd3e150f805f84ad00160f7181de30170f6e81c740180f800d83b876190f6e82a5541a0f6e81d33e1a106e82a70a1b106f81e76e1c10803583f2081d106e82d9401e106e96e4441f107181de321e12815889e2341f127182d60c20126e979d4e21126e8282262410800d82972c25106f838a5822126f82842a23127182d24a2412803e84bc2a2512800d83c81a26126e84f8142712805085a22c27126e889e6a2812801083aa50281280348598102912801082d5522a126e85865c2b127182c7602b1282468c82042c126e84972c2d12805485d93a2d12801083c7322e12815386e1582f126e84fb0c30126f82eb6c3011813a85b47a3111803f869f5c3211805181ed30370d6e84bf0a3411804180e1383809815883aa183a08815a8392203e05807681f140380c6e9e4c4005805485ab363255805183856030406e82f9582c45805185c1001b4f82418df1001a4e803283c50e430026800d83a6201a4b836886be3044010b8b318988084c0101803183a6120776800d828a1e087682338ae050301c33873199f8624d010032813986bc663c1034800d83a5220a6f800d82be52048000805183e364084907800d83cc4a018005815987b41e1832000017884b9dce72035035803284c11e00800885769d9538192f0000000002001000"_hex_u8;
+/* 2023-12-14T02:02:29Z 55, 247754, 247754,*/
+static constexpr auto BENCH_EXAMPLE_15 = "801980c06000801980c06001801980c06002801980c06003801980c06004801980c06005801980c06006801980c06007801980c06008801980c06009801980c0600a801980c0600b801980c0600c801980c0600d801980c0600e801180b1600e0e801180b1600e0e801180b1600e0e801180b1600e0e801180b1600e0e801180b1600e0e801180b1600d07801180b1600f06801180b1600c0a801180b1600f08801180b1600c0c801180b1600c0d801180b1600c0e801180b160100b801180b1601309812081fc200e2a812081fc200e29812081fc200e28812081fc200e0e18812081fc200e0e17801980c060042e812081fc200e0d07812081fc200e0d08812081fc200e0c0a812081fc200e0d0a801980c060081e812081fc200f0c0c812081fc200f0c0d812081fc200f0c0e801180b160083a801180b1600426801980c0600b20801980c0600a22812081fc200f0b30801180b160022b801180b160022b812081fc20062422812081fc2006220b812081fc200c0a1e812081fc2012041a00"_hex_u8;
+/* 2023-12-14T15:17:20Z 76, 102600, 103935,*/
+static constexpr auto BENCH_EXAMPLE_16 = "801980c06000801980c06001801980c06002801980c06003801980c06004801180b1600404801180b1600404801180b1600404801980c0600504801980c0600802801980c0600803801180b1600704801980c0600804801280b1600804812081fc200810812081fc20080f812081fc20080e801180b160080c800f80b160080d801980c060090d801180b160090e801980c0600a0e812181fc200a0c801180b1600a0d812181fd400a0c801980c0600a1c801980c0600916801180b1600719801180b160061b801980c0600d15801980c0600717812081fc200718801980c0600716801180b160072d801180b1600722801180b1600525801980c060091b801980c060071e801080b160071f801280b160061d812081fc20063a812181f960160815801280b1600525801980c0600625801180b1600626801980c0600726801980c0600536801180b160032b801980c060042b801280b160032d801980c060033e801180b160043e812181fc20100c27801080b160042f801980c0600342801180b1600442812081fc20150d25800f80b1600245812081fd40120619812081fc20040243812081fc20120c2c812081fd40120a1d812181fb00100623812081fc20030347812081fc20072126801980c0600236812081fc20040d2b812081fc20120328801980c0600237801180b1600337812081fc20052230801180b1600239812081fc2008242c812081fd4005112d812081fb00070b32812081f96011034700"_hex_u8;
+/* 2023-12-15T07:12:29Z 98, 112693, 112730,*/
+static constexpr auto BENCH_EXAMPLE_17 = "801980c06000801980c06001801980c06002801980c06003801980c06004801980c06005801980c06006801180b1600606801180b1600606801180b1600606801180b1600606801280b1600606801180b1600606801180b1600606801980c0600d00801980c0600b03801980c0600b04801980c0600f01812081fc200a16812081fc200a15812081fc200a14812081fc200a13812081fd400a12812181fc200a11812181fc200a0f801180b1600a10801180b1600a10801980c0600a10801180b1600b10801180b1600b10801980c0600621801980c0600915801980c060041b801180b160051b801980c0600f12801980c0600f13801980c0600d15801980c0600c17801980c060072e800f80b160082e812181fc200d150e801980c0600922801180b1600923801980c0600823801180b1600623801180b1600a20801180b1600e1c801180b1600b20801180b1600b21801980c0600a3e800f80b1600b3e801980c0600931801180b1600a31812181fc20140325801180b1600a30801180b160054c801180b160043b801980c0600336812181fc200253812081f960090944812081fc2007003c801980c0600339801180b1600433801980c0600453801980c0600340801980c060033d801080b160043d812081f960070854801980c060045a801180b160055a801180b1600545801980c0600643801980c0600641801280b1600739801180b1600562812081fc20121f27812181fc20210137812181fc2016112f801980c0600259801980c0600156812181fc20053a31801180b160025c801180b1600257801980c0600357812081fc200d2d1e812181fc20102444812181fc20035a801180b160035b801980c0600751812181fc2007392a812181fc20025f801980c060045e801180b1600350812081fc20070f6f801180b1600263812181fc201b1322812181fc2011283b812081fc2002442100"_hex_u8;
+/* 2023-12-16T02:25:33Z 99, 112399, 112399,*/
+static constexpr auto BENCH_EXAMPLE_18 = "801980c06000801980c06001801980c06002801980c06003801980c06004801980c06005801980c06006801980c06007801180b16008801180b16009801180b1600a801180b1600a0a801180b1600a0a801180b1600a0a801180b1600a0a801980c0600d06801180b1600b09801980c0601005801180b1600c0a801980c0600d0a801980c0601106801180b1600e0a801980c0601207801980c0601207801180b160100a812081e668100a812081e668100a812081e668100a801980c0601407801980c0601606812081fc201226812081fc201225812081fc201224812081fc201223801180b1600e21801980c0600b1e801180b1600c1e801180b1601316801980c060091b801980c0601312801980c0600a1c801180b160190e801180b1601315801180b1600e1b801180b1601713801180b1600f1c801980c0600d34801980c0600d30801980c060102e801980c060122d801980c0600b2a801980c0600b2a801980c0600b2b801180b1601122801180b1600e26801180b1601025801180b1600f26812081fc20280032812081fc20270034812081fc20250034801180b1600d4b801980c0600d457a809a000d46801980c0601044801980c0600e46801180b1600f43801180b160123f801180b160123e801180b1601130801180b1601131801180b1601131812081fc20230a36801980c0600a5a801180b1600a5b801980c0600a5b801180b1600b5b801980c0600b5a801180b1600f57801180b1600d3f801980c0600669801980c0600568801980c0600466801180b1600945801180b1600649801180b1600945812081fc2018234b812081fc20142534812081fc20142532812081fc20142530801180b160074d801180b1600a4b801180b1600a4a812081fc20221662812081fc200c0472812081fc20072e42812081fc20062c23812081fc20100572812081fc200f036c812081fc2001345100"_hex_u8;
+/* 2023-03-31T19:24:02Z 78, 90393, 152832,*/
+static constexpr auto BENCH_EXAMPLE_19 = "800dd042008028b13c018028b13c028028b13c038029b13c048029b13c058029b13c0680299948078029b13c088029b13c09802899480a802899480b8028b13c0c80299e700d802899480e802999480f8029b13c10802999481180299948128028b13c138029b13c1480289e701580289948168028b13c1780289948188028994819802899481a802999481b802999481c802899481d802999481e8028b13c1f8029b13c20802999482180299948228028b13c2380298c242480289948258029b13c2680288c242780298c242880299e70298f5a80ea762a824780aa00292a82038090402429813fcf00152a8203809040142a813ff700112982038090402d002d813ff70028002c8203809040270024824780aa00270025820380904025002882038090401e022a82038090401d042782038090401c01298203809040190029813ff700170028813ff700140128807b9258120128841280f6402c01002e82038090402b00062b820380904027000031813ff70011192d82038090401d000129851981a9403a0000003b82038090400c182e813ff7000b0f2982038090401314141b807b925805192b84568190001121000334807bdd400149824780aa00001f2a813ff700003d0b8203809040050d1915807bdd4001498728828f400b010004050501000a050c851981a9400104050b061a0400"_hex_u8;
+
+static void LinearizeOptimallyExample00(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_00); }
+static void LinearizeOptimallyExample01(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_01); }
+static void LinearizeOptimallyExample02(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_02); }
+static void LinearizeOptimallyExample03(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_03); }
+static void LinearizeOptimallyExample04(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_04); }
+static void LinearizeOptimallyExample05(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_05); }
+static void LinearizeOptimallyExample06(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_06); }
+static void LinearizeOptimallyExample07(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_07); }
+static void LinearizeOptimallyExample08(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_08); }
+static void LinearizeOptimallyExample09(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_09); }
+static void LinearizeOptimallyExample10(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_10); }
+static void LinearizeOptimallyExample11(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_11); }
+static void LinearizeOptimallyExample12(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_12); }
+static void LinearizeOptimallyExample13(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_13); }
+static void LinearizeOptimallyExample14(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_14); }
+static void LinearizeOptimallyExample15(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_15); }
+static void LinearizeOptimallyExample16(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_16); }
+static void LinearizeOptimallyExample17(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_17); }
+static void LinearizeOptimallyExample18(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_18); }
+static void LinearizeOptimallyExample19(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_19); }
+
+BENCHMARK(Linearize16TxWorstCase20Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize16TxWorstCase120Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize32TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize32TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize48TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize48TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize64TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize64TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize75TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize75TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize99TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize99TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
BENCHMARK(LinearizeNoIters16TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
BENCHMARK(LinearizeNoIters32TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
@@ -272,3 +396,24 @@ BENCHMARK(MergeLinearizations48TxWorstCase, benchmark::PriorityLevel::HIGH);
BENCHMARK(MergeLinearizations64TxWorstCase, benchmark::PriorityLevel::HIGH);
BENCHMARK(MergeLinearizations75TxWorstCase, benchmark::PriorityLevel::HIGH);
BENCHMARK(MergeLinearizations99TxWorstCase, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(LinearizeOptimallyExample00, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample01, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample02, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample03, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample04, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample05, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample06, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample07, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample08, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample09, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample10, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample11, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample12, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample13, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample14, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample15, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample16, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample17, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample18, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample19, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/coin_selection.cpp b/src/bench/coin_selection.cpp
index 171c61c46f..a752f73610 100644
--- a/src/bench/coin_selection.cpp
+++ b/src/bench/coin_selection.cpp
@@ -3,15 +3,28 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
+#include <consensus/amount.h>
#include <interfaces/chain.h>
#include <node/context.h>
+#include <outputtype.h>
+#include <policy/feerate.h>
#include <policy/policy.h>
+#include <primitives/transaction.h>
+#include <random.h>
+#include <sync.h>
+#include <util/result.h>
#include <wallet/coinselection.h>
#include <wallet/spend.h>
-#include <wallet/wallet.h>
#include <wallet/test/util.h>
+#include <wallet/transaction.h>
+#include <wallet/wallet.h>
+#include <cassert>
+#include <map>
+#include <memory>
#include <set>
+#include <utility>
+#include <vector>
using node::NodeContext;
using wallet::AttemptSelection;
diff --git a/src/bench/crypto_hash.cpp b/src/bench/crypto_hash.cpp
index 2551ff3593..65da942ad7 100644
--- a/src/bench/crypto_hash.cpp
+++ b/src/bench/crypto_hash.cpp
@@ -11,11 +11,14 @@
#include <crypto/sha3.h>
#include <crypto/sha512.h>
#include <crypto/siphash.h>
-#include <hash.h>
#include <random.h>
+#include <span.h>
#include <tinyformat.h>
#include <uint256.h>
+#include <cstdint>
+#include <vector>
+
/* Number of bytes to hash per iteration */
static const uint64_t BUFFER_SIZE = 1000*1000;
diff --git a/src/bench/data.cpp b/src/bench/data.cpp
deleted file mode 100644
index 35558b3aa7..0000000000
--- a/src/bench/data.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2019-2021 The Bitcoin Core developers
-// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-#include <bench/data.h>
-
-namespace benchmark {
-namespace data {
-
-#include <bench/data/block413567.raw.h>
-const std::vector<uint8_t> block413567{std::begin(block413567_raw), std::end(block413567_raw)};
-
-} // namespace data
-} // namespace benchmark
diff --git a/src/bench/data.h b/src/bench/data.h
deleted file mode 100644
index 5f13d766ea..0000000000
--- a/src/bench/data.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2019 The Bitcoin Core developers
-// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-#ifndef BITCOIN_BENCH_DATA_H
-#define BITCOIN_BENCH_DATA_H
-
-#include <cstdint>
-#include <vector>
-
-namespace benchmark {
-namespace data {
-
-extern const std::vector<uint8_t> block413567;
-
-} // namespace data
-} // namespace benchmark
-
-#endif // BITCOIN_BENCH_DATA_H
diff --git a/src/bench/descriptors.cpp b/src/bench/descriptors.cpp
index 5d6bcb8ce8..c45456645b 100644
--- a/src/bench/descriptors.cpp
+++ b/src/bench/descriptors.cpp
@@ -4,11 +4,16 @@
#include <bench/bench.h>
#include <key.h>
-#include <pubkey.h>
#include <script/descriptor.h>
+#include <script/script.h>
+#include <script/signingprovider.h>
+#include <cassert>
+#include <cstdint>
+#include <memory>
#include <string>
#include <utility>
+#include <vector>
static void ExpandDescriptor(benchmark::Bench& bench)
{
@@ -18,12 +23,12 @@ static void ExpandDescriptor(benchmark::Bench& bench)
const std::pair<int64_t, int64_t> range = {0, 1000};
FlatSigningProvider provider;
std::string error;
- auto desc = Parse(desc_str, provider, error);
+ auto descs = Parse(desc_str, provider, error);
bench.run([&] {
for (int i = range.first; i <= range.second; ++i) {
std::vector<CScript> scripts;
- bool success = desc->Expand(i, provider, scripts, provider);
+ bool success = descs[0]->Expand(i, provider, scripts, provider);
assert(success);
}
});
diff --git a/src/bench/disconnected_transactions.cpp b/src/bench/disconnected_transactions.cpp
index f48175d472..7c3c34bbbc 100644
--- a/src/bench/disconnected_transactions.cpp
+++ b/src/bench/disconnected_transactions.cpp
@@ -5,9 +5,18 @@
#include <bench/bench.h>
#include <kernel/disconnected_transactions.h>
#include <primitives/block.h>
-#include <test/util/random.h>
+#include <primitives/transaction.h>
+#include <script/script.h>
#include <test/util/setup_common.h>
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <memory>
+#include <vector>
+
constexpr size_t BLOCK_VTX_COUNT{4000};
constexpr size_t BLOCK_VTX_COUNT_10PERCENT{400};
diff --git a/src/bench/duplicate_inputs.cpp b/src/bench/duplicate_inputs.cpp
index b56054ae89..9f22fa3646 100644
--- a/src/bench/duplicate_inputs.cpp
+++ b/src/bench/duplicate_inputs.cpp
@@ -3,15 +3,28 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
+#include <chain.h>
#include <chainparams.h>
+#include <consensus/consensus.h>
#include <consensus/merkle.h>
#include <consensus/validation.h>
#include <pow.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
#include <random.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
-#include <txmempool.h>
+#include <uint256.h>
#include <validation.h>
+#include <cassert>
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
static void DuplicateInputs(benchmark::Bench& bench)
{
diff --git a/src/bench/ellswift.cpp b/src/bench/ellswift.cpp
index 4780db8e1c..4dfef0e9c5 100644
--- a/src/bench/ellswift.cpp
+++ b/src/bench/ellswift.cpp
@@ -3,9 +3,14 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
#include <key.h>
+#include <pubkey.h>
#include <random.h>
+#include <span.h>
+#include <uint256.h>
+
+#include <algorithm>
+#include <cassert>
static void EllSwiftCreate(benchmark::Bench& bench)
{
diff --git a/src/bench/gcs_filter.cpp b/src/bench/gcs_filter.cpp
index 0af4ee98fe..e6cc3d4d54 100644
--- a/src/bench/gcs_filter.cpp
+++ b/src/bench/gcs_filter.cpp
@@ -4,6 +4,11 @@
#include <bench/bench.h>
#include <blockfilter.h>
+#include <uint256.h>
+
+#include <cstdint>
+#include <utility>
+#include <vector>
static GCSFilter::ElementSet GenerateGCSTestElements()
{
diff --git a/src/bench/hashpadding.cpp b/src/bench/hashpadding.cpp
index e9d2c25fe3..cca5c07506 100644
--- a/src/bench/hashpadding.cpp
+++ b/src/bench/hashpadding.cpp
@@ -3,7 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <hash.h>
+#include <crypto/sha256.h>
#include <random.h>
#include <uint256.h>
diff --git a/src/bench/index_blockfilter.cpp b/src/bench/index_blockfilter.cpp
index 5e0bfbfea6..eac09688c8 100644
--- a/src/bench/index_blockfilter.cpp
+++ b/src/bench/index_blockfilter.cpp
@@ -2,14 +2,30 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
-#include <bench/bench.h>
-
#include <addresstype.h>
+#include <bench/bench.h>
+#include <blockfilter.h>
+#include <chain.h>
+#include <index/base.h>
#include <index/blockfilterindex.h>
-#include <node/chainstate.h>
-#include <node/context.h>
+#include <interfaces/chain.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <pubkey.h>
+#include <script/script.h>
+#include <span.h>
+#include <sync.h>
#include <test/util/setup_common.h>
+#include <uint256.h>
#include <util/strencodings.h>
+#include <util/time.h>
+#include <validation.h>
+
+#include <cassert>
+#include <memory>
+#include <vector>
+
+using namespace util::hex_literals;
// Very simple block filter index sync benchmark, only using coinbase outputs.
static void BlockFilterIndexSync(benchmark::Bench& bench)
@@ -18,7 +34,7 @@ static void BlockFilterIndexSync(benchmark::Bench& bench)
// Create more blocks
int CHAIN_SIZE = 600;
- CPubKey pubkey{ParseHex("02ed26169896db86ced4cbb7b3ecef9859b5952825adbeab998fb5b307e54949c9")};
+ CPubKey pubkey{"02ed26169896db86ced4cbb7b3ecef9859b5952825adbeab998fb5b307e54949c9"_hex_u8};
CScript script = GetScriptForDestination(WitnessV0KeyHash(pubkey));
std::vector<CMutableTransaction> noTxns;
for (int i = 0; i < CHAIN_SIZE - 100; i++) {
diff --git a/src/bench/load_external.cpp b/src/bench/load_external.cpp
index fba1233901..8f9399c60d 100644
--- a/src/bench/load_external.cpp
+++ b/src/bench/load_external.cpp
@@ -3,13 +3,24 @@
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
+#include <bench/data/block413567.raw.h>
#include <chainparams.h>
-#include <clientversion.h>
+#include <flatfile.h>
+#include <node/blockstorage.h>
+#include <span.h>
+#include <streams.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
+#include <uint256.h>
+#include <util/fs.h>
#include <validation.h>
+#include <cstdint>
+#include <cstdio>
+#include <map>
+#include <memory>
+#include <stdexcept>
+#include <vector>
+
/**
* The LoadExternalBlockFile() function is used during -reindex and -loadblock.
*
diff --git a/src/bench/lockedpool.cpp b/src/bench/lockedpool.cpp
index 6851ed0bd8..5f39ddc41b 100644
--- a/src/bench/lockedpool.cpp
+++ b/src/bench/lockedpool.cpp
@@ -3,9 +3,10 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
#include <support/lockedpool.h>
+#include <cstddef>
+#include <cstdint>
#include <vector>
#define ASIZE 2048
diff --git a/src/bench/logging.cpp b/src/bench/logging.cpp
index 8a745a0ba7..3bf2b7edb2 100644
--- a/src/bench/logging.cpp
+++ b/src/bench/logging.cpp
@@ -5,11 +5,13 @@
#include <bench/bench.h>
#include <logging.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
+
+#include <functional>
+#include <vector>
// All but 2 of the benchmarks should have roughly similar performance:
//
-// LogPrintWithoutCategory should be ~3 orders of magnitude faster, as nothing is logged.
+// LogWithoutDebug should be ~3 orders of magnitude faster, as nothing is logged.
//
// LogWithoutWriteToFile should be ~2 orders of magnitude faster, as it avoids disk writes.
@@ -26,67 +28,37 @@ static void Logging(benchmark::Bench& bench, const std::vector<const char*>& ext
bench.run([&] { log(); });
}
-static void LogPrintLevelWithThreadNames(benchmark::Bench& bench)
-{
- Logging(bench, {"-logthreadnames=1", "-debug=net"}, [] {
- LogPrintLevel(BCLog::NET, BCLog::Level::Error, "%s\n", "test"); });
-}
-
-static void LogPrintLevelWithoutThreadNames(benchmark::Bench& bench)
+static void LogWithDebug(benchmark::Bench& bench)
{
- Logging(bench, {"-logthreadnames=0", "-debug=net"}, [] {
- LogPrintLevel(BCLog::NET, BCLog::Level::Error, "%s\n", "test"); });
+ Logging(bench, {"-logthreadnames=0", "-debug=net"}, [] { LogDebug(BCLog::NET, "%s\n", "test"); });
}
-static void LogPrintWithCategory(benchmark::Bench& bench)
+static void LogWithoutDebug(benchmark::Bench& bench)
{
- Logging(bench, {"-logthreadnames=0", "-debug=net"}, [] { LogPrint(BCLog::NET, "%s\n", "test"); });
-}
-
-static void LogPrintWithoutCategory(benchmark::Bench& bench)
-{
- Logging(bench, {"-logthreadnames=0", "-debug=0"}, [] { LogPrint(BCLog::NET, "%s\n", "test"); });
-}
-
-static void LogPrintfCategoryWithThreadNames(benchmark::Bench& bench)
-{
- Logging(bench, {"-logthreadnames=1", "-debug=net"}, [] {
- LogPrintfCategory(BCLog::NET, "%s\n", "test");
- });
-}
-
-static void LogPrintfCategoryWithoutThreadNames(benchmark::Bench& bench)
-{
- Logging(bench, {"-logthreadnames=0", "-debug=net"}, [] {
- LogPrintfCategory(BCLog::NET, "%s\n", "test");
- });
+ Logging(bench, {"-logthreadnames=0", "-debug=0"}, [] { LogDebug(BCLog::NET, "%s\n", "test"); });
}
-static void LogPrintfWithThreadNames(benchmark::Bench& bench)
+static void LogWithThreadNames(benchmark::Bench& bench)
{
- Logging(bench, {"-logthreadnames=1"}, [] { LogPrintf("%s\n", "test"); });
+ Logging(bench, {"-logthreadnames=1"}, [] { LogInfo("%s\n", "test"); });
}
-static void LogPrintfWithoutThreadNames(benchmark::Bench& bench)
+static void LogWithoutThreadNames(benchmark::Bench& bench)
{
- Logging(bench, {"-logthreadnames=0"}, [] { LogPrintf("%s\n", "test"); });
+ Logging(bench, {"-logthreadnames=0"}, [] { LogInfo("%s\n", "test"); });
}
static void LogWithoutWriteToFile(benchmark::Bench& bench)
{
// Disable writing the log to a file, as used for unit tests and fuzzing in `MakeNoLogFileContext`.
Logging(bench, {"-nodebuglogfile", "-debug=1"}, [] {
- LogPrintf("%s\n", "test");
- LogPrint(BCLog::NET, "%s\n", "test");
+ LogInfo("%s\n", "test");
+ LogDebug(BCLog::NET, "%s\n", "test");
});
}
-BENCHMARK(LogPrintLevelWithThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintLevelWithoutThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintWithCategory, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintWithoutCategory, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintfCategoryWithThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintfCategoryWithoutThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintfWithThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintfWithoutThreadNames, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LogWithDebug, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LogWithoutDebug, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LogWithThreadNames, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LogWithoutThreadNames, benchmark::PriorityLevel::HIGH);
BENCHMARK(LogWithoutWriteToFile, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/mempool_eviction.cpp b/src/bench/mempool_eviction.cpp
index 1a9b013277..84f873d183 100644
--- a/src/bench/mempool_eviction.cpp
+++ b/src/bench/mempool_eviction.cpp
@@ -3,10 +3,19 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <kernel/mempool_entry.h>
+#include <consensus/amount.h>
+#include <kernel/cs_main.h>
#include <policy/policy.h>
+#include <primitives/transaction.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
#include <txmempool.h>
+#include <util/check.h>
+
+#include <cstdint>
+#include <memory>
+#include <vector>
static void AddTx(const CTransactionRef& tx, const CAmount& nFee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
diff --git a/src/bench/mempool_stress.cpp b/src/bench/mempool_stress.cpp
index 3c82f55c19..67f689e4ea 100644
--- a/src/bench/mempool_stress.cpp
+++ b/src/bench/mempool_stress.cpp
@@ -3,16 +3,23 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <kernel/mempool_entry.h>
+#include <consensus/amount.h>
#include <policy/policy.h>
+#include <primitives/transaction.h>
#include <random.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
#include <txmempool.h>
-#include <util/chaintype.h>
#include <validation.h>
+#include <cstddef>
+#include <cstdint>
+#include <memory>
#include <vector>
+class CCoinsViewCache;
+
static void AddTx(const CTransactionRef& tx, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
{
int64_t nTime = 0;
diff --git a/src/bench/merkle_root.cpp b/src/bench/merkle_root.cpp
index 55409335bd..98ce197ea5 100644
--- a/src/bench/merkle_root.cpp
+++ b/src/bench/merkle_root.cpp
@@ -3,11 +3,12 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
#include <consensus/merkle.h>
#include <random.h>
#include <uint256.h>
+#include <vector>
+
static void MerkleRoot(benchmark::Bench& bench)
{
FastRandomContext rng(true);
diff --git a/src/bench/peer_eviction.cpp b/src/bench/peer_eviction.cpp
index e04f3c403c..5b08cc758b 100644
--- a/src/bench/peer_eviction.cpp
+++ b/src/bench/peer_eviction.cpp
@@ -3,13 +3,12 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <net.h>
#include <netaddress.h>
+#include <node/eviction.h>
#include <random.h>
#include <test/util/net.h>
-#include <test/util/setup_common.h>
-#include <algorithm>
+#include <chrono>
#include <functional>
#include <vector>
diff --git a/src/bench/poly1305.cpp b/src/bench/poly1305.cpp
index be0e5f2c2d..f58afe9845 100644
--- a/src/bench/poly1305.cpp
+++ b/src/bench/poly1305.cpp
@@ -5,9 +5,12 @@
#include <bench/bench.h>
#include <crypto/poly1305.h>
-
#include <span.h>
+#include <cstddef>
+#include <cstdint>
+#include <vector>
+
/* Number of bytes to process per iteration */
static constexpr uint64_t BUFFER_SIZE_TINY = 64;
static constexpr uint64_t BUFFER_SIZE_SMALL = 256;
diff --git a/src/bench/pool.cpp b/src/bench/pool.cpp
index b2a5f8debf..40b098f54c 100644
--- a/src/bench/pool.cpp
+++ b/src/bench/pool.cpp
@@ -5,7 +5,11 @@
#include <bench/bench.h>
#include <support/allocators/pool.h>
+#include <cstddef>
+#include <cstdint>
+#include <functional>
#include <unordered_map>
+#include <utility>
template <typename Map>
void BenchFillClearMap(benchmark::Bench& bench, Map& map)
diff --git a/src/bench/prevector.cpp b/src/bench/prevector.cpp
index 2524e215e4..9b83c42693 100644
--- a/src/bench/prevector.cpp
+++ b/src/bench/prevector.cpp
@@ -3,11 +3,13 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <prevector.h>
+
+#include <bench/bench.h>
#include <serialize.h>
#include <streams.h>
-#include <type_traits>
-#include <bench/bench.h>
+#include <type_traits>
+#include <vector>
struct nontrivial_t {
int x{-1};
diff --git a/src/bench/random.cpp b/src/bench/random.cpp
index cff215d5a7..c2aa66850a 100644
--- a/src/bench/random.cpp
+++ b/src/bench/random.cpp
@@ -5,7 +5,9 @@
#include <bench/bench.h>
#include <random.h>
+#include <algorithm>
#include <cstdint>
+#include <iterator>
#include <numeric>
namespace {
diff --git a/src/bench/readblock.cpp b/src/bench/readblock.cpp
index 2b2bfe069e..058d953b4e 100644
--- a/src/bench/readblock.cpp
+++ b/src/bench/readblock.cpp
@@ -3,15 +3,22 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
-
-#include <consensus/validation.h>
+#include <bench/data/block413567.raw.h>
+#include <flatfile.h>
#include <node/blockstorage.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <serialize.h>
+#include <span.h>
#include <streams.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
#include <validation.h>
+#include <cassert>
+#include <cstdint>
+#include <memory>
+#include <vector>
+
static FlatFilePos WriteBlockToDisk(ChainstateManager& chainman)
{
DataStream stream{benchmark::data::block413567};
diff --git a/src/bench/rollingbloom.cpp b/src/bench/rollingbloom.cpp
index de76a87278..6b3e1c434e 100644
--- a/src/bench/rollingbloom.cpp
+++ b/src/bench/rollingbloom.cpp
@@ -6,7 +6,9 @@
#include <bench/bench.h>
#include <common/bloom.h>
#include <crypto/common.h>
+#include <span.h>
+#include <cstdint>
#include <vector>
static void RollingBloom(benchmark::Bench& bench)
diff --git a/src/bench/rpc_blockchain.cpp b/src/bench/rpc_blockchain.cpp
index 713853e8c5..7e3e2d8e48 100644
--- a/src/bench/rpc_blockchain.cpp
+++ b/src/bench/rpc_blockchain.cpp
@@ -3,15 +3,23 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
-
+#include <bench/data/block413567.raw.h>
+#include <chain.h>
+#include <core_io.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
#include <rpc/blockchain.h>
+#include <serialize.h>
+#include <span.h>
#include <streams.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
+#include <uint256.h>
+#include <univalue.h>
#include <validation.h>
-#include <univalue.h>
+#include <cstddef>
+#include <memory>
+#include <vector>
namespace {
diff --git a/src/bench/rpc_mempool.cpp b/src/bench/rpc_mempool.cpp
index a55aa0c794..6e8757bbd5 100644
--- a/src/bench/rpc_mempool.cpp
+++ b/src/bench/rpc_mempool.cpp
@@ -3,14 +3,19 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
+#include <consensus/amount.h>
#include <kernel/cs_main.h>
-#include <kernel/mempool_entry.h>
+#include <primitives/transaction.h>
#include <rpc/mempool.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
#include <txmempool.h>
-#include <util/chaintype.h>
-
#include <univalue.h>
+#include <util/check.h>
+
+#include <memory>
+#include <vector>
static void AddTx(const CTransactionRef& tx, const CAmount& fee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
diff --git a/src/bench/sign_transaction.cpp b/src/bench/sign_transaction.cpp
index 6f28f581af..3f0635711d 100644
--- a/src/bench/sign_transaction.cpp
+++ b/src/bench/sign_transaction.cpp
@@ -2,8 +2,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <bench/bench.h>
#include <addresstype.h>
+#include <bench/bench.h>
#include <coins.h>
#include <key.h>
#include <primitives/transaction.h>
@@ -11,10 +11,16 @@
#include <script/interpreter.h>
#include <script/script.h>
#include <script/sign.h>
-#include <uint256.h>
+#include <script/signingprovider.h>
+#include <span.h>
#include <test/util/random.h>
+#include <uint256.h>
#include <util/translation.h>
+#include <cassert>
+#include <map>
+#include <vector>
+
enum class InputType {
P2WPKH, // segwitv0, witness-pubkey-hash (ECDSA signature)
P2TR, // segwitv1, taproot key-path spend (Schnorr signature)
@@ -69,12 +75,13 @@ static void SignTransactionSchnorr(benchmark::Bench& bench) { SignTransactionSin
static void SignSchnorrTapTweakBenchmark(benchmark::Bench& bench, bool use_null_merkle_root)
{
+ FastRandomContext rng;
ECC_Context ecc_context{};
auto key = GenerateRandomKey();
- auto msg = InsecureRand256();
- auto merkle_root = use_null_merkle_root ? uint256() : InsecureRand256();
- auto aux = InsecureRand256();
+ auto msg = rng.rand256();
+ auto merkle_root = use_null_merkle_root ? uint256() : rng.rand256();
+ auto aux = rng.rand256();
std::vector<unsigned char> sig(64);
bench.minEpochIterations(100).run([&] {
diff --git a/src/bench/strencodings.cpp b/src/bench/strencodings.cpp
index 16d14278a7..dd5829caf2 100644
--- a/src/bench/strencodings.cpp
+++ b/src/bench/strencodings.cpp
@@ -3,9 +3,12 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
+#include <bench/data/block413567.raw.h>
+#include <span.h>
#include <util/strencodings.h>
+#include <vector>
+
static void HexStrBench(benchmark::Bench& bench)
{
auto const& data = benchmark::data::block413567;
diff --git a/src/bench/verify_script.cpp b/src/bench/verify_script.cpp
index f38aa49a23..8d7e92a055 100644
--- a/src/bench/verify_script.cpp
+++ b/src/bench/verify_script.cpp
@@ -3,13 +3,20 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
+#include <hash.h>
#include <key.h>
-#include <script/script.h>
+#include <primitives/transaction.h>
+#include <pubkey.h>
#include <script/interpreter.h>
-#include <streams.h>
+#include <script/script.h>
+#include <span.h>
#include <test/util/transaction_utils.h>
+#include <uint256.h>
#include <array>
+#include <cassert>
+#include <cstdint>
+#include <vector>
// Microbenchmark for verification of a basic P2WPKH script. Can be easily
// modified to measure performance of other types of scripts.
diff --git a/src/bench/wallet_balance.cpp b/src/bench/wallet_balance.cpp
index 7a10b167a6..8d3f7f9673 100644
--- a/src/bench/wallet_balance.cpp
+++ b/src/bench/wallet_balance.cpp
@@ -4,16 +4,24 @@
#include <bench/bench.h>
#include <interfaces/chain.h>
-#include <node/chainstate.h>
-#include <node/context.h>
+#include <kernel/chainparams.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <sync.h>
#include <test/util/mining.h>
#include <test/util/setup_common.h>
-#include <wallet/test/util.h>
-#include <validationinterface.h>
+#include <uint256.h>
+#include <util/time.h>
+#include <validation.h>
#include <wallet/receive.h>
+#include <wallet/test/util.h>
#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
+#include <cassert>
+#include <memory>
#include <optional>
+#include <string>
namespace wallet {
static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const bool add_mine)
diff --git a/src/bench/wallet_create.cpp b/src/bench/wallet_create.cpp
index 1adced1e99..43b5b5c91e 100644
--- a/src/bench/wallet_create.cpp
+++ b/src/bench/wallet_create.cpp
@@ -2,14 +2,25 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
-
#include <bench/bench.h>
-#include <node/context.h>
+#include <config/bitcoin-config.h> // IWYU pragma: keep
#include <random.h>
+#include <support/allocators/secure.h>
#include <test/util/setup_common.h>
+#include <uint256.h>
+#include <util/fs.h>
+#include <util/translation.h>
#include <wallet/context.h>
+#include <wallet/db.h>
#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
+
+#include <cassert>
+#include <memory>
+#include <optional>
+#include <string>
+#include <utility>
+#include <vector>
namespace wallet {
static void WalletCreate(benchmark::Bench& bench, bool encrypted)
diff --git a/src/bench/wallet_create_tx.cpp b/src/bench/wallet_create_tx.cpp
index 84e02d2a26..3c4b2f4f83 100644
--- a/src/bench/wallet_create_tx.cpp
+++ b/src/bench/wallet_create_tx.cpp
@@ -2,17 +2,42 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+#include <addresstype.h>
#include <bench/bench.h>
+#include <chain.h>
#include <chainparams.h>
-#include <wallet/coincontrol.h>
+#include <consensus/amount.h>
+#include <consensus/consensus.h>
#include <consensus/merkle.h>
+#include <interfaces/chain.h>
#include <kernel/chain.h>
-#include <node/context.h>
+#include <node/blockstorage.h>
+#include <outputtype.h>
+#include <policy/feerate.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
+#include <uint256.h>
+#include <util/result.h>
+#include <util/time.h>
#include <validation.h>
+#include <versionbits.h>
+#include <wallet/coincontrol.h>
+#include <wallet/coinselection.h>
#include <wallet/spend.h>
#include <wallet/test/util.h>
#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
+
+#include <cassert>
+#include <cstdint>
+#include <map>
+#include <memory>
+#include <optional>
+#include <utility>
+#include <vector>
using wallet::CWallet;
using wallet::CreateMockableWalletDatabase;
diff --git a/src/bench/wallet_ismine.cpp b/src/bench/wallet_ismine.cpp
index 753404b526..29e370ce29 100644
--- a/src/bench/wallet_ismine.cpp
+++ b/src/bench/wallet_ismine.cpp
@@ -2,20 +2,29 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
+#include <addresstype.h>
#include <bench/bench.h>
-#include <interfaces/chain.h>
+#include <config/bitcoin-config.h> // IWYU pragma: keep
#include <key.h>
#include <key_io.h>
-#include <node/context.h>
+#include <script/descriptor.h>
+#include <script/script.h>
+#include <script/signingprovider.h>
+#include <sync.h>
#include <test/util/setup_common.h>
-#include <util/translation.h>
-#include <validationinterface.h>
#include <wallet/context.h>
+#include <wallet/db.h>
#include <wallet/test/util.h>
+#include <wallet/types.h>
#include <wallet/wallet.h>
#include <wallet/walletutil.h>
+#include <cassert>
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <utility>
+
namespace wallet {
static void WalletIsMine(benchmark::Bench& bench, bool legacy_wallet, int num_combo = 0)
{
@@ -43,8 +52,8 @@ static void WalletIsMine(benchmark::Bench& bench, bool legacy_wallet, int num_co
key.MakeNewKey(/*fCompressed=*/true);
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(key) + ")", keys, error, /*require_checksum=*/false);
- WalletDescriptor w_desc(std::move(desc), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/0, /*next_index=*/0);
+ std::vector<std::unique_ptr<Descriptor>> desc = Parse("combo(" + EncodeSecret(key) + ")", keys, error, /*require_checksum=*/false);
+ WalletDescriptor w_desc(std::move(desc.at(0)), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/0, /*next_index=*/0);
auto spkm = wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false);
assert(spkm);
}
diff --git a/src/bench/wallet_loading.cpp b/src/bench/wallet_loading.cpp
index 02582deda4..03459d37c1 100644
--- a/src/bench/wallet_loading.cpp
+++ b/src/bench/wallet_loading.cpp
@@ -2,21 +2,25 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
-
+#include <addresstype.h>
#include <bench/bench.h>
-#include <interfaces/chain.h>
-#include <node/context.h>
-#include <test/util/mining.h>
+#include <config/bitcoin-config.h> // IWYU pragma: keep
+#include <consensus/amount.h>
+#include <outputtype.h>
+#include <primitives/transaction.h>
#include <test/util/setup_common.h>
-#include <wallet/test/util.h>
-#include <util/translation.h>
-#include <validationinterface.h>
+#include <util/check.h>
#include <wallet/context.h>
-#include <wallet/receive.h>
+#include <wallet/db.h>
+#include <wallet/test/util.h>
+#include <wallet/transaction.h>
#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
-#include <optional>
+#include <cstdint>
+#include <memory>
+#include <utility>
+#include <vector>
namespace wallet{
static void AddTx(CWallet& wallet)
diff --git a/src/bench/xor.cpp b/src/bench/xor.cpp
index edda74214a..fc9dc5d172 100644
--- a/src/bench/xor.cpp
+++ b/src/bench/xor.cpp
@@ -3,8 +3,8 @@
// file COPYING or https://opensource.org/license/mit/.
#include <bench/bench.h>
-
#include <random.h>
+#include <span.h>
#include <streams.h>
#include <cstddef>
diff --git a/src/bitcoin-chainstate.cpp b/src/bitcoin-chainstate.cpp
index ebe013b638..9cbafa233d 100644
--- a/src/bitcoin-chainstate.cpp
+++ b/src/bitcoin-chainstate.cpp
@@ -283,8 +283,6 @@ int main(int argc, char* argv[])
epilogue:
// Without this precise shutdown sequence, there will be a lot of nullptr
// dereferencing and UB.
- if (chainman.m_thread_load.joinable()) chainman.m_thread_load.join();
-
validation_signals.FlushBackgroundCallbacks();
{
LOCK(cs_main);
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp
index 934b5fb6dc..7fcb440931 100644
--- a/src/bitcoin-cli.cpp
+++ b/src/bitcoin-cli.cpp
@@ -87,10 +87,10 @@ static void SetupCliArgs(ArgsManager& argsman)
"arguments are number of blocks to generate (default: %s) and maximum iterations to try (default: %s), equivalent to "
"RPC generatetoaddress nblocks and maxtries arguments. Example: bitcoin-cli -generate 4 1000",
DEFAULT_NBLOCKS, DEFAULT_MAX_TRIES),
- ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-addrinfo", "Get the number of addresses known to the node, per network and total, after filtering for quality and recency. The total number of addresses known to the node may be higher.", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-getinfo", "Get general information from the remote server. Note that unlike server-side RPC calls, the output of -getinfo is the result of multiple non-atomic requests. Some entries in the output may represent results from different states (e.g. wallet balance may be as of a different block from the chain state reported)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-netinfo", "Get network peer connection information from the remote server. An optional integer argument from 0 to 4 can be passed for different peers listings (default: 0). Pass \"help\" for detailed help documentation.", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
+ ArgsManager::ALLOW_ANY, OptionsCategory::CLI_COMMANDS);
+ argsman.AddArg("-addrinfo", "Get the number of addresses known to the node, per network and total, after filtering for quality and recency. The total number of addresses known to the node may be higher.", ArgsManager::ALLOW_ANY, OptionsCategory::CLI_COMMANDS);
+ argsman.AddArg("-getinfo", "Get general information from the remote server. Note that unlike server-side RPC calls, the output of -getinfo is the result of multiple non-atomic requests. Some entries in the output may represent results from different states (e.g. wallet balance may be as of a different block from the chain state reported)", ArgsManager::ALLOW_ANY, OptionsCategory::CLI_COMMANDS);
+ argsman.AddArg("-netinfo", "Get network peer connection information from the remote server. An optional integer argument from 0 to 4 can be passed for different peers listings (default: 0). Pass \"help\" for detailed help documentation.", ArgsManager::ALLOW_ANY, OptionsCategory::CLI_COMMANDS);
SetupChainParamsBaseOptions(argsman);
argsman.AddArg("-color=<when>", strprintf("Color setting for CLI output (default: %s). Valid values: always, auto (add color codes when standard output is connected to a terminal and OS is not WIN32), never.", DEFAULT_COLOR_SETTING), ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::OPTIONS);
@@ -1212,6 +1212,7 @@ static int CommandLineRPC(int argc, char *argv[])
fputc('\n', stdout);
}
}
+ gArgs.CheckMultipleCLIArgs();
std::unique_ptr<BaseRequestHandler> rh;
std::string method;
if (gArgs.IsArgSet("-getinfo")) {
diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp
index a09bb5c9da..1e27924dfd 100644
--- a/src/bitcoind.cpp
+++ b/src/bitcoind.cpp
@@ -109,10 +109,11 @@ int fork_daemon(bool nochdir, bool noclose, TokenPipeEnd& endpoint)
#endif
-static bool ParseArgs(ArgsManager& args, int argc, char* argv[])
+static bool ParseArgs(NodeContext& node, int argc, char* argv[])
{
+ ArgsManager& args{*Assert(node.args)};
// If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main()
- SetupServerArgs(args);
+ SetupServerArgs(args, node.init->canListenIpc());
std::string error;
if (!args.ParseParameters(argc, argv, error)) {
return InitError(Untranslated(strprintf("Error parsing command line arguments: %s", error)));
@@ -268,7 +269,7 @@ MAIN_FUNCTION
// Interpret command line arguments
ArgsManager& args = *Assert(node.args);
- if (!ParseArgs(args, argc, argv)) return EXIT_FAILURE;
+ if (!ParseArgs(node, argc, argv)) return EXIT_FAILURE;
// Process early info return commands such as -help or -version
if (ProcessInitCommands(args)) return EXIT_SUCCESS;
diff --git a/src/blockencodings.cpp b/src/blockencodings.cpp
index 2bcb4b0c3d..5f4061a71d 100644
--- a/src/blockencodings.cpp
+++ b/src/blockencodings.cpp
@@ -167,7 +167,7 @@ ReadStatus PartiallyDownloadedBlock::InitData(const CBlockHeaderAndShortTxIDs& c
break;
}
- LogPrint(BCLog::CMPCTBLOCK, "Initialized PartiallyDownloadedBlock for block %s using a cmpctblock of size %lu\n", cmpctblock.header.GetHash().ToString(), GetSerializeSize(cmpctblock));
+ LogDebug(BCLog::CMPCTBLOCK, "Initialized PartiallyDownloadedBlock for block %s using a cmpctblock of size %lu\n", cmpctblock.header.GetHash().ToString(), GetSerializeSize(cmpctblock));
return READ_STATUS_OK;
}
@@ -217,10 +217,10 @@ ReadStatus PartiallyDownloadedBlock::FillBlock(CBlock& block, const std::vector<
return READ_STATUS_CHECKBLOCK_FAILED;
}
- LogPrint(BCLog::CMPCTBLOCK, "Successfully reconstructed block %s with %lu txn prefilled, %lu txn from mempool (incl at least %lu from extra pool) and %lu txn requested\n", hash.ToString(), prefilled_count, mempool_count, extra_count, vtx_missing.size());
+ LogDebug(BCLog::CMPCTBLOCK, "Successfully reconstructed block %s with %lu txn prefilled, %lu txn from mempool (incl at least %lu from extra pool) and %lu txn requested\n", hash.ToString(), prefilled_count, mempool_count, extra_count, vtx_missing.size());
if (vtx_missing.size() < 5) {
for (const auto& tx : vtx_missing) {
- LogPrint(BCLog::CMPCTBLOCK, "Reconstructed block %s required tx %s\n", hash.ToString(), tx->GetHash().ToString());
+ LogDebug(BCLog::CMPCTBLOCK, "Reconstructed block %s required tx %s\n", hash.ToString(), tx->GetHash().ToString());
}
}
diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h
index 2a7e52316a..ecab817ba1 100644
--- a/src/chainparamsseeds.h
+++ b/src/chainparamsseeds.h
@@ -7,537 +7,1072 @@
* Each line contains a BIP155 serialized (networkID, addr, port) tuple.
*/
static const uint8_t chainparams_seed_main[] = {
- 0x01,0x04,0x01,0xfd,0x9f,0x13,0x20,0x8d,
- 0x01,0x04,0x02,0x98,0x4a,0xd3,0x20,0x8d,
+ 0x06,0x10,0xfc,0x1f,0x22,0xc3,0x95,0xdc,0xa3,0xaf,0x4a,0x93,0x82,0x51,0xbe,0xb9,0x18,0x58,0x20,0x8d,
+ 0x06,0x10,0xfc,0x6d,0xf5,0x62,0x86,0xa0,0x79,0x1d,0x8a,0x20,0x7a,0xa2,0x88,0x79,0x21,0x76,0x20,0x8d,
+ 0x06,0x10,0xfc,0x70,0xde,0x9d,0x7f,0xe2,0x0b,0x32,0x58,0x28,0x1a,0x3c,0x0d,0x0f,0x83,0xec,0x20,0x8d,
+ 0x06,0x10,0xfc,0x95,0x6e,0xdb,0xaf,0x65,0x9e,0xa3,0xcd,0x27,0x21,0xef,0xf5,0xe2,0x29,0xc6,0x20,0x8d,
+ 0x06,0x10,0xfc,0xa0,0x01,0x51,0x79,0xac,0x89,0x92,0xb5,0x1e,0xbd,0xc4,0x6e,0xd9,0x41,0xbe,0x20,0x8d,
+ 0x06,0x10,0xfc,0xc7,0xbe,0x49,0xcc,0xd1,0xdc,0x91,0x31,0x25,0xf0,0xda,0x45,0x7d,0x08,0xce,0x20,0x8d,
+ 0x06,0x10,0xfc,0xcb,0x02,0x48,0x11,0xa6,0x10,0x42,0x0b,0xca,0x12,0x18,0xf7,0xce,0x7d,0x3d,0x20,0x8d,
+ 0x06,0x10,0xfc,0xf1,0x22,0xff,0x30,0x70,0x58,0x2f,0xa8,0x73,0x61,0xbc,0x4b,0xc1,0x81,0xbf,0x20,0x8d,
+ 0x05,0x20,0xd6,0xf3,0x0c,0x53,0xa3,0xbc,0x36,0x64,0x2e,0xfd,0x1a,0x0e,0xbc,0x24,0xfe,0x98,0x55,0x67,0x30,0x38,0x02,0xa5,0xc7,0x84,0x98,0x36,0x9f,0x04,0xd6,0xbf,0x7d,0x27,0x00,0x00,
+ 0x05,0x20,0xd7,0xad,0x8b,0xe2,0x42,0x70,0x24,0xd9,0x88,0x4f,0xf2,0xb6,0x40,0x44,0x48,0x5c,0x70,0xa5,0x1b,0x25,0x88,0xd1,0x3d,0x64,0xb6,0xeb,0x38,0xf0,0x4d,0xc2,0xad,0x21,0x00,0x00,
+ 0x05,0x20,0xd7,0xae,0xef,0x3a,0x88,0x82,0x06,0x0f,0x15,0x15,0x57,0xc4,0x54,0x46,0xb8,0x94,0xb8,0x48,0x39,0x04,0x2b,0x90,0xcf,0x3c,0x82,0x1c,0x10,0x49,0x96,0xd7,0x6d,0x17,0x00,0x00,
+ 0x05,0x20,0xd0,0xe5,0x8b,0xb6,0xf9,0xb3,0xbc,0xb9,0xd1,0xdb,0x3b,0x46,0xd7,0x39,0xfa,0x80,0xb4,0xf4,0xe8,0x59,0x29,0x98,0x90,0xa5,0xb0,0x8b,0x5b,0x72,0x95,0x91,0xd3,0x80,0x00,0x00,
+ 0x05,0x20,0xd1,0x24,0x72,0x32,0xb4,0xae,0x00,0x73,0x48,0xe4,0x2c,0xb9,0xfb,0x4f,0x64,0x81,0xb7,0x5a,0xde,0xdd,0x4e,0x57,0x76,0x79,0x68,0x1e,0x09,0xd1,0xfb,0x26,0x12,0xd2,0x00,0x00,
+ 0x05,0x20,0xd1,0x54,0x90,0xe9,0xdf,0x7f,0x0c,0x34,0xf8,0xe9,0x46,0x26,0x65,0x1e,0xa8,0x9c,0x2c,0x98,0xb7,0xea,0x60,0xef,0x91,0xd2,0xc8,0x92,0x9f,0x81,0x37,0x27,0xaa,0xac,0x00,0x00,
+ 0x05,0x20,0xd1,0xd3,0x69,0xb9,0x56,0xe3,0x2f,0x59,0xa9,0x9d,0x7b,0xbd,0xb5,0x24,0xf8,0x77,0xd6,0x59,0x02,0x25,0x11,0xa0,0xfd,0x1d,0xfd,0x47,0x08,0xfb,0xee,0x15,0x9b,0x68,0x00,0x00,
+ 0x05,0x20,0xd2,0x4c,0x5b,0xdf,0x33,0x97,0xa2,0x58,0xf5,0x9a,0x45,0x94,0xb5,0xcf,0x00,0xd2,0x99,0x42,0x25,0xaa,0xa1,0x5f,0x3e,0x04,0x15,0xb2,0x4e,0x8d,0x27,0xe5,0x66,0x18,0x00,0x00,
+ 0x05,0x20,0xd2,0x67,0xd0,0x51,0x50,0xda,0x15,0xf0,0xd3,0x85,0x8d,0x0c,0x8e,0xd0,0x6a,0xb2,0xc4,0xa3,0x9c,0xd7,0x8e,0x52,0x74,0xd4,0xb9,0x41,0x1c,0xc5,0x5f,0x80,0x35,0xe1,0x00,0x00,
+ 0x05,0x20,0xd2,0xb6,0xbc,0xcf,0x25,0x02,0xf6,0xaf,0x0d,0x7f,0xc4,0x4f,0xa4,0xe1,0x45,0x06,0xee,0xf6,0x3a,0x9a,0x17,0xc4,0xcd,0x12,0xce,0xe4,0x05,0x35,0x2a,0xa1,0x39,0x6b,0x00,0x00,
+ 0x05,0x20,0xd2,0x83,0xb0,0x24,0x1e,0x5b,0xbc,0xfa,0x68,0x3a,0xfc,0xdd,0x2f,0x72,0x66,0x77,0x15,0x7c,0x82,0x64,0xd6,0x78,0x4b,0x6d,0x8f,0x62,0xa5,0x03,0xfa,0xd9,0x4c,0xa6,0x00,0x00,
+ 0x05,0x20,0xd3,0x28,0xae,0xff,0x5d,0xec,0xc6,0xce,0x1b,0x5f,0xd9,0x71,0xf0,0x22,0x71,0x64,0x1b,0x3a,0x46,0x93,0xf2,0xa3,0x07,0x26,0xf9,0xff,0x93,0x29,0x46,0x0c,0xd4,0x64,0x00,0x00,
+ 0x05,0x20,0xd3,0xb9,0x97,0x12,0xfa,0x7c,0x21,0x80,0x8f,0x17,0xa5,0x9c,0x86,0x37,0x6a,0x26,0xb6,0x08,0x3b,0x85,0x68,0x0c,0xb6,0x47,0x87,0xb1,0xc1,0x40,0x9d,0xa4,0x7b,0xdd,0x00,0x00,
+ 0x05,0x20,0xd3,0x87,0xc3,0x49,0x01,0xea,0x9a,0xa8,0x74,0xa7,0x0b,0x31,0x27,0xed,0xa1,0x21,0xe7,0x2f,0x7d,0xa5,0x06,0xbc,0x9a,0xf8,0xca,0x24,0x88,0x7b,0x60,0x55,0xfc,0xca,0x00,0x00,
+ 0x05,0x20,0xd3,0xa7,0xf2,0x20,0x00,0x90,0x6e,0x73,0x83,0x53,0xb9,0xa4,0x91,0xf0,0x9e,0x43,0x68,0x64,0x0c,0xfe,0xc4,0x5c,0xd4,0x8d,0x48,0xc0,0x41,0xd9,0x4b,0x6a,0x9e,0x35,0x00,0x00,
+ 0x05,0x20,0xd4,0x42,0xca,0xec,0xf8,0x8f,0x17,0xcd,0x62,0x55,0x4f,0xb4,0x33,0x3b,0x2b,0x63,0xa4,0x39,0x47,0xdd,0xbf,0x07,0x03,0x56,0xfb,0x05,0xcb,0x9c,0x5b,0x54,0xc4,0xdb,0x00,0x00,
+ 0x05,0x20,0xd5,0x7a,0xd8,0xee,0x9b,0x90,0x83,0x8b,0x8f,0x6d,0x54,0x2e,0x86,0xdb,0x4f,0xac,0x20,0x4f,0x7b,0x1c,0x38,0xb7,0x4f,0x19,0xd3,0x42,0xf5,0x23,0x07,0x08,0xac,0x69,0x00,0x00,
+ 0x05,0x20,0xd5,0x64,0xb2,0x2c,0x56,0xce,0x2f,0x5a,0xb3,0x71,0xcc,0x74,0x88,0x86,0xa0,0xb7,0xc9,0x84,0x2d,0x79,0x9d,0x8b,0x11,0x8f,0x5c,0xcc,0x8e,0x7b,0x1c,0xbd,0x8b,0x13,0x00,0x00,
+ 0x05,0x20,0xd5,0x6c,0xb6,0x58,0x32,0x6b,0x3c,0x54,0x14,0xa2,0x5f,0x5a,0x6c,0xf0,0xdf,0x8f,0x27,0x84,0x12,0x9f,0x4f,0x2e,0xc7,0xd9,0x6c,0x16,0xaf,0x75,0xe9,0x98,0x1e,0xb3,0x00,0x00,
+ 0x05,0x20,0xd5,0xdb,0x6a,0xc3,0x8c,0x90,0x30,0xba,0xe8,0x0e,0x67,0xda,0x7a,0x16,0x49,0xc4,0x0e,0xef,0xc0,0xfb,0x33,0xd0,0x44,0xea,0xc1,0x5f,0x90,0xc1,0x94,0x0b,0xc4,0x5d,0x00,0x00,
+ 0x05,0x20,0xd6,0x79,0x01,0x2a,0x09,0x56,0x75,0x74,0xda,0x2e,0x3a,0x13,0xef,0x72,0x0b,0x04,0x41,0x77,0x6a,0x38,0x04,0x85,0x25,0xdb,0x84,0x39,0x53,0x79,0xae,0x76,0x72,0xf3,0x00,0x00,
+ 0x05,0x20,0xdf,0xe6,0xcb,0x43,0x43,0xc7,0x24,0xc8,0x1b,0x9e,0x82,0x8d,0x59,0x75,0xee,0x10,0x36,0x71,0x11,0xc4,0x79,0xcc,0xae,0xb9,0xa9,0x89,0x93,0x7c,0x3c,0xfc,0x18,0xd7,0x00,0x00,
+ 0x05,0x20,0xd8,0xa7,0x0e,0xa6,0x82,0x65,0x0d,0x74,0xd1,0x9a,0xb8,0x18,0xc2,0x87,0x26,0x1b,0x25,0x7d,0x6c,0x0a,0xdb,0xc9,0x45,0x7b,0x81,0xfd,0x4d,0x0e,0xdb,0x99,0xf9,0xe1,0x00,0x00,
+ 0x05,0x20,0xd8,0xfa,0x75,0x9a,0x8e,0xde,0x32,0x1c,0xd8,0x3f,0x22,0xb9,0xea,0x09,0x5a,0x67,0xbf,0x4e,0x62,0x94,0x7f,0x3b,0xeb,0x62,0xc3,0xae,0x4f,0x90,0x64,0x54,0xe6,0xeb,0x00,0x00,
+ 0x05,0x20,0xd9,0x9c,0x20,0xfe,0xc2,0xe6,0x6a,0x16,0x30,0x81,0x54,0xc9,0x3f,0x9a,0x89,0x10,0xa9,0x4b,0xf1,0x05,0x56,0xd5,0x04,0x2d,0xb7,0x6a,0x7b,0x67,0x8d,0xf0,0xbe,0x8f,0x00,0x00,
+ 0x05,0x20,0xd9,0xf2,0x84,0x0e,0x2f,0xcc,0x2a,0xd9,0x71,0x36,0x2c,0x0f,0x90,0xfd,0xb8,0x1d,0xb8,0xc9,0xb5,0xaa,0x05,0x9e,0x48,0x96,0xad,0x04,0x69,0xbc,0xbe,0x8f,0xd2,0x0f,0x00,0x00,
+ 0x05,0x20,0xda,0x11,0x7a,0xe2,0xd7,0x85,0x9b,0x2e,0x7f,0xf1,0xf0,0x2e,0x7c,0x2c,0xa2,0x99,0x21,0xd0,0xd8,0xc6,0xc7,0xc4,0xc8,0x86,0x93,0x84,0x48,0x3e,0xf1,0x48,0x35,0x9c,0x00,0x00,
+ 0x05,0x20,0xda,0x60,0x9c,0x4c,0x9a,0x57,0xae,0xd7,0x12,0x78,0x33,0x3c,0x62,0x81,0x48,0x95,0x33,0xb2,0x42,0xf1,0xd9,0x45,0x4e,0x2f,0xaa,0x65,0x37,0x94,0x15,0xed,0x51,0xeb,0x00,0x00,
+ 0x05,0x20,0xdb,0x81,0xd2,0xe0,0x57,0xdc,0xf0,0x41,0x1c,0x65,0x33,0x9d,0x3b,0x89,0xe0,0x7f,0xe5,0x7f,0xbf,0x72,0x05,0x88,0xd8,0x87,0x38,0xc5,0xe3,0x3c,0x7f,0x91,0x9f,0xf3,0x00,0x00,
+ 0x05,0x20,0xdc,0x7e,0xce,0xb0,0x24,0x71,0x95,0x1f,0x4b,0x1e,0xf1,0x7c,0x6d,0xeb,0xad,0x91,0x74,0x94,0x21,0x93,0x28,0xdb,0xda,0xfa,0xcf,0xbe,0x7d,0x48,0x32,0x58,0x0c,0x12,0x00,0x00,
+ 0x05,0x20,0xdc,0xbf,0x96,0x01,0x86,0x2b,0x16,0x7b,0x56,0x2d,0xeb,0xab,0xbd,0x52,0x86,0x0a,0xc6,0xe5,0x03,0xe9,0xb8,0x49,0x3a,0x7a,0x69,0x94,0x36,0x1c,0xaa,0x21,0xe8,0xc4,0x00,0x00,
+ 0x05,0x20,0xdd,0x28,0x34,0xf9,0x65,0xc5,0x93,0x08,0x85,0x0f,0x59,0xac,0xe0,0x5d,0xe4,0x0e,0x95,0xc6,0x03,0xfd,0x62,0xd8,0xf4,0x43,0xee,0xb5,0x76,0x17,0x16,0xcb,0xa8,0x07,0x00,0x00,
+ 0x05,0x20,0xde,0x38,0xe4,0x5b,0xe2,0x32,0xf3,0x99,0x1c,0x12,0x03,0xca,0xc5,0xcc,0x9f,0x45,0xc2,0x67,0xaf,0x89,0x97,0xed,0xa0,0x16,0x43,0xe6,0x5a,0x46,0x53,0x83,0x19,0x0a,0x00,0x00,
+ 0x05,0x20,0xe6,0x8d,0x48,0x4a,0xa3,0x21,0x39,0x36,0x43,0x70,0x07,0x58,0x9b,0x76,0xa9,0x56,0x54,0xaa,0x2b,0xa4,0x02,0x1a,0x41,0x4a,0x32,0x19,0x49,0x7d,0xdb,0x05,0xfc,0xed,0x00,0x00,
+ 0x05,0x20,0xe7,0x20,0x1d,0xb4,0xb2,0x89,0x23,0xa2,0xf0,0x98,0x3f,0x79,0x2f,0xc0,0x75,0xb5,0xd1,0x85,0x26,0x24,0x8f,0xfc,0x94,0x92,0xa2,0x0b,0xc6,0xdd,0xa3,0xd4,0x06,0x02,0x00,0x00,
+ 0x05,0x20,0xe7,0x2a,0xd2,0x00,0x8c,0x40,0xff,0xd1,0x3b,0xb3,0xfc,0x52,0xd7,0xed,0xc5,0x78,0x23,0xdd,0x18,0xda,0x38,0x61,0x8f,0x89,0x8e,0x59,0x5a,0xbd,0x60,0xe9,0x13,0x1f,0x00,0x00,
+ 0x05,0x20,0xe7,0x48,0x7f,0x46,0xe1,0x2a,0xd1,0xc4,0xd3,0x5e,0x14,0x00,0x5f,0x6e,0xa5,0x97,0x6f,0x7f,0x64,0xd3,0xf9,0xdb,0xba,0x67,0x39,0xdb,0x48,0xce,0x74,0x7c,0x7c,0xbd,0x00,0x00,
+ 0x05,0x20,0xe7,0xae,0xe8,0xe3,0xde,0x78,0xbd,0x0b,0x8f,0xc6,0x58,0x1e,0xc1,0x46,0xf4,0x4b,0xfd,0x61,0x76,0x56,0x31,0xce,0x16,0x9f,0x01,0xa9,0x2d,0x72,0x95,0xdb,0xf9,0x81,0x00,0x00,
+ 0x05,0x20,0xe7,0xd3,0x15,0xc1,0x63,0xf3,0x3e,0x00,0x82,0xfe,0x63,0x17,0x8d,0x6d,0xe6,0xe1,0xf0,0x07,0x89,0x4c,0xbf,0x0e,0x7c,0xe6,0x4e,0xca,0x8c,0x09,0x5a,0x14,0xdb,0x43,0x00,0x00,
+ 0x05,0x20,0xe0,0x7e,0xc1,0x3a,0x9f,0xb4,0xc1,0x97,0x5e,0xd7,0x7b,0x3b,0x35,0xf2,0x6a,0xfc,0x00,0x05,0xb4,0x01,0x1f,0x91,0xfb,0x55,0xac,0x7d,0x7a,0xe6,0x55,0xdf,0x71,0x96,0x00,0x00,
+ 0x05,0x20,0xe0,0xc7,0x44,0x62,0x6e,0x7e,0xe0,0x94,0x38,0x61,0xd2,0x5b,0x6a,0x9e,0xad,0xc4,0x7d,0x6d,0xe3,0xa0,0xbe,0x77,0x5c,0xab,0xb0,0x89,0x48,0x5a,0x47,0x85,0x37,0xa1,0x00,0x00,
+ 0x05,0x20,0xe0,0xd1,0x79,0x18,0x6b,0xd8,0x5e,0xd5,0x20,0x07,0x67,0xe8,0x06,0xd1,0xf8,0x13,0xca,0x6e,0xec,0xf7,0x70,0x6e,0x66,0x74,0xb2,0x6c,0xaa,0xf9,0xeb,0x07,0x02,0xe0,0x00,0x00,
+ 0x05,0x20,0xe2,0xcb,0x45,0x57,0x29,0x15,0x1f,0x2a,0xa4,0x73,0x76,0x08,0x05,0x80,0x39,0x08,0xe4,0xfd,0x82,0x3c,0x9a,0x42,0x7b,0xce,0xd8,0x78,0x43,0xa5,0xfd,0x9a,0x13,0xed,0x00,0x00,
+ 0x05,0x20,0xe2,0xd8,0x76,0xea,0xf0,0x2a,0x1a,0x42,0x62,0x14,0xbd,0xeb,0xd4,0x5d,0xd9,0x82,0x9b,0xc2,0x62,0x99,0x10,0x96,0xaf,0x6b,0xd0,0xf7,0xd0,0xc7,0xdf,0xa7,0x6b,0x4f,0x00,0x00,
+ 0x05,0x20,0xe2,0xdc,0xc6,0x36,0xe0,0xce,0x3c,0x2f,0xef,0x98,0xc0,0x82,0xcc,0xc1,0x4e,0x1a,0xf2,0x2b,0xbe,0xd2,0x0e,0x3b,0x65,0xb0,0xed,0x38,0x83,0x83,0x01,0x86,0xb4,0x6e,0x00,0x00,
+ 0x05,0x20,0xe3,0x10,0xf5,0xda,0xed,0xb1,0xf6,0xb6,0x80,0x06,0xd3,0xd2,0x43,0x8f,0x17,0xc6,0x4d,0x12,0xe7,0xd8,0x17,0xab,0x6a,0x2c,0x34,0x37,0x93,0x1e,0x45,0xa4,0x9e,0x53,0x00,0x00,
+ 0x05,0x20,0xe3,0x6e,0x3c,0x2e,0x66,0x1d,0x9e,0x55,0x02,0x93,0x7c,0x40,0xb0,0x08,0x6b,0x72,0xf2,0xb7,0xda,0x3c,0xd8,0x93,0xc4,0x1b,0x86,0x76,0x5b,0xdc,0x73,0x66,0x57,0x9b,0x00,0x00,
+ 0x05,0x20,0xe4,0x50,0xf4,0x5f,0x52,0x23,0xba,0x01,0x6c,0x29,0x0f,0x01,0xd5,0xba,0x87,0x98,0x70,0x23,0x1f,0x05,0xda,0xc9,0x89,0x20,0x78,0xd6,0xac,0xd0,0x81,0x5f,0x9e,0x53,0x00,0x00,
+ 0x05,0x20,0xe4,0x5d,0xe7,0x28,0x3b,0xbf,0xb8,0x6f,0xd3,0x8a,0x39,0xc5,0xf8,0xc0,0x0b,0x62,0xac,0xa5,0x51,0x81,0x05,0x54,0x2b,0xfe,0xb0,0x78,0xaa,0xa4,0x6a,0x8d,0x07,0xf4,0x00,0x00,
+ 0x05,0x20,0xe4,0xb7,0xf2,0x63,0x76,0xe2,0xda,0x29,0x7a,0xf7,0xc0,0x9b,0x75,0x48,0x27,0x04,0xcb,0x5b,0xea,0x73,0x30,0xb6,0xe0,0x8e,0xaf,0x44,0x51,0x1e,0x67,0x29,0x04,0xa5,0x00,0x00,
+ 0x05,0x20,0xef,0xe4,0x71,0x17,0x28,0x07,0xfa,0xa2,0x4d,0x71,0x84,0x5b,0x53,0x5e,0xa0,0x42,0x4e,0x19,0xb7,0x72,0x6c,0x53,0x6f,0x7b,0x60,0x6a,0xba,0x10,0x27,0xf0,0x8e,0xba,0x00,0x00,
+ 0x05,0x20,0xe8,0x0d,0x85,0x84,0xaa,0xa5,0xad,0x06,0xe1,0x10,0xb4,0xcd,0x73,0x41,0x78,0x0b,0x94,0xa8,0x16,0xae,0xbd,0x92,0x15,0x0b,0xfb,0xd0,0x82,0xe9,0xf4,0xba,0xcf,0x1b,0x00,0x00,
+ 0x05,0x20,0xe8,0x60,0xd7,0xb3,0x73,0x82,0xd5,0x83,0x40,0xd4,0xea,0xdb,0x9b,0xde,0x96,0xf0,0x42,0x91,0xe6,0x0a,0x18,0x42,0xc5,0x94,0x39,0x6f,0x37,0xc8,0x3f,0x09,0xfb,0x27,0x00,0x00,
+ 0x05,0x20,0xe9,0x19,0x33,0xb3,0xeb,0xa2,0x92,0x03,0xe9,0xed,0x83,0xa9,0x16,0x34,0xe9,0x57,0xb2,0x7a,0x26,0x26,0xca,0x60,0x32,0x54,0x99,0x19,0x7c,0x3f,0x54,0x0b,0x12,0xd0,0x00,0x00,
+ 0x05,0x20,0xe9,0x75,0x2b,0xf5,0xa4,0xd0,0x87,0xd6,0x4d,0xc1,0x8e,0x80,0x12,0x19,0x99,0xb1,0xf4,0xef,0x21,0x04,0xde,0x17,0x13,0x99,0x23,0x50,0x51,0x54,0xc0,0x23,0x63,0xc9,0x00,0x00,
+ 0x05,0x20,0xea,0x14,0x9c,0x75,0xf9,0x32,0x55,0xbf,0x9c,0xff,0x28,0x94,0xdc,0x60,0xf7,0xed,0x7a,0xb5,0x08,0xe9,0x82,0x9b,0x7f,0x9f,0x11,0x29,0x62,0x9f,0x9e,0xbf,0x5e,0x03,0x00,0x00,
+ 0x05,0x20,0xea,0x9c,0x6f,0xee,0x96,0x99,0xe5,0xae,0xf6,0x63,0x8d,0x88,0x4f,0x8c,0x5a,0x7c,0x8f,0x0f,0x5d,0x74,0x50,0x6f,0x37,0x99,0xbb,0x08,0x6d,0x46,0xb3,0xba,0x4d,0x87,0x00,0x00,
+ 0x05,0x20,0xeb,0x05,0x75,0xe2,0x79,0xbf,0x78,0x21,0xf6,0xde,0x75,0x18,0xe9,0x6c,0x01,0xfe,0x30,0x0d,0xda,0xe0,0xcc,0x60,0x29,0xf2,0x82,0xf6,0x8b,0xa1,0xea,0x72,0xde,0x41,0x00,0x00,
+ 0x05,0x20,0xeb,0x6a,0xb2,0x0d,0xb5,0x92,0x4e,0xff,0xf4,0xbf,0xeb,0xd8,0xbc,0x64,0x14,0x4a,0xb3,0x2a,0xd8,0x4a,0xad,0x65,0x8a,0x02,0xb1,0x92,0xca,0x28,0x77,0x26,0x4e,0xe6,0x00,0x00,
+ 0x05,0x20,0xeb,0xd2,0x00,0x12,0xe8,0x53,0x17,0x83,0xaf,0xa3,0x41,0xf3,0x58,0x07,0x0a,0xa1,0x05,0xea,0x65,0x58,0xa2,0x6b,0x59,0x74,0x29,0x72,0x3c,0x79,0xac,0x3b,0x75,0xf3,0x00,0x00,
+ 0x05,0x20,0xeb,0xe9,0x5a,0xab,0x15,0xf4,0x23,0xa5,0x02,0x01,0xd0,0x2a,0x18,0x5f,0x27,0x1e,0x11,0x0a,0x1d,0x5a,0xff,0xbe,0xe6,0x1d,0xc0,0xd4,0xbb,0xa3,0x09,0xa5,0x15,0xf9,0x00,0x00,
+ 0x05,0x20,0xec,0x5c,0x93,0x49,0x55,0x12,0x19,0x49,0x10,0x80,0xbb,0xd2,0x87,0x1d,0x81,0xf0,0x7b,0x1e,0xd6,0x5e,0xaf,0x8e,0x72,0x03,0x1b,0x51,0x19,0x10,0x42,0xac,0x37,0x91,0x00,0x00,
+ 0x05,0x20,0xed,0x1b,0x4a,0x0e,0x2d,0xbc,0x14,0x33,0x42,0x51,0x28,0x64,0xcb,0xed,0x1e,0x45,0xad,0x33,0xa2,0xad,0x34,0xca,0xcf,0xc8,0x63,0x7c,0xd2,0x8c,0xbe,0x17,0x79,0xc3,0x00,0x00,
+ 0x05,0x20,0xed,0xe5,0x4a,0x22,0x85,0x0b,0x1c,0xd1,0x0e,0xb6,0x57,0x7b,0x11,0xf2,0x12,0xd7,0x1c,0x46,0x3a,0x93,0x38,0x22,0x7e,0x9d,0xbe,0xd6,0x3e,0xf6,0xfa,0x39,0x57,0x88,0x00,0x00,
+ 0x05,0x20,0xf6,0xa5,0x1b,0x6b,0x65,0xe4,0x63,0x7c,0xcb,0x7a,0xee,0xcd,0xf6,0x07,0x4b,0x0b,0x9f,0xb7,0x95,0xf2,0xa7,0x7c,0x6e,0xa1,0x0f,0x9c,0x40,0xed,0xc1,0xc0,0x90,0xf8,0x00,0x00,
+ 0x05,0x20,0xf0,0xd5,0x53,0xac,0xf6,0x72,0x2c,0xf1,0xa5,0xe4,0x0d,0x08,0xcb,0xc3,0xde,0x93,0x8f,0xe7,0x4b,0xd7,0x06,0xa5,0x0e,0x68,0x76,0x39,0x42,0xfd,0x8f,0x92,0x1e,0x4c,0x00,0x00,
+ 0x05,0x20,0xf1,0x36,0x14,0x1b,0x0f,0x04,0xd9,0x51,0x52,0x65,0x6c,0xd6,0xe6,0x9e,0x27,0x79,0x45,0xdc,0x70,0xe1,0x5f,0x05,0x80,0x04,0xc9,0xae,0xad,0x3f,0x14,0xf6,0x4d,0xf7,0x00,0x00,
+ 0x05,0x20,0xf1,0xe0,0xe1,0xe1,0xb5,0xa9,0x41,0xbc,0x15,0x71,0x15,0x58,0xf6,0xa3,0x0d,0xed,0x76,0x81,0xcd,0x42,0x9d,0xfe,0x64,0x24,0x6b,0xaf,0x6c,0x31,0xef,0xf7,0x6c,0x38,0x00,0x00,
+ 0x05,0x20,0xf2,0x4f,0xcb,0x8e,0x12,0xdf,0x56,0xa3,0xc1,0xb8,0x6d,0xc5,0x3c,0x1e,0x08,0x50,0x9b,0x87,0xae,0xb2,0xe2,0x69,0x53,0x05,0x33,0xe6,0x46,0xbc,0xc6,0x7c,0xa3,0xcf,0x00,0x00,
+ 0x05,0x20,0xf3,0x0e,0xb5,0x13,0x8e,0x6b,0xc7,0x01,0x15,0x40,0x27,0xb0,0x8d,0x6d,0x84,0x2b,0x67,0xae,0x5c,0xd5,0x43,0xc2,0xed,0x71,0x50,0x5d,0x33,0xac,0x5f,0xc5,0x15,0x1d,0x00,0x00,
+ 0x05,0x20,0xf3,0x22,0xe3,0x03,0xff,0x21,0x8b,0xa2,0xe6,0x5f,0xc7,0x3c,0x7a,0x1e,0xf6,0x24,0x9e,0xfb,0xdf,0xca,0xfe,0x92,0x2f,0x9f,0x42,0xcb,0x61,0xa2,0xb0,0x40,0x22,0xe5,0x00,0x00,
+ 0x05,0x20,0xf3,0x4e,0x57,0xa4,0xdd,0xe1,0x87,0x6c,0xe9,0x2b,0x7e,0xe1,0x99,0xf9,0x83,0xaa,0x95,0xd2,0xbf,0xe9,0x8f,0x02,0x2d,0xf5,0xe7,0xda,0xbb,0x0f,0x8d,0xbe,0x13,0x4b,0x00,0x00,
+ 0x05,0x20,0xf3,0x4e,0x60,0x0b,0xd6,0x7b,0x04,0x73,0x89,0x8e,0xc6,0xfd,0x87,0x80,0x94,0xf5,0x02,0x2f,0x96,0x1c,0x95,0x11,0xe7,0x9d,0x0d,0xe6,0x5e,0x05,0x27,0x6c,0x60,0x6e,0x00,0x00,
+ 0x05,0x20,0xf3,0x6e,0xe0,0x31,0x29,0x92,0x8a,0x59,0x96,0x8b,0x8d,0xe5,0x2e,0xb2,0xae,0x0f,0x7d,0x8a,0x20,0xbc,0x2d,0xce,0x8b,0xfa,0xf2,0xb6,0xba,0x83,0x53,0x87,0xf9,0x08,0x00,0x00,
+ 0x05,0x20,0xf4,0x43,0xc6,0xb5,0xab,0x00,0x26,0x99,0x3c,0x8e,0x85,0xfb,0xb3,0x23,0xef,0xd6,0x38,0x50,0x1a,0xd3,0xa0,0x8e,0xbd,0x33,0x4b,0xde,0x8e,0x72,0x45,0x26,0x50,0x30,0x00,0x00,
+ 0x05,0x20,0xf5,0x6b,0x74,0x22,0x0c,0x78,0x80,0x0c,0xe4,0xb7,0xe9,0xf5,0xb0,0x78,0xef,0x79,0xa6,0xc9,0x03,0xfd,0x36,0xdc,0x44,0x21,0x7d,0x2f,0x4f,0x8a,0x99,0xa4,0x86,0x8e,0x00,0x00,
+ 0x05,0x20,0xf5,0x6e,0x0b,0x70,0x63,0xa6,0x36,0x72,0xb8,0xa5,0xe0,0x27,0x02,0xaa,0x7c,0x18,0xb7,0x81,0xff,0x76,0x43,0x16,0x32,0x11,0x8f,0x2c,0x4b,0x13,0xfa,0x18,0x28,0xee,0x00,0x00,
+ 0x05,0x20,0xf5,0xa7,0x22,0x0d,0xcd,0x98,0x3b,0x87,0x24,0x38,0xff,0xc1,0x32,0x41,0x5a,0x73,0xc1,0x95,0x0e,0x99,0xf8,0x69,0x1f,0xad,0xce,0xf8,0xe5,0xb8,0xea,0x9e,0xbd,0x41,0x00,0x00,
+ 0x05,0x20,0xf5,0xae,0x46,0xae,0xb3,0x4e,0x78,0x4f,0xf0,0x4f,0xe8,0xc5,0x8f,0x12,0xda,0x95,0x93,0xc5,0x98,0x56,0xe5,0xa1,0x3e,0x7a,0xe1,0x26,0x32,0x43,0x58,0xb2,0xd1,0x01,0x00,0x00,
+ 0x05,0x20,0xf6,0x04,0x38,0xc5,0x3c,0x91,0xe7,0x57,0xf7,0x1d,0x77,0x5a,0x03,0x5e,0x67,0xf1,0x3f,0xd6,0xc5,0x6f,0x69,0x89,0x2b,0x3e,0x77,0x5e,0x41,0x70,0x43,0xb3,0x9c,0x12,0x00,0x00,
+ 0x05,0x20,0xff,0x9c,0x14,0x9c,0x71,0xb7,0xa5,0x65,0x2e,0xb9,0xf6,0x83,0x8e,0xd4,0xa3,0x58,0xe8,0x61,0xb1,0x39,0xfc,0x50,0x50,0xa8,0x34,0x01,0x3f,0xa9,0x08,0x23,0x72,0x7d,0x00,0x00,
+ 0x05,0x20,0xff,0xfd,0xfc,0x62,0xd7,0x6e,0xb4,0xe6,0xf2,0xb3,0xf1,0x17,0x6f,0x79,0xcd,0x19,0xc4,0x25,0x7d,0x70,0x10,0x06,0xfd,0xf0,0x3a,0xd3,0x28,0x52,0x09,0x3a,0xb6,0x18,0x00,0x00,
+ 0x05,0x20,0xff,0xc6,0x05,0xc8,0xd1,0xe5,0x42,0x95,0x0d,0xbb,0x2c,0x4e,0x85,0x2e,0xa4,0x35,0x03,0xe0,0x04,0xcb,0x90,0x81,0x08,0x81,0x14,0x85,0x9b,0xbd,0x8b,0x75,0x9d,0xbe,0x00,0x00,
+ 0x05,0x20,0xf8,0x84,0x13,0xdc,0x9b,0x72,0x41,0x2e,0x91,0x5e,0x34,0xf1,0x03,0x7b,0x8c,0x80,0x86,0x28,0x2a,0x39,0x27,0x36,0xda,0x58,0x6b,0x71,0x48,0x7e,0xcf,0x65,0x88,0xdd,0x00,0x00,
+ 0x05,0x20,0xf8,0xf6,0xc2,0xd5,0x89,0x0e,0x2b,0x79,0x81,0x06,0x9e,0x75,0xdb,0x7e,0x21,0x68,0x61,0x2c,0xd2,0x62,0x35,0x5c,0x04,0x70,0xcb,0x3e,0xf3,0x4a,0xef,0x86,0x5b,0xee,0x00,0x00,
+ 0x05,0x20,0xf8,0xe0,0x92,0x68,0x43,0xa3,0x15,0xdc,0x10,0xbb,0xe7,0xad,0x2f,0xdb,0xb3,0xf6,0xc4,0xcd,0xa5,0x28,0x40,0x77,0x96,0x4c,0x77,0xba,0x9a,0x08,0x57,0xa0,0xbc,0xa8,0x00,0x00,
+ 0x05,0x20,0xf9,0x3d,0x7c,0xf5,0xe5,0x6d,0xa4,0xd9,0x73,0x62,0xba,0x3f,0x0c,0x1b,0x00,0x96,0x2a,0xb2,0xc5,0x5f,0x32,0x49,0x05,0xb3,0xc0,0x92,0xfc,0xf0,0xb7,0x97,0x2e,0xd5,0x00,0x00,
+ 0x05,0x20,0xf9,0x26,0xfc,0x6f,0x75,0xaf,0x17,0x9f,0x59,0x8c,0x6f,0x1d,0xb7,0x7c,0xf4,0x09,0x8d,0x24,0x1a,0xed,0x58,0x36,0x47,0x0b,0x98,0x60,0xb1,0xe1,0x91,0xc2,0x9d,0x8f,0x00,0x00,
+ 0x05,0x20,0xf9,0x46,0x37,0xd1,0xac,0x9e,0x3e,0x48,0xd0,0xf4,0x64,0x34,0x88,0x03,0x58,0xb7,0x44,0xa1,0x37,0xd7,0x7c,0xad,0xaf,0x3d,0x3e,0x14,0x9a,0x76,0xcf,0x1b,0x48,0xa0,0x00,0x00,
+ 0x05,0x20,0xf9,0x61,0xe8,0x1d,0x77,0x55,0xc5,0xac,0x86,0x72,0x3a,0xce,0x42,0xec,0xb5,0xf4,0x9c,0x38,0x22,0x5c,0x90,0x38,0xe4,0x97,0xa4,0x3a,0x16,0x77,0x78,0x7b,0x55,0x5b,0x00,0x00,
+ 0x05,0x20,0xf9,0xbc,0xd0,0x0c,0xd2,0xa8,0xd5,0xe3,0x91,0x63,0x1d,0x3e,0xd1,0x64,0xe7,0x93,0xea,0x1e,0xf2,0xc6,0x75,0x4f,0x70,0xec,0x69,0x53,0xc7,0xca,0x86,0x6a,0xc0,0xe7,0x00,0x00,
+ 0x05,0x20,0xf9,0xdf,0x58,0x87,0xe2,0x5a,0x15,0xee,0xe9,0xa5,0xdc,0xbd,0x63,0xad,0x57,0xe3,0xd3,0x77,0x5a,0x6f,0x40,0xd7,0x9d,0x7f,0x74,0xcb,0x75,0x29,0xf4,0x38,0x66,0x5e,0x00,0x00,
+ 0x05,0x20,0xfa,0x10,0x81,0x69,0x0a,0x8d,0x98,0x23,0xc9,0xab,0xad,0xbc,0x96,0xff,0xb5,0x7d,0x67,0x4a,0x1a,0xff,0x64,0x08,0x10,0xaf,0xd8,0x6a,0xf9,0x84,0x4f,0xe0,0xf2,0x57,0x00,0x00,
+ 0x05,0x20,0xfa,0x6d,0x5b,0xfc,0x86,0x20,0xf7,0xc1,0x4e,0x26,0xc4,0x67,0xdc,0x7a,0xfd,0x7f,0xef,0x95,0x15,0xe8,0x1d,0x6d,0x1b,0xa5,0xeb,0x86,0x2d,0x00,0x74,0x70,0x59,0xb6,0x00,0x00,
+ 0x05,0x20,0xfa,0xfc,0xbe,0x7d,0x7f,0x7d,0x91,0xfa,0x94,0x9f,0x8b,0x98,0xb5,0x3d,0xae,0x85,0x3f,0xe1,0xc7,0x86,0x79,0xe2,0x36,0x20,0x5c,0x9e,0x46,0xa3,0x21,0x05,0x36,0x7b,0x00,0x00,
+ 0x05,0x20,0xfb,0xad,0x4b,0xf4,0x1b,0xdf,0x60,0x6c,0x77,0xf9,0xfa,0xc9,0x56,0xfc,0x85,0x77,0x5e,0xdc,0xd5,0x75,0x60,0x4f,0x3e,0x7a,0x80,0xf8,0xac,0x8e,0xa6,0x1e,0x89,0xec,0x00,0x00,
+ 0x05,0x20,0xfc,0x34,0xfd,0xce,0xb8,0xe1,0x6d,0xbd,0xf5,0xed,0x63,0xc5,0x85,0x0e,0x89,0x6a,0x8d,0xaf,0xed,0x87,0x80,0xb8,0xea,0x69,0x14,0x6c,0x24,0x80,0x77,0x41,0x32,0x5c,0x00,0x00,
+ 0x05,0x20,0xfc,0x25,0x6f,0x00,0x55,0xff,0xb4,0xe2,0xe1,0xac,0x97,0x73,0xa2,0x6f,0xbc,0x9d,0x5f,0xa5,0x73,0xba,0xfa,0xfc,0x82,0xba,0x3f,0xb6,0xe8,0xa5,0xe4,0x08,0x98,0xf7,0x00,0x00,
+ 0x05,0x20,0xfc,0x78,0x60,0x5d,0x41,0xd2,0x2c,0xd1,0x80,0xa8,0x96,0x86,0x2c,0x80,0x5b,0x06,0x98,0x59,0x4a,0xe4,0x51,0x2e,0x5a,0x97,0xbb,0x7f,0xe4,0x84,0x66,0x86,0x36,0xac,0x00,0x00,
+ 0x05,0x20,0xfc,0x79,0x14,0x77,0x6b,0x0e,0x34,0x8d,0xde,0x01,0x33,0xed,0xb4,0x0e,0xa7,0xc9,0x15,0x4f,0xd0,0x27,0x2c,0xd6,0x5f,0xe9,0x63,0x82,0x8d,0xd5,0x0c,0x9e,0x18,0x29,0x00,0x00,
+ 0x05,0x20,0xfc,0x43,0x09,0xcf,0x99,0x05,0x09,0x60,0xb9,0xa1,0x15,0x40,0x84,0x30,0xab,0xad,0xd2,0xa4,0x3c,0x3d,0x9f,0xcd,0x49,0x61,0xff,0x61,0x47,0x05,0x91,0xed,0x50,0x47,0x00,0x00,
+ 0x05,0x20,0xfc,0xe3,0x81,0xe6,0xe0,0xbf,0xdc,0x7d,0xf1,0xfb,0x9b,0xa7,0x74,0x13,0xbf,0x56,0xee,0x88,0x54,0x23,0x16,0xc3,0xa3,0x05,0xe9,0xa0,0xc1,0xf7,0x60,0x90,0x77,0x50,0x00,0x00,
+ 0x05,0x20,0xfc,0xe6,0x95,0xac,0xee,0x23,0x2a,0x24,0xd8,0xdc,0x86,0x4d,0x11,0x46,0x1a,0xa6,0x36,0x2e,0x6e,0x8d,0x33,0x46,0xe6,0x07,0x84,0x01,0xc5,0x24,0xe3,0x5d,0x25,0x31,0x00,0x00,
+ 0x05,0x20,0xfd,0x26,0x2f,0x66,0x79,0x80,0x16,0x99,0xa2,0x20,0x09,0x76,0xbe,0xe1,0xb5,0x2e,0xc0,0xa6,0x65,0xc5,0x06,0x10,0x3e,0x08,0x08,0x07,0x9a,0x3f,0x67,0xc0,0xd1,0x03,0x00,0x00,
+ 0x05,0x20,0xfd,0x8d,0x1c,0x58,0xf2,0x50,0xf5,0xc5,0x42,0x09,0xab,0x87,0x7f,0x06,0xed,0x4b,0x6b,0xbf,0xf2,0xeb,0x6c,0x6d,0x29,0x63,0xf9,0x80,0xf9,0x6c,0x83,0xa3,0x8c,0x19,0x00,0x00,
+ 0x05,0x20,0xfd,0x9f,0xc8,0xc4,0xa5,0xd9,0x43,0x1a,0x0e,0x29,0xed,0x33,0x2a,0xc3,0x97,0x71,0x55,0x34,0xf6,0x69,0xfb,0x98,0xd7,0x8a,0x16,0xe3,0x3f,0x11,0x26,0x47,0x96,0xf2,0x00,0x00,
+ 0x05,0x20,0x06,0xb2,0x87,0x38,0x58,0xe6,0x76,0x94,0x25,0xbe,0x86,0x57,0xa3,0x45,0x05,0x80,0xfe,0x7a,0xd1,0x5e,0x50,0x0c,0x9a,0xf5,0x80,0x74,0x22,0xdb,0xd9,0xd4,0x10,0xdd,0x00,0x00,
+ 0x05,0x20,0x07,0x7f,0x41,0x73,0xa2,0x89,0xb1,0x39,0x96,0x5e,0x42,0x76,0x58,0xf3,0x90,0xe5,0xba,0x84,0xfb,0x18,0xf1,0x58,0x70,0xab,0x1b,0xff,0x01,0x4f,0xc6,0x70,0xe4,0xb4,0x00,0x00,
+ 0x05,0x20,0x00,0x6e,0xc6,0x41,0x43,0xa3,0x51,0xfd,0xa9,0x1e,0x00,0x33,0x85,0xf7,0x3b,0x0f,0x88,0x13,0xfb,0x62,0x2c,0x89,0xcd,0xe5,0xda,0x29,0xaa,0xf8,0x3b,0xfd,0x5f,0xe3,0x00,0x00,
+ 0x05,0x20,0x00,0xd8,0x53,0x8f,0x43,0xd9,0xa9,0xba,0x92,0xa0,0x8a,0x47,0xe9,0x86,0x78,0xfc,0x61,0xf2,0x86,0x91,0x3a,0x93,0xfe,0x5f,0xb4,0x01,0x85,0xc7,0x1a,0x95,0x64,0xf3,0x00,0x00,
+ 0x05,0x20,0x01,0xdd,0xa8,0xa5,0xcf,0x48,0xc8,0x7d,0xec,0xa8,0xf7,0xde,0x15,0x6f,0x0b,0x89,0x7e,0x6c,0x36,0xb7,0xcb,0x2d,0xe6,0x3e,0x96,0xa1,0x45,0x0c,0x67,0x17,0x36,0x42,0x00,0x00,
+ 0x05,0x20,0x02,0x5c,0xbf,0xf0,0x5c,0xf2,0x0c,0x01,0xac,0x99,0x23,0x46,0x7a,0xda,0x7d,0xf1,0x84,0xc8,0x8c,0x40,0x3d,0x38,0x91,0x80,0x33,0xfb,0xbc,0xde,0x55,0xba,0xbd,0x7d,0x00,0x00,
+ 0x05,0x20,0x03,0x9c,0xfe,0xb7,0x8a,0x3c,0x02,0xe0,0xf8,0xb5,0x16,0x9b,0x7c,0x61,0xcb,0x21,0x1a,0x42,0xc7,0x0a,0xa0,0xe7,0x10,0xcd,0x32,0x3e,0xc0,0x29,0x41,0x29,0x50,0xe0,0x00,0x00,
+ 0x05,0x20,0x03,0x9e,0xd8,0x8c,0xbc,0xef,0x01,0xcf,0x56,0x0d,0xa9,0x85,0x7f,0x99,0x5b,0x57,0x68,0x0e,0x9a,0xac,0x3c,0xdd,0x58,0x38,0x6d,0x81,0xb2,0x21,0x7b,0xa7,0x2f,0xce,0x00,0x00,
+ 0x05,0x20,0x03,0xa2,0x14,0x41,0x78,0x2e,0xcd,0x6a,0x2a,0x68,0xfd,0xb4,0x27,0x93,0x6c,0x93,0xf4,0x05,0x78,0x7c,0x81,0x17,0x80,0x6a,0x8c,0x3b,0xcf,0xa3,0x14,0x1c,0x1f,0x76,0x00,0x00,
+ 0x05,0x20,0x04,0x13,0xa1,0xf6,0xd8,0x50,0x4f,0x48,0x93,0xb8,0x28,0x28,0x32,0x10,0x6e,0x65,0x8e,0xee,0x18,0x39,0xd2,0xcd,0xb5,0x9c,0x2c,0x1f,0x9c,0x33,0xe3,0x9f,0x20,0xe6,0x00,0x00,
+ 0x05,0x20,0x04,0x27,0x06,0x27,0x2c,0xf4,0xeb,0x17,0x0e,0xac,0x6a,0x12,0x5b,0x09,0xbf,0x35,0x2c,0xc3,0x48,0xe1,0xf6,0x04,0x22,0xad,0x4f,0x2a,0x3e,0xd0,0x08,0xab,0xe9,0x60,0x00,0x00,
+ 0x05,0x20,0x04,0x91,0x20,0xe1,0x68,0x81,0x9e,0xdc,0x72,0x72,0x30,0xdd,0x5f,0x4e,0xac,0x5d,0x09,0x9c,0xfe,0xb4,0x55,0x27,0xcc,0x41,0x4f,0x33,0xee,0xa8,0xaf,0xa3,0x07,0xd2,0x00,0x00,
+ 0x05,0x20,0x05,0x04,0x43,0xf6,0x14,0x9f,0x4e,0x25,0x70,0xd9,0x59,0xf5,0x74,0xce,0xdd,0x83,0x86,0x64,0x36,0x08,0xb9,0x2d,0xc7,0x4c,0x90,0x76,0x51,0x69,0x9b,0x8e,0x17,0x38,0x00,0x00,
+ 0x05,0x20,0x05,0x09,0xd5,0x8d,0xd5,0xb7,0x32,0x1d,0x01,0x1b,0x6c,0x92,0x82,0x48,0x67,0x49,0xc6,0xd3,0x18,0x1a,0x4b,0x8a,0xf9,0xbe,0x60,0x76,0xcc,0x34,0x51,0x22,0x80,0xcb,0x00,0x00,
+ 0x05,0x20,0x05,0xac,0x7c,0x5e,0xf7,0x97,0xd4,0xa0,0xe9,0xf5,0x34,0x7b,0xed,0x8b,0x8d,0xe3,0x01,0x98,0xa2,0xb1,0x63,0x8b,0x6f,0xc4,0x77,0xd6,0x47,0x4d,0xf1,0x76,0xcc,0xac,0x00,0x00,
+ 0x05,0x20,0x06,0x38,0x23,0x93,0x67,0x08,0xf4,0xff,0x30,0x1d,0x81,0x1d,0xe5,0x07,0xa6,0x3a,0x1b,0xc1,0xcf,0x4d,0x3f,0x03,0x27,0xbc,0x44,0x55,0x53,0x68,0x14,0x4a,0x6f,0xf0,0x00,0x00,
+ 0x05,0x20,0x06,0x1b,0xf8,0xed,0x23,0x42,0x4e,0x25,0xfa,0x7e,0x31,0x2e,0xc8,0x73,0xa3,0xb6,0xa6,0x07,0xe9,0x7e,0xfc,0x5b,0xfb,0x99,0xc8,0x90,0x08,0xd5,0x11,0x7f,0xe5,0x8e,0x00,0x00,
+ 0x05,0x20,0x06,0x4b,0x30,0x2e,0x0e,0xb6,0x65,0x17,0x0c,0xc8,0x57,0x2e,0x2d,0x9d,0x25,0x32,0xca,0x5e,0x9a,0x17,0xc8,0xba,0xc4,0x0c,0xd5,0xb1,0x31,0x5e,0x3e,0x34,0xc2,0xb6,0x00,0x00,
+ 0x05,0x20,0x0f,0xbd,0x2d,0x45,0xf3,0xf7,0xc6,0x56,0x1e,0xcb,0x90,0x4e,0xa4,0x3d,0xbe,0xcb,0x54,0x2d,0x7c,0x65,0x99,0xfa,0x9d,0xf4,0xbb,0x8e,0x9f,0x2d,0xb4,0x9e,0xe8,0x2d,0x00,0x00,
+ 0x05,0x20,0x08,0x25,0x81,0x5e,0x4b,0xb0,0x17,0xf2,0xcc,0x9b,0xf1,0x25,0x21,0x72,0x2f,0xf4,0x9c,0xa9,0x60,0x9f,0x22,0xd0,0x8f,0x12,0x2f,0x98,0x74,0xb2,0xc5,0xa3,0xd6,0x25,0x00,0x00,
+ 0x05,0x20,0x08,0x56,0xf6,0x2f,0xd8,0x47,0xa4,0x5c,0xb9,0xf8,0xd1,0x63,0xae,0xae,0x53,0x24,0xbe,0x5d,0xf1,0x68,0x33,0x55,0x6a,0x13,0x60,0xa3,0x7a,0xa6,0x79,0x14,0x0d,0xb9,0x00,0x00,
+ 0x05,0x20,0x09,0x5e,0x43,0x76,0x0f,0x50,0x49,0x1e,0x0f,0x3d,0x5c,0xe6,0x30,0xe2,0x6e,0xff,0x9b,0x23,0x15,0xae,0xda,0x88,0xec,0xd8,0xcc,0xf4,0xdd,0x90,0x65,0x53,0x04,0x5d,0x00,0x00,
+ 0x05,0x20,0x09,0xfb,0xc4,0x8c,0xa5,0x37,0xb3,0x2d,0x9f,0xa2,0xc1,0x21,0x24,0xfb,0x59,0x3a,0x3b,0x33,0xdd,0xf0,0x6e,0x6b,0xaa,0xc4,0xf2,0x58,0xe3,0xc9,0x04,0x4a,0x91,0xdc,0x00,0x00,
+ 0x05,0x20,0x0a,0x1a,0xd9,0xea,0xc1,0x2a,0xcf,0x8b,0x6b,0x02,0x9b,0xe8,0x3c,0xeb,0xe3,0x3b,0x6e,0x73,0x79,0x8e,0xb3,0x03,0x4b,0xdf,0x53,0x09,0xf8,0x10,0xbe,0x01,0xce,0x6c,0x00,0x00,
+ 0x05,0x20,0x0a,0x53,0x94,0xf5,0x2d,0xf1,0x03,0xb9,0x4a,0x36,0xfe,0xdf,0xdd,0x0c,0x5f,0xc3,0xe3,0xca,0xb2,0xa2,0x2f,0x30,0x4c,0xb2,0xce,0x4d,0x98,0xa4,0x45,0x7f,0xd2,0x71,0x00,0x00,
+ 0x05,0x20,0x0b,0x23,0x87,0xad,0x9d,0x46,0x11,0x14,0xd5,0xe6,0x82,0xbe,0x82,0x9d,0x87,0x0b,0xcc,0x9b,0x6e,0x08,0x2b,0x56,0xf8,0xc1,0x95,0x41,0xe6,0x86,0x37,0x48,0x75,0x4f,0x00,0x00,
+ 0x05,0x20,0x0b,0xbd,0x01,0x2f,0xc2,0x71,0x65,0xb1,0x47,0xc8,0x58,0x6e,0x4a,0x49,0x51,0x71,0x46,0x9d,0x2a,0x41,0x3d,0x0d,0x37,0x0a,0x24,0x08,0x1e,0x58,0xed,0x61,0x84,0xb6,0x00,0x00,
+ 0x05,0x20,0x0c,0x50,0x55,0x46,0x87,0x5a,0x8d,0x14,0xfb,0xa7,0x29,0x70,0x18,0xa6,0x29,0x80,0x8c,0x33,0x42,0x5a,0x8f,0xe4,0x84,0x64,0x3d,0x0e,0xb5,0xbd,0x36,0x34,0x42,0xb6,0x00,0x00,
+ 0x05,0x20,0x0c,0x9b,0xd8,0xae,0x9c,0x3e,0xc1,0xcb,0xbd,0x4b,0x39,0xf0,0xcb,0xba,0x2e,0x35,0xde,0x33,0x50,0x72,0x9a,0xdc,0x25,0xe6,0x47,0x31,0xc3,0xc1,0x91,0x14,0x46,0xe3,0x00,0x00,
+ 0x05,0x20,0x0c,0xc7,0x52,0xda,0xec,0x89,0x9b,0x05,0x1c,0xfb,0x8b,0xe4,0x27,0xfe,0x59,0x4f,0xb1,0x80,0xb3,0xd6,0xfd,0x8f,0x70,0x7b,0xfe,0x8c,0xae,0x80,0x71,0x93,0x07,0xe6,0x00,0x00,
+ 0x05,0x20,0x0d,0x12,0x27,0x98,0x6f,0xf8,0xb7,0xdb,0xde,0x03,0x62,0xf1,0xc1,0xe2,0xf8,0xb0,0x1d,0x5b,0x95,0xc8,0x2f,0xc5,0xdd,0x27,0x7a,0x8d,0x45,0x2d,0xec,0xc4,0x29,0x31,0x00,0x00,
+ 0x05,0x20,0x0d,0x8d,0xe6,0x70,0x06,0xbd,0x34,0x54,0x57,0x63,0x57,0x71,0x2e,0x6b,0x81,0xd7,0xec,0x9c,0x84,0xfa,0xe0,0xf6,0x4b,0x4e,0x41,0xe1,0x07,0xd0,0x2c,0x2c,0x57,0x5e,0x00,0x00,
+ 0x05,0x20,0x0e,0x1d,0x41,0x12,0x28,0x1f,0x62,0x1d,0x0c,0x74,0x10,0x21,0x62,0x3c,0x18,0x9d,0x55,0x6e,0x07,0x8b,0xd5,0x98,0x12,0xa8,0x25,0x32,0x04,0x55,0x94,0x43,0xe0,0xe6,0x00,0x00,
+ 0x05,0x20,0x16,0xec,0xa2,0x72,0x87,0xf5,0x82,0x67,0xdb,0x2e,0xd6,0x65,0xb5,0xee,0x25,0x94,0x74,0x80,0xc8,0xb7,0x24,0x5a,0xb3,0xdc,0xd8,0x8d,0xe4,0x4a,0x19,0x71,0x1f,0x72,0x00,0x00,
+ 0x05,0x20,0x16,0xf2,0x13,0x4f,0x7a,0x77,0x0a,0xe4,0x03,0xf6,0x1d,0xcc,0x2d,0xbb,0x9a,0x65,0x26,0xc2,0x18,0xe7,0x26,0xfc,0x65,0xb1,0x8d,0xc6,0x65,0xae,0xf8,0xdf,0xfa,0xef,0x00,0x00,
+ 0x05,0x20,0x17,0x4a,0xaf,0x5d,0x36,0x09,0x47,0x48,0x91,0xe8,0x3a,0x86,0x9a,0xad,0x06,0x25,0xd7,0x9b,0x53,0xdc,0xc9,0xf4,0x4e,0xc9,0x23,0xeb,0xd8,0x7a,0xd7,0x7c,0x53,0x01,0x00,0x00,
+ 0x05,0x20,0x17,0x85,0xe1,0x78,0x64,0x92,0xa9,0x3d,0xec,0x9e,0xcb,0x1d,0x8b,0xd8,0xf3,0x07,0x80,0x01,0xcd,0x20,0x9c,0xc2,0x89,0x71,0xf0,0x25,0xb4,0x63,0xb6,0xbc,0x33,0xcc,0x00,0x00,
+ 0x05,0x20,0x17,0xa4,0x30,0xe4,0x4a,0x75,0x42,0xbf,0x9c,0x7d,0x0c,0x3a,0xf2,0xa9,0x56,0x16,0xaf,0x31,0xaa,0xff,0x0e,0xfb,0xf0,0xab,0x75,0xe5,0x47,0x27,0xe5,0x98,0xdf,0x05,0x00,0x00,
+ 0x05,0x20,0x10,0x22,0x6f,0xfb,0xaf,0x57,0x48,0x5d,0x76,0xa7,0xab,0xe9,0xf7,0x9e,0x92,0xff,0x70,0xfd,0x5d,0x96,0x2f,0x13,0x47,0x9e,0x8b,0x92,0xa5,0x08,0x9d,0xdd,0x54,0x64,0x00,0x00,
+ 0x05,0x20,0x10,0x5a,0x57,0xc4,0x1e,0x8b,0x95,0xda,0xfb,0x3c,0x14,0x50,0x58,0x52,0x77,0xfa,0x2d,0x66,0xda,0xc1,0x58,0xb3,0x9e,0xcc,0xac,0x87,0x16,0xa5,0x0d,0x3e,0x97,0x4c,0x00,0x00,
+ 0x05,0x20,0x10,0xec,0xff,0xbe,0xe2,0x82,0x24,0xe2,0x4f,0x8a,0x58,0x11,0xc9,0xcc,0x8c,0x24,0x92,0xea,0xd1,0x9f,0xcc,0x04,0xfd,0x2c,0x22,0xc3,0x6c,0x47,0x2f,0x6a,0x81,0x5a,0x00,0x00,
+ 0x05,0x20,0x12,0x2d,0x54,0x32,0x72,0xfe,0x72,0xec,0x45,0x4d,0x3a,0xdd,0x66,0x64,0xfb,0xeb,0x33,0x7e,0x09,0x74,0x87,0xe9,0x81,0x5b,0x65,0x28,0x84,0xaa,0x3a,0xbc,0x9a,0x53,0x00,0x00,
+ 0x05,0x20,0x13,0x0a,0x6b,0xd1,0x72,0x99,0xbb,0x38,0xb5,0x8c,0x94,0x93,0x51,0xc6,0x1d,0x27,0xe6,0x08,0x16,0x60,0xf2,0x5f,0x44,0x43,0x20,0x54,0x28,0x91,0x8c,0xeb,0x4c,0xb8,0x00,0x00,
+ 0x05,0x20,0x14,0x06,0x52,0xae,0x46,0x68,0xa4,0xbd,0xe1,0xed,0xb0,0xc5,0xe1,0x8e,0xc3,0x71,0x2b,0xfc,0x88,0x69,0x91,0x06,0x37,0xaf,0x2f,0xd6,0x27,0x73,0xb3,0xb6,0x51,0x50,0x00,0x00,
+ 0x05,0x20,0x14,0x90,0x45,0xb0,0x89,0x15,0x9a,0xe4,0xf8,0x69,0x9f,0xdc,0xee,0xbb,0x80,0x64,0x5f,0xe7,0xdd,0xf9,0xa9,0x4c,0xf3,0x84,0xb8,0x91,0x7e,0xbb,0x0f,0xfb,0x41,0xb8,0x00,0x00,
+ 0x05,0x20,0x15,0xcb,0x74,0xf3,0x56,0x0b,0xaf,0x35,0x59,0x49,0xa0,0x15,0x12,0x13,0x9d,0xb8,0x8a,0x36,0x4c,0xe4,0x57,0x11,0xf8,0x5e,0x34,0xcf,0x92,0xfc,0x14,0xbe,0x93,0xa9,0x00,0x00,
+ 0x05,0x20,0x16,0x39,0x60,0x30,0xe7,0x4c,0x0d,0xf0,0x30,0x0d,0xb9,0x10,0x56,0xed,0x2c,0x24,0xb4,0x96,0xd0,0x02,0x9d,0x53,0x3b,0xba,0xa1,0x84,0x13,0xeb,0xfb,0x35,0x24,0x02,0x00,0x00,
+ 0x05,0x20,0x16,0x41,0x1b,0xa8,0x8c,0x2b,0x4f,0xd6,0xbe,0x1b,0x4d,0x4c,0x40,0x03,0x06,0xce,0x9f,0xb1,0xb5,0x8d,0x99,0xa9,0xb6,0xa7,0x3e,0xe1,0x1d,0xd2,0xe6,0x95,0xd4,0x42,0x00,0x00,
+ 0x05,0x20,0x16,0x63,0xeb,0xc7,0x41,0xf3,0x2e,0x65,0x61,0x9e,0x2a,0x40,0x12,0x19,0x39,0x30,0x91,0x78,0x70,0x09,0x11,0x89,0x7b,0xdb,0x4c,0x3c,0xa9,0x4d,0xd2,0xa7,0x3d,0xcc,0x00,0x00,
+ 0x05,0x20,0x1f,0x08,0xff,0xf7,0x83,0x1c,0x25,0xcb,0xdc,0x67,0x51,0xaf,0x99,0x4b,0x80,0xfb,0x02,0x50,0x6b,0x64,0x05,0x58,0xc6,0x98,0xe6,0x4c,0x88,0x56,0xe4,0x4a,0x9f,0xb1,0x00,0x00,
+ 0x05,0x20,0x1f,0x86,0xd2,0xa0,0xa0,0xb2,0xf2,0x59,0xea,0x06,0xae,0x9e,0x60,0xe8,0xff,0x19,0x15,0x7f,0xc7,0x85,0x4b,0xfd,0x57,0x1b,0x7a,0x3c,0x1f,0x14,0x63,0xde,0x7d,0x94,0x00,0x00,
+ 0x05,0x20,0x18,0x31,0xb3,0x9a,0xf8,0x8c,0xec,0x99,0x2e,0x7d,0xe4,0x90,0xa2,0x54,0x27,0xbd,0xe5,0xc8,0x65,0xdf,0x1f,0xaa,0x8f,0xe9,0x0f,0x64,0x85,0x09,0xc3,0x70,0x62,0x13,0x00,0x00,
+ 0x05,0x20,0x18,0xe1,0xf3,0xc1,0x17,0x5f,0xf5,0x0b,0xbd,0xf8,0x5c,0x6c,0xd6,0x23,0xbf,0xca,0xcd,0x48,0x44,0x56,0x4d,0x22,0x5f,0x33,0x15,0xb4,0x19,0x30,0xed,0x7a,0x2f,0x12,0x00,0x00,
+ 0x05,0x20,0x18,0xe7,0x40,0x30,0x6e,0xc3,0x64,0x0e,0x47,0xbc,0xdb,0xe4,0x49,0x9e,0x9c,0xc1,0x8b,0x4b,0x54,0x42,0xf9,0x66,0xb0,0xeb,0x80,0x56,0x9b,0xbe,0x99,0xac,0x22,0x8e,0x00,0x00,
+ 0x05,0x20,0x1b,0x08,0x3f,0x11,0x7a,0x3f,0x7c,0x9e,0xa9,0xae,0xfd,0xdc,0x20,0x2d,0x3e,0x57,0xc8,0x77,0x4b,0x11,0xd1,0x43,0x61,0x45,0x5d,0xc1,0x7d,0xa1,0x6c,0x83,0x13,0x87,0x00,0x00,
+ 0x05,0x20,0x1b,0x87,0xe8,0xa4,0x44,0x5b,0x92,0x51,0x27,0x18,0x04,0xa1,0x21,0x18,0x04,0xed,0xab,0x14,0x46,0x9a,0x2d,0x86,0xe3,0x7b,0x6f,0xbd,0x55,0x76,0x51,0xa4,0x95,0x9d,0x00,0x00,
+ 0x05,0x20,0x1b,0xb3,0xa1,0x8e,0x8b,0xc0,0xc7,0x14,0x51,0x9f,0x55,0x54,0x12,0xb2,0x49,0xf7,0x43,0xf1,0xea,0x74,0x6c,0x53,0xe5,0x63,0x27,0xc9,0xa4,0x15,0x03,0xd8,0x5c,0x9b,0x00,0x00,
+ 0x05,0x20,0x1c,0x91,0xef,0xae,0x13,0xdc,0xfd,0x43,0xaa,0x18,0x7c,0xd6,0xd0,0x20,0x3b,0x48,0x37,0x8d,0x3b,0x7a,0xa3,0x2c,0x20,0xae,0x8b,0x96,0x80,0x87,0x64,0xba,0x81,0x75,0x00,0x00,
+ 0x05,0x20,0x1d,0x11,0x5b,0xb6,0x2f,0x2a,0xee,0xfb,0x03,0x4d,0x1f,0x68,0x84,0xb4,0x6b,0x2d,0x1f,0x01,0xbe,0x9e,0x37,0xc5,0xcb,0x35,0x97,0x2a,0xf5,0x46,0x88,0x95,0x93,0x85,0x00,0x00,
+ 0x05,0x20,0x1d,0xbe,0xe7,0x55,0xfc,0xe2,0x9a,0x78,0xa1,0x48,0xa9,0x59,0x3d,0x9e,0x5a,0x5e,0x75,0x38,0xad,0xe1,0xfd,0xdd,0x49,0xf8,0x6b,0x43,0x4a,0xdc,0xdc,0x80,0x16,0xe4,0x00,0x00,
+ 0x05,0x20,0x1e,0x34,0x23,0xf8,0x0c,0xde,0xab,0x87,0x04,0x14,0xba,0x2b,0xca,0x94,0x71,0x42,0x73,0x93,0xe8,0x1b,0xa8,0x28,0xc0,0x01,0x0f,0xd7,0x59,0xb3,0x3a,0x4c,0xbb,0x98,0x00,0x00,
+ 0x05,0x20,0x1e,0x4b,0x05,0x83,0x7f,0x43,0x79,0x77,0x9b,0x6f,0x07,0x01,0x42,0x28,0x5c,0xab,0xd3,0x3f,0x3c,0x1f,0xe6,0x4a,0x3d,0xc4,0xe8,0x25,0xb4,0x9a,0x44,0xa5,0x57,0x81,0x00,0x00,
+ 0x05,0x20,0x1e,0x55,0x2c,0x8d,0x16,0x86,0xeb,0x12,0x4f,0x30,0x44,0xe0,0x00,0x86,0xf1,0x1d,0x77,0xd4,0x4f,0x31,0xd8,0xd6,0x22,0xa6,0x4a,0xb7,0x78,0x4c,0x03,0xc2,0xb0,0xa6,0x00,0x00,
+ 0x05,0x20,0x26,0xa3,0x05,0xd0,0xdb,0x6d,0x89,0x25,0x9f,0x45,0xe1,0x0d,0x0e,0xa6,0x61,0x31,0x5e,0x5b,0xd5,0x36,0x4d,0xe7,0x7a,0x35,0x40,0xd2,0x13,0x2c,0x92,0x98,0x86,0xc8,0x00,0x00,
+ 0x05,0x20,0x27,0x7a,0xaf,0x5a,0x9c,0xf4,0x72,0xfe,0x3c,0xdd,0x7a,0xba,0xd7,0x98,0x31,0xde,0x73,0xce,0x84,0x5b,0x41,0xe7,0x9a,0x6a,0xe2,0xc1,0x3b,0x5b,0x37,0x23,0xc7,0xdf,0x00,0x00,
+ 0x05,0x20,0x27,0xa0,0xec,0x00,0x93,0x4e,0xf2,0x5e,0xa5,0x80,0xab,0x79,0xc0,0x56,0x49,0x1e,0x1b,0x7f,0x38,0x5e,0x5d,0xc6,0x6b,0x96,0x50,0xd0,0x61,0xbc,0xd0,0x9c,0x6e,0x09,0x00,0x00,
+ 0x05,0x20,0x20,0x90,0xe3,0xd3,0xad,0x87,0xeb,0x2a,0xd9,0x29,0x17,0x74,0x47,0xc9,0x54,0x57,0xfa,0x3d,0x71,0x02,0x11,0xb2,0xc3,0x87,0x31,0xb3,0x9b,0x6f,0x2e,0xfc,0x30,0xea,0x00,0x00,
+ 0x05,0x20,0x20,0xaf,0x9b,0xcf,0x36,0xc1,0x6d,0x56,0x77,0x18,0x02,0x02,0x2e,0xdb,0x74,0x47,0xbc,0x58,0xa3,0xa0,0xf3,0x3f,0x31,0xc9,0xd0,0x3d,0x1f,0x98,0x41,0xf2,0x65,0xdb,0x00,0x00,
+ 0x05,0x20,0x20,0xdd,0xeb,0x14,0x0e,0x8f,0xdc,0x0f,0x45,0x98,0x06,0x08,0x89,0x40,0x7f,0x51,0x5a,0x1c,0x65,0x6b,0x0e,0x25,0x5c,0xa1,0x27,0x64,0x94,0x6b,0xdc,0x69,0xb7,0xe6,0x00,0x00,
+ 0x05,0x20,0x21,0x53,0xaf,0x75,0x5c,0xab,0x7b,0x3d,0xd6,0x1b,0xad,0x1f,0xfc,0xa9,0x4e,0x07,0xc6,0xb8,0x06,0xcb,0x39,0xf1,0xf7,0xd6,0xe9,0x8c,0x16,0x86,0xed,0xba,0x3d,0x9d,0x00,0x00,
+ 0x05,0x20,0x21,0xb8,0x9f,0x16,0x6d,0xe0,0x54,0xea,0xde,0xeb,0x06,0x4c,0x7a,0x46,0x26,0x6c,0xed,0xa7,0xb3,0x36,0xa9,0x0c,0x56,0x85,0x7b,0x13,0x84,0x30,0x52,0x43,0x05,0x90,0x00,0x00,
+ 0x05,0x20,0x21,0xcc,0x80,0xf3,0x82,0xe1,0x9e,0xfe,0x39,0xcd,0x56,0xa6,0x18,0x9a,0x4d,0x97,0xb8,0x6b,0xe9,0x13,0xa5,0x77,0xcd,0x7b,0x33,0xaf,0xa8,0xd8,0xe2,0xf6,0x59,0xc6,0x00,0x00,
+ 0x05,0x20,0x22,0x61,0xbe,0x59,0xd3,0x44,0xd2,0xaf,0xbb,0xb7,0x65,0xc6,0xbb,0xfb,0x20,0x54,0x6e,0x23,0xda,0xd3,0x57,0x2a,0x63,0x3c,0xaf,0xbd,0xf4,0x00,0xe0,0x02,0x89,0xf5,0x00,0x00,
+ 0x05,0x20,0x22,0x91,0x0a,0x84,0x90,0x80,0x5a,0xbf,0x23,0x05,0xeb,0x4a,0xae,0x29,0x36,0x13,0x21,0xad,0xd8,0xe6,0x63,0xd4,0xfe,0x28,0x16,0x01,0xf0,0x6c,0xe7,0x7d,0x49,0x6c,0x00,0x00,
+ 0x05,0x20,0x23,0x99,0x78,0xb1,0x86,0x28,0xa0,0x28,0xff,0x33,0xf6,0x57,0x3c,0xd3,0x6b,0xd3,0xcc,0x4a,0xfe,0x43,0x61,0x52,0xc9,0x3f,0x4c,0x7f,0x45,0x69,0xef,0x1a,0xb1,0x6e,0x00,0x00,
+ 0x05,0x20,0x24,0x42,0x4c,0x6a,0x52,0xb5,0x9b,0xee,0x1a,0x91,0x1f,0xfd,0x87,0x51,0x35,0x6e,0x88,0x06,0x18,0xa5,0xe9,0xc1,0x28,0xa1,0xcc,0x34,0x3d,0xf7,0x08,0x6c,0xf7,0xcf,0x00,0x00,
+ 0x05,0x20,0x24,0xf1,0xf9,0x89,0x49,0xd1,0x05,0x14,0xa3,0x23,0x11,0x92,0x51,0x65,0x42,0xf5,0x98,0x00,0x8f,0xeb,0xb2,0xec,0xa1,0x69,0x6e,0x22,0xfa,0x9d,0xe3,0x30,0x04,0x01,0x00,0x00,
+ 0x05,0x20,0x25,0x02,0xc0,0xe5,0x5e,0x8c,0xdf,0x4d,0xd2,0x79,0xe0,0xa2,0x3b,0x55,0x9a,0x4e,0x3b,0xee,0x0b,0x16,0xb5,0xa3,0x6f,0x0f,0x3f,0x5e,0x94,0x5c,0xd4,0x08,0xc5,0x0e,0x00,0x00,
+ 0x05,0x20,0x25,0x32,0x0c,0xe6,0x7e,0x33,0x48,0x55,0x73,0x1c,0x0d,0xf9,0xcb,0x08,0xa6,0x65,0x02,0xb0,0xfb,0x92,0xe7,0x36,0x84,0x1f,0xb3,0xd0,0x70,0xf4,0x39,0x69,0xb7,0xa7,0x00,0x00,
+ 0x05,0x20,0x26,0x0b,0xe1,0xbb,0xec,0xd8,0xc8,0x20,0xe5,0xe2,0x8f,0x7c,0x18,0xa8,0x9d,0xbb,0x15,0x7b,0x3c,0x00,0xf3,0x8e,0x4b,0xc2,0xff,0x04,0xe1,0xef,0x88,0x92,0xb5,0x62,0x00,0x00,
+ 0x05,0x20,0x26,0x70,0xf1,0xb4,0xb9,0x79,0xcd,0x8d,0xf0,0x9d,0x55,0x19,0xaa,0xdc,0x5c,0x4a,0xb9,0x42,0x8b,0x75,0xc2,0xff,0x77,0xb6,0x32,0x38,0x50,0x65,0x4c,0xa0,0x3d,0x0c,0x00,0x00,
+ 0x05,0x20,0x28,0x51,0x9e,0x8f,0xb2,0xa3,0x9f,0xb7,0x10,0x48,0x98,0x7a,0x6b,0xe2,0x68,0x31,0x9c,0x64,0x54,0x5d,0xf0,0xb3,0x3c,0x07,0x5c,0xbd,0xd3,0x80,0x87,0xa6,0xb9,0x88,0x00,0x00,
+ 0x05,0x20,0x28,0x68,0x4a,0x09,0xce,0xab,0xe0,0x21,0xfd,0x5c,0x52,0xf2,0x52,0x15,0x6a,0x1d,0x21,0x48,0x06,0x6c,0x84,0x92,0x4b,0x3e,0xeb,0xde,0xd4,0xe3,0x20,0x0c,0x9c,0x8c,0x00,0x00,
+ 0x05,0x20,0x29,0x0d,0x28,0x48,0x0c,0xe7,0x76,0x89,0xa5,0x27,0x0d,0xc6,0xea,0x04,0x82,0xce,0x4b,0xf4,0x30,0x74,0x69,0x0d,0x27,0xa3,0x5d,0x21,0x51,0x2b,0x0a,0x30,0x60,0x8d,0x00,0x00,
+ 0x05,0x20,0x2a,0x17,0x65,0x6e,0xc3,0xac,0xc6,0x42,0x03,0xe7,0x32,0x16,0xbd,0x24,0x5e,0x64,0xda,0xa9,0x92,0x4c,0x7f,0x52,0x61,0x78,0xde,0x9c,0xe3,0xcb,0xf4,0x45,0xc6,0xc1,0x00,0x00,
+ 0x05,0x20,0x2a,0x5c,0xab,0x83,0x51,0x4b,0xba,0x4f,0xbe,0x24,0x78,0x03,0xb9,0x13,0x31,0xfa,0x11,0xf4,0x8a,0x82,0xcd,0x3c,0x75,0xcc,0xd5,0x18,0xd2,0x1b,0xbf,0xed,0x4b,0x4e,0x00,0x00,
+ 0x05,0x20,0x2a,0xb5,0xe5,0x94,0x2e,0xd1,0xde,0x53,0xb3,0x2a,0x6e,0xcc,0xcf,0x2a,0xe9,0x90,0xf5,0x61,0x4b,0x37,0xf0,0x22,0x1c,0xd7,0x79,0xd1,0x7e,0x2e,0x1e,0x5c,0x6a,0x88,0x00,0x00,
+ 0x05,0x20,0x2a,0x9f,0xcc,0x1b,0xe6,0x58,0x81,0xe0,0x20,0x41,0x20,0xbc,0xff,0x37,0x74,0x08,0x7f,0xd1,0x37,0x0b,0x44,0x68,0x2e,0xd9,0x74,0x16,0x64,0xc4,0x4f,0x6c,0x03,0x63,0x00,0x00,
+ 0x05,0x20,0x2b,0x28,0xe0,0xd8,0x48,0xc3,0xea,0x06,0xcb,0xe3,0xc5,0x9c,0x62,0x5f,0xd9,0x60,0x7e,0xb1,0xed,0x5f,0x36,0xf9,0x1b,0xa9,0xb6,0xa8,0x19,0xe4,0xa0,0x43,0x99,0xe8,0x00,0x00,
+ 0x05,0x20,0x2b,0x6c,0xd5,0xa9,0x25,0xc4,0x89,0x57,0x49,0x9b,0x92,0xae,0x5f,0x2d,0xa2,0xd0,0x3a,0x52,0xed,0x78,0xb5,0x69,0x29,0xa5,0x4f,0x40,0x7b,0xa2,0xf4,0xcf,0x8c,0xc9,0x00,0x00,
+ 0x05,0x20,0x2b,0x85,0xb7,0x2c,0x9b,0x09,0x65,0x7c,0xe7,0xd2,0xbd,0x0a,0xdb,0x64,0xf7,0xfe,0x84,0x84,0x89,0xde,0x71,0x0b,0x63,0x18,0xfe,0x07,0xd9,0x7f,0xab,0x13,0x0a,0xb6,0x00,0x00,
+ 0x05,0x20,0x2c,0x11,0x17,0x1d,0xd0,0x42,0xda,0xf5,0x3c,0xd2,0x8b,0x03,0x5d,0xfa,0x91,0x2a,0xf9,0x16,0x3c,0x33,0x00,0x71,0x1a,0x25,0x07,0x68,0xc0,0x49,0x73,0x8e,0xfe,0x33,0x00,0x00,
+ 0x05,0x20,0x2d,0x23,0x43,0x7a,0x5c,0x1a,0x42,0x86,0xb8,0x8e,0x11,0x81,0x3f,0x47,0x01,0x77,0xdf,0x5a,0xab,0x05,0xb6,0x43,0x76,0x1a,0x4d,0x1a,0x6e,0xcd,0x5d,0x7c,0x88,0x88,0x00,0x00,
+ 0x05,0x20,0x2d,0x26,0xf7,0x94,0x68,0xac,0x88,0xad,0xea,0x57,0xcd,0x18,0x26,0xb9,0x5d,0x7b,0xb2,0xc5,0x5d,0x98,0x0a,0x24,0x3e,0x69,0x80,0xcd,0xa6,0x34,0x3a,0xac,0x9d,0x96,0x00,0x00,
+ 0x05,0x20,0x2d,0x51,0x8a,0xe7,0xd0,0xb0,0x15,0x33,0x7a,0xab,0x9e,0x72,0x01,0xf1,0xd2,0x8d,0xc4,0x84,0x3e,0x95,0x23,0xe9,0xba,0xfb,0xc6,0xb7,0xd6,0xef,0xef,0xc2,0x71,0xc4,0x00,0x00,
+ 0x05,0x20,0x2d,0xdc,0x15,0xe0,0x08,0xa7,0xac,0x67,0x71,0x73,0xc8,0x37,0x34,0xd6,0x40,0xda,0x87,0x9c,0x1c,0x28,0x42,0x1a,0xb6,0x45,0x61,0xcc,0xe4,0x8b,0x04,0xac,0x42,0xef,0x00,0x00,
+ 0x05,0x20,0x36,0xbc,0x66,0xec,0xd2,0x5e,0x77,0x03,0x80,0x12,0x5d,0x2f,0x1c,0xe9,0x63,0x78,0x3a,0x33,0xc2,0xa1,0x15,0xa8,0xd6,0x5c,0x05,0x7d,0x83,0xd1,0x4f,0x86,0x3a,0xf4,0x00,0x00,
+ 0x05,0x20,0x37,0x41,0x83,0x9c,0x20,0x6a,0x1e,0x42,0x76,0xd8,0x21,0xea,0x59,0x17,0xa2,0xa4,0x1b,0xa1,0xa5,0x7e,0xbd,0x62,0x26,0x52,0xba,0x8f,0xe9,0x2f,0x32,0x22,0x5f,0xc6,0x00,0x00,
+ 0x05,0x20,0x37,0x71,0x92,0x9c,0x04,0x58,0x5a,0x68,0x6f,0x30,0x2b,0xe8,0x51,0xc5,0xed,0x9b,0xe1,0x1e,0xd2,0x2d,0x74,0xc8,0x0b,0xb1,0xb9,0x82,0x85,0x22,0xd2,0x12,0xec,0xab,0x00,0x00,
+ 0x05,0x20,0x37,0x8a,0x3f,0x86,0x9a,0x70,0x09,0xcd,0x8e,0x88,0xfe,0x73,0x6d,0xf1,0xbc,0xf8,0x5a,0x70,0xcf,0x6c,0x4b,0x94,0x50,0x24,0xbc,0xf6,0x4c,0x5f,0x4c,0x1f,0xb0,0x52,0x00,0x00,
+ 0x05,0x20,0x37,0xb3,0x5b,0xa8,0x74,0x1d,0x7c,0x90,0x34,0x6f,0x93,0x87,0xf0,0xf7,0x12,0xe2,0xba,0xe6,0x64,0x4c,0xd2,0x6b,0xd3,0x03,0x7b,0xc9,0x3d,0x5a,0x34,0xf0,0xa1,0x62,0x00,0x00,
+ 0x05,0x20,0x30,0x35,0xd7,0x00,0xf3,0xb9,0x81,0xaf,0xbd,0x84,0x11,0x37,0x26,0xd7,0x55,0x5b,0xc4,0x86,0x70,0xc8,0x9d,0x72,0x95,0xf3,0x4c,0x16,0xdd,0x75,0x1c,0x4b,0xb9,0x92,0x00,0x00,
+ 0x05,0x20,0x30,0xfb,0x1f,0x25,0xc1,0xc2,0x88,0xc9,0x07,0x61,0x22,0x1f,0xf5,0x00,0xe0,0x66,0xe7,0x82,0xc7,0x5b,0xb7,0xd7,0x15,0x26,0xae,0xde,0x40,0x68,0x98,0x31,0x33,0x53,0x00,0x00,
+ 0x05,0x20,0x31,0x0f,0x30,0x0b,0x9d,0x70,0x0c,0x7c,0xf7,0x98,0x7e,0x1c,0xf4,0x33,0xdc,0x64,0x17,0xf7,0x00,0x7a,0x0c,0x04,0xb5,0x83,0xfc,0x5f,0xa6,0x52,0x39,0x79,0x63,0x87,0x00,0x00,
+ 0x05,0x20,0x31,0x2a,0x7c,0x15,0x86,0x70,0x86,0x41,0xa0,0xae,0x7e,0x89,0xe1,0x1e,0x5b,0xb9,0x24,0x1d,0x8e,0x85,0x4b,0xed,0x69,0x43,0x07,0x49,0xfe,0xc2,0xfa,0x17,0xd6,0x93,0x00,0x00,
+ 0x05,0x20,0x31,0x41,0x19,0xda,0x3e,0x7a,0x83,0x9e,0x03,0x7d,0xf1,0xc8,0x4c,0xf3,0x7e,0x2d,0xba,0x86,0x72,0x67,0x43,0x11,0x32,0x4d,0xbe,0x90,0xe5,0x0e,0xf5,0xf1,0x0f,0xf9,0x00,0x00,
+ 0x05,0x20,0x31,0x4a,0xfe,0x3f,0xc6,0x92,0x5f,0x33,0x45,0x28,0xe8,0x59,0xf0,0xdf,0x01,0x68,0x20,0x29,0xa5,0xd2,0x60,0xe4,0xed,0x23,0x6f,0x24,0x1f,0x4b,0x58,0x69,0x19,0x33,0x00,0x00,
+ 0x05,0x20,0x31,0x71,0x2a,0xc9,0xda,0xa3,0x89,0x45,0x8b,0xf3,0xe0,0xd2,0xa3,0x3c,0x05,0xb8,0xd4,0xed,0xaa,0x3d,0x65,0x68,0x24,0x0d,0x01,0x32,0x41,0xa9,0x0b,0x60,0x70,0xfb,0x00,0x00,
+ 0x05,0x20,0x31,0xe8,0x5e,0xef,0x1b,0x1d,0xc6,0xdb,0x99,0x29,0xb8,0x25,0x3e,0xf9,0x22,0x92,0x5c,0x77,0x5c,0xa5,0x17,0x3a,0xc0,0xdf,0xb6,0xad,0xf5,0xb6,0x4f,0xd0,0xf3,0x55,0x00,0x00,
+ 0x05,0x20,0x31,0xea,0xc7,0x60,0xe4,0x7f,0x24,0x0c,0x1c,0xc4,0x6f,0xc5,0xa7,0x88,0xdd,0xff,0x40,0x84,0x1e,0x36,0x58,0x9a,0x66,0x7d,0x77,0xbc,0x26,0x1c,0x30,0x26,0x62,0x0e,0x00,0x00,
+ 0x05,0x20,0x31,0xeb,0x72,0x98,0xc7,0xf0,0x4f,0x4e,0x41,0x90,0x51,0x1f,0x48,0x80,0xaf,0xad,0x60,0xc0,0x07,0xbb,0xe6,0x64,0x1a,0xf2,0x11,0xcf,0x6f,0xe7,0xcf,0xd6,0x31,0x69,0x00,0x00,
+ 0x05,0x20,0x33,0x07,0x85,0x63,0x5f,0xff,0x7d,0x71,0xf0,0x62,0x56,0x3f,0xbe,0x2a,0x90,0x43,0x92,0x6b,0x0c,0x27,0x05,0x73,0xe7,0x53,0xfb,0x1b,0xd4,0x6d,0x5c,0xf6,0x4c,0x65,0x00,0x00,
+ 0x05,0x20,0x33,0x24,0xaf,0x44,0xfc,0xc0,0x39,0x09,0xc9,0xa8,0xa6,0xa8,0x72,0x1e,0xe0,0xad,0xc1,0x12,0xb0,0x8e,0x48,0x49,0xf9,0x05,0x3a,0xd3,0x9f,0x0f,0x1b,0x51,0x93,0x0e,0x00,0x00,
+ 0x05,0x20,0x34,0x09,0x15,0xf4,0x2f,0xf0,0x63,0x04,0x2b,0x8f,0xb8,0x0d,0x65,0x8c,0x3e,0x1e,0xa5,0x8e,0x91,0xa1,0xb8,0x2b,0xfc,0x68,0x1c,0x9c,0xcc,0x41,0x65,0x6a,0xf0,0xf3,0x00,0x00,
+ 0x05,0x20,0x34,0x40,0x29,0x1f,0x84,0x29,0x0c,0x8e,0xf0,0xd2,0x61,0xa0,0xfa,0xaa,0x0f,0x64,0x2f,0x46,0x46,0xda,0x3b,0x53,0x47,0x52,0xa0,0xb1,0xb5,0xc3,0xaf,0xe5,0x28,0x48,0x00,0x00,
+ 0x05,0x20,0x34,0xf7,0x6d,0x2f,0x85,0x19,0xfb,0x78,0x6e,0xb3,0x11,0xb3,0xa8,0x47,0xdc,0x5d,0xfd,0x64,0x6b,0x30,0x34,0x6e,0x9a,0x7c,0x77,0x8c,0x5c,0x44,0x91,0x8d,0xe5,0xfb,0x00,0x00,
+ 0x05,0x20,0x36,0x01,0xd8,0x24,0x8a,0x42,0xf8,0x52,0x66,0x81,0xef,0xf3,0xfd,0xbe,0xc2,0x14,0xa4,0x75,0x4d,0xd3,0xd0,0x5b,0x1f,0xd8,0x4a,0x3b,0x02,0x5b,0x5f,0xac,0xcb,0x12,0x00,0x00,
+ 0x05,0x20,0x36,0x06,0x4d,0x39,0xed,0x38,0xf7,0x6a,0xd8,0x0b,0x04,0xa8,0x6b,0xb0,0x8b,0x51,0xc7,0xb2,0xfe,0x72,0x24,0xb1,0x43,0xbd,0xee,0xfc,0x83,0x9c,0xf6,0xd2,0x01,0x19,0x00,0x00,
+ 0x05,0x20,0x3f,0x2f,0xca,0x47,0x8b,0x8f,0x62,0x29,0x3d,0xa4,0x6b,0x33,0x8f,0x23,0xaf,0x06,0xc9,0xb7,0x8e,0x72,0xc5,0x5a,0x52,0xf6,0x9d,0x59,0xf7,0x52,0x0e,0xbe,0xdc,0x2b,0x00,0x00,
+ 0x05,0x20,0x3f,0x31,0x2b,0x5e,0x2c,0x5b,0x08,0xfe,0x33,0x70,0xa7,0x0a,0xff,0x38,0x7a,0x7f,0xd6,0x87,0x38,0x6c,0x4b,0xf9,0x98,0xa1,0xf7,0x79,0xfe,0x12,0xd5,0x98,0xdf,0x16,0x00,0x00,
+ 0x05,0x20,0x3f,0x62,0x15,0xfd,0x73,0xa2,0x2a,0x8f,0x1a,0xfc,0x43,0x9f,0xc4,0x09,0x2f,0xaa,0x9f,0xa8,0xcd,0x9e,0x9b,0x6c,0x41,0x8d,0x51,0x82,0x82,0x2b,0x2c,0x67,0xce,0xfb,0x00,0x00,
+ 0x05,0x20,0x3f,0xb7,0x18,0x20,0xad,0x99,0x1a,0x9f,0x4d,0x13,0xc1,0x9c,0xd6,0x9b,0x7f,0xf3,0xaa,0x05,0xf6,0xa6,0x7e,0x8d,0x3c,0xff,0x54,0xa6,0x6e,0x5c,0xa7,0x1f,0x36,0xb9,0x00,0x00,
+ 0x05,0x20,0x38,0xab,0xdc,0xa3,0x2b,0x88,0xc8,0xc0,0x14,0x44,0xcd,0xb2,0x23,0xd3,0xea,0x5e,0x06,0x18,0xc2,0x94,0x9b,0x07,0x58,0xf6,0xb6,0x00,0x2c,0x31,0x3c,0x56,0x75,0x31,0x00,0x00,
+ 0x05,0x20,0x39,0x83,0xb4,0xd5,0x79,0xbe,0x97,0x08,0x9a,0xd2,0x3e,0x55,0x98,0x08,0xf6,0xda,0x99,0x61,0xad,0xe0,0x67,0x71,0xe4,0xfa,0xcb,0xb0,0x13,0x07,0x6e,0x41,0x60,0xc2,0x00,0x00,
+ 0x05,0x20,0x39,0xda,0x47,0x48,0xe2,0x17,0xfc,0x70,0xf5,0xe0,0xed,0x61,0xa7,0x9b,0xf5,0x07,0x2e,0x4d,0xa1,0x41,0x68,0x04,0x3c,0xd2,0x21,0xc8,0x47,0x2c,0x18,0x28,0x3a,0x10,0x00,0x00,
+ 0x05,0x20,0x3a,0x7c,0xa2,0xa5,0xfe,0xc5,0x24,0x4c,0xe2,0x54,0xa8,0x2e,0x46,0x8c,0xb5,0xd0,0x71,0x6d,0x12,0x2d,0x42,0xa9,0xe5,0xe6,0x65,0x50,0x3f,0xbf,0x1b,0xa8,0x07,0xe1,0x00,0x00,
+ 0x05,0x20,0x3a,0xf3,0xf5,0x67,0xef,0x51,0xfd,0x38,0xfc,0x34,0xc9,0x4c,0xdc,0x4a,0x36,0x69,0xd4,0x77,0xfd,0x94,0xff,0x8e,0x16,0x1f,0x4d,0x6f,0xc3,0xad,0x2f,0xb5,0x97,0x63,0x00,0x00,
+ 0x05,0x20,0x3b,0x59,0x10,0x07,0x28,0x72,0x2d,0x74,0xfb,0x88,0x3e,0xb7,0xf8,0xdc,0xba,0xc8,0x47,0x39,0x95,0xa3,0x41,0x1e,0xff,0xd5,0x0a,0x9e,0x92,0xa7,0x7d,0xd5,0xac,0x55,0x00,0x00,
+ 0x05,0x20,0x3b,0x6f,0x79,0x5f,0xf2,0x9d,0xf2,0x49,0x21,0x2e,0x2f,0x0a,0x68,0xf2,0xf7,0xc4,0xa8,0xd4,0x3d,0xa8,0xab,0x6e,0x2d,0xae,0x09,0xd2,0xc8,0x59,0x7d,0x5f,0x1c,0x0a,0x00,0x00,
+ 0x05,0x20,0x3b,0xc0,0xba,0x99,0x3f,0x29,0xf6,0x1c,0x7d,0xba,0xaf,0x8e,0x0d,0xc2,0x55,0xf1,0xeb,0xf8,0x17,0x89,0x13,0xab,0x32,0x18,0x30,0x5c,0xe6,0x69,0xbb,0x7b,0x28,0xbe,0x00,0x00,
+ 0x05,0x20,0x3d,0x40,0x56,0xba,0x7b,0xe6,0x3b,0x4c,0x0a,0x23,0x52,0xa8,0x4d,0x9a,0x2f,0x07,0x64,0xc4,0x3a,0x55,0x5e,0xda,0x77,0x11,0x10,0x57,0x83,0xe2,0x37,0x7a,0xee,0x1c,0x00,0x00,
+ 0x05,0x20,0x3d,0xdc,0x0a,0x1a,0xfb,0x65,0x9b,0x87,0x99,0x2a,0x66,0xf7,0x54,0x0c,0xcf,0xe5,0x67,0xe9,0x9d,0xe2,0x54,0x4a,0x08,0x14,0xc8,0x2e,0x1b,0xa0,0xe5,0x58,0x4b,0x0a,0x00,0x00,
+ 0x05,0x20,0x3d,0xed,0xe4,0x36,0x34,0xf0,0xa2,0x56,0x2a,0x88,0xe5,0xd2,0x9a,0x0a,0xc3,0x4f,0x5e,0x52,0x91,0x3d,0x51,0x3d,0xfc,0xe1,0xa1,0x37,0x8f,0x6d,0x84,0xd1,0x21,0xdd,0x00,0x00,
+ 0x05,0x20,0x3e,0x22,0xc1,0x92,0x00,0x2d,0x2b,0xed,0xe0,0x6d,0x41,0xe9,0x66,0xd0,0xe0,0x03,0x42,0xb4,0x4d,0x64,0x9d,0xbb,0xf8,0x53,0x98,0x99,0x94,0x6a,0x4b,0xa4,0x96,0x44,0x00,0x00,
+ 0x05,0x20,0x3e,0x2e,0xe3,0x3e,0xf1,0x7b,0x62,0x9c,0x49,0xc5,0xa7,0x0d,0x1e,0xa4,0x6f,0x99,0x67,0x64,0xa5,0x79,0xf4,0xcf,0x0b,0x90,0xb2,0x01,0x45,0x31,0x4f,0x47,0x15,0xed,0x00,0x00,
+ 0x05,0x20,0x46,0x95,0xbd,0x48,0x3b,0x2b,0x14,0x72,0x32,0x9a,0x36,0x59,0xf3,0xf1,0x9a,0xe5,0x02,0x23,0x40,0x6e,0x39,0xcd,0x0e,0x72,0x18,0x07,0xf2,0x15,0x44,0xd6,0xf3,0x28,0x00,0x00,
+ 0x05,0x20,0x46,0xaf,0xfd,0x27,0x4e,0x22,0x54,0xda,0x0c,0x83,0xbc,0x82,0x0b,0xaf,0xc0,0x64,0x3c,0x0f,0xbc,0xe8,0x2c,0xbd,0xb0,0x95,0xb5,0x6d,0x2f,0x72,0x8f,0x43,0x27,0xef,0x00,0x00,
+ 0x05,0x20,0x46,0xb1,0x7e,0xfa,0xad,0x92,0x04,0x06,0x33,0xad,0xcc,0xb2,0x3f,0x02,0x77,0x35,0xf1,0xa5,0xcd,0x34,0x2d,0x41,0xe4,0xa8,0xb4,0x49,0x23,0xb0,0x6d,0xee,0x48,0x92,0x00,0x00,
+ 0x05,0x20,0x47,0x04,0x40,0xbc,0xae,0x41,0x00,0xfc,0x7e,0x97,0x6e,0x3f,0x14,0xd5,0xb9,0xfa,0x57,0xf8,0xc2,0xbd,0xdc,0x8a,0xb3,0x03,0xbc,0x78,0x1e,0xbe,0x43,0x02,0x5f,0xc8,0x00,0x00,
+ 0x05,0x20,0x47,0xf0,0x67,0xba,0x42,0x01,0x5c,0x39,0x33,0x34,0x43,0xa7,0x4a,0x3f,0xf0,0x49,0xb0,0xa5,0xd7,0x73,0xa0,0x0f,0xa8,0xfe,0x39,0xa5,0xac,0xae,0x31,0x89,0x0f,0x27,0x00,0x00,
+ 0x05,0x20,0x41,0x7a,0xd8,0x8a,0x0d,0x4d,0x34,0x1c,0x76,0x3e,0x6e,0x99,0x76,0x18,0xd0,0xf6,0x6d,0xa8,0x0e,0x42,0x9a,0x76,0x41,0xbe,0x0c,0x4b,0x2b,0x05,0x79,0xa3,0x9a,0x80,0x00,0x00,
+ 0x05,0x20,0x41,0xc0,0x8b,0x7c,0xf2,0xf3,0x83,0x57,0xa7,0x84,0x3b,0xbd,0x88,0x00,0xc8,0xe1,0x05,0x42,0xf4,0x24,0x8f,0x8e,0xba,0xba,0x8f,0x8a,0x0b,0xcc,0x96,0xf1,0xfe,0x8c,0x00,0x00,
+ 0x05,0x20,0x42,0x3f,0x10,0x75,0x6e,0x87,0xdb,0x6e,0x6d,0x57,0x4c,0xe3,0xe9,0x8c,0xe5,0xf0,0x97,0x59,0xb4,0xb0,0x80,0x26,0xd0,0x67,0x4c,0x9c,0x7c,0xf2,0xf4,0xf8,0x22,0xc3,0x00,0x00,
+ 0x05,0x20,0x42,0xe5,0x76,0x3b,0x0d,0x19,0x2d,0xc2,0x0f,0x46,0x32,0xcb,0xd6,0x06,0xce,0x77,0x2c,0x4e,0xce,0x7e,0x83,0x1f,0xc5,0x66,0xb9,0xc6,0x6b,0x62,0x57,0x48,0x91,0x7f,0x00,0x00,
+ 0x05,0x20,0x43,0x6d,0x2a,0x90,0xa2,0xbc,0xb2,0x72,0x45,0x3e,0x0d,0xdb,0xf7,0x53,0xf2,0xac,0x91,0x39,0xe3,0x5d,0xf6,0xfe,0x7c,0xf1,0x05,0xc3,0x7f,0x7c,0xc4,0x27,0xff,0x27,0x00,0x00,
+ 0x05,0x20,0x45,0x03,0xaa,0xf8,0xf8,0x33,0x79,0x96,0xb7,0x7c,0x6d,0xb5,0x9a,0x20,0xf4,0x78,0xb3,0x11,0x3d,0xa8,0x86,0x82,0x34,0x2e,0xb2,0x5a,0xc6,0xb9,0x50,0x45,0x8c,0x60,0x00,0x00,
+ 0x05,0x20,0x45,0xce,0x60,0x59,0xef,0xe8,0x1b,0x15,0xda,0xf7,0x31,0x68,0xde,0x65,0x7b,0x67,0x6e,0x75,0xdc,0x12,0x94,0xb2,0xd1,0x3c,0xfc,0x47,0x09,0xe0,0x61,0x81,0xe9,0x61,0x00,0x00,
+ 0x05,0x20,0x4e,0xb5,0xd6,0xc5,0x8d,0x1d,0xaa,0x84,0x1d,0xe4,0xfa,0x03,0xe6,0x33,0xa7,0xfe,0xb6,0x23,0x7b,0x56,0x88,0x7f,0x56,0xd9,0xc5,0x73,0xeb,0xcf,0xea,0x84,0xde,0x6c,0x00,0x00,
+ 0x05,0x20,0x4e,0xbc,0x67,0x80,0x0d,0xe8,0x02,0xb0,0xf7,0xca,0xe4,0x66,0x12,0x01,0x95,0xda,0x0e,0x3e,0x54,0x79,0x1d,0x7f,0xc1,0xdb,0x8a,0x51,0x2b,0x78,0xd0,0x0f,0xb0,0x23,0x00,0x00,
+ 0x05,0x20,0x49,0xfe,0x4a,0xf0,0x1d,0xc9,0x72,0xc2,0x60,0x8a,0x43,0x4f,0x30,0xc0,0xa8,0xf0,0xbf,0x73,0xd4,0x5c,0x64,0x86,0xfc,0x23,0xdf,0x4e,0xe5,0x75,0xfa,0x3c,0xe5,0x15,0x00,0x00,
+ 0x05,0x20,0x49,0xee,0x7b,0x15,0x10,0xc4,0xa2,0x9e,0x8d,0x0f,0x0c,0xc6,0xe5,0x20,0xba,0xe8,0x0f,0x24,0xff,0xa0,0x98,0xe1,0x10,0xad,0xd8,0xef,0xb8,0xc2,0x75,0x77,0x20,0x06,0x00,0x00,
+ 0x05,0x20,0x4a,0xa5,0x9b,0xfb,0xd5,0x70,0x14,0xf0,0x7f,0x44,0x29,0x54,0x9d,0x5e,0xe9,0x6f,0x20,0x65,0xc9,0x03,0xb1,0x12,0xcb,0xb9,0x90,0xc0,0x8f,0x56,0xe1,0xe6,0x87,0xca,0x00,0x00,
+ 0x05,0x20,0x4a,0xf9,0x58,0xf5,0x40,0x17,0xda,0x9c,0x2e,0x68,0xab,0x7f,0x49,0xf4,0x05,0xc4,0x3a,0x87,0xe4,0x5d,0xb3,0xae,0xbe,0x77,0x5b,0x23,0x1c,0x3b,0xa2,0xe2,0x46,0xf3,0x00,0x00,
+ 0x05,0x20,0x4a,0xc5,0x98,0x67,0xad,0x42,0xd7,0xba,0xc8,0x41,0x4d,0xf8,0x92,0xb3,0xae,0x35,0xc6,0xad,0x97,0x2d,0xac,0xa5,0x89,0xe5,0x20,0x6b,0xb5,0x43,0x91,0x9c,0xb5,0x62,0x00,0x00,
+ 0x05,0x20,0x4b,0x47,0x1e,0xa3,0x90,0x3d,0xe5,0xe0,0x03,0x41,0x85,0x68,0x58,0x9a,0x73,0x87,0x88,0xd0,0x57,0x06,0x3a,0x3b,0xc1,0xc0,0xb4,0x55,0x35,0x06,0xca,0x63,0x80,0x3a,0x00,0x00,
+ 0x05,0x20,0x4b,0xe2,0xb3,0x6d,0xd6,0x9e,0xfe,0x6a,0x04,0xfb,0xdc,0x34,0x75,0xe7,0x4a,0xbe,0xf9,0x51,0xde,0x9c,0xf7,0x1f,0xd7,0xc0,0x1c,0xc1,0xec,0x02,0xdd,0xaf,0xa3,0xd8,0x00,0x00,
+ 0x05,0x20,0x4c,0x49,0x19,0xed,0xda,0x89,0xc2,0xa7,0xc2,0x98,0x0d,0x8d,0xf9,0xc3,0x81,0x1d,0x57,0x72,0x1f,0xcb,0x6a,0xc5,0x1e,0x8c,0x64,0xba,0xa8,0x6a,0x55,0x1a,0x5e,0x9f,0x00,0x00,
+ 0x05,0x20,0x4c,0x4d,0x95,0x39,0xe8,0xeb,0xe1,0x36,0x87,0x96,0x23,0xbf,0x89,0xa3,0x48,0x33,0x3e,0x6d,0x11,0xa4,0xe0,0x0c,0x6c,0x8c,0x51,0x8a,0x6e,0xb3,0x6d,0xab,0x6f,0xe2,0x00,0x00,
+ 0x05,0x20,0x4c,0x6a,0x6d,0x6a,0xf5,0x0b,0x13,0x88,0xaa,0x06,0xfb,0x23,0xed,0x6b,0x27,0x68,0xc1,0xb4,0x26,0x74,0x07,0xba,0x28,0x34,0xd6,0x8d,0x48,0xdf,0xc8,0xbd,0xc8,0xff,0x00,0x00,
+ 0x05,0x20,0x4c,0x8d,0xc1,0xca,0xf5,0x32,0x45,0x0c,0xec,0x5a,0x81,0xa7,0x64,0x71,0x0f,0xda,0xf8,0xde,0x1d,0x77,0x70,0xc3,0x53,0x51,0x56,0x02,0x1f,0x81,0x59,0xda,0xf6,0x68,0x00,0x00,
+ 0x05,0x20,0x4c,0x93,0x4b,0x17,0x24,0x09,0x85,0x82,0x1e,0xa7,0xeb,0x37,0xb4,0x57,0xc3,0xf0,0x86,0xf7,0x28,0x80,0x51,0x4f,0xba,0xb6,0x50,0xab,0xe8,0x14,0x08,0x5f,0xdc,0x1a,0x00,0x00,
+ 0x05,0x20,0x4d,0x40,0xe3,0xef,0x62,0x78,0xb2,0xff,0x6b,0xcb,0x1d,0xa3,0xc0,0x64,0xfc,0x38,0x7a,0x24,0xb2,0xeb,0x0e,0x76,0x38,0x6c,0x57,0x44,0x86,0xbc,0xb7,0xf9,0xd7,0x49,0x00,0x00,
+ 0x05,0x20,0x4d,0xa0,0xba,0xc1,0x85,0xab,0x86,0xd8,0xc9,0x63,0x26,0x90,0x38,0x4f,0x5d,0x85,0xd1,0x8a,0x9a,0x03,0x5c,0x75,0x0e,0x51,0xc3,0xec,0xbc,0xb5,0x31,0x64,0x63,0xf0,0x00,0x00,
+ 0x05,0x20,0x4d,0xe1,0x84,0x64,0x9a,0x14,0xfc,0xc6,0x6d,0x35,0xae,0x41,0x56,0x6b,0x21,0x10,0xa4,0xe2,0x76,0x03,0xe1,0x15,0x07,0x7f,0x26,0x9f,0xfb,0x1c,0xe7,0x6c,0x6a,0x37,0x00,0x00,
+ 0x05,0x20,0x57,0x5d,0x86,0xfc,0xe8,0x33,0xe1,0x60,0x46,0x47,0xdd,0x14,0x33,0x32,0xfb,0xcf,0xa7,0x58,0x0a,0xc9,0xa7,0x2e,0x0b,0x44,0xc4,0xf0,0x01,0x2b,0x44,0x6d,0x73,0xb6,0x00,0x00,
+ 0x05,0x20,0x57,0x6a,0x98,0xaf,0x33,0xde,0xc6,0x75,0x6e,0xce,0x94,0x8a,0xde,0x8c,0x8f,0x65,0x71,0xd9,0xdc,0x28,0xab,0xeb,0x9d,0xda,0x3d,0xd3,0x00,0x04,0x24,0xd7,0x3e,0x67,0x00,0x00,
+ 0x05,0x20,0x50,0x41,0x61,0x20,0x98,0x22,0xed,0x64,0x4e,0x29,0x75,0xbb,0xbf,0xe5,0xec,0x1a,0x9a,0x2b,0x22,0x1c,0xd4,0x4e,0x93,0x03,0x16,0xeb,0xbf,0x4e,0xfb,0x4c,0x56,0xb6,0x00,0x00,
+ 0x05,0x20,0x51,0xef,0x1a,0x38,0x0e,0x67,0xd3,0x47,0x09,0x4a,0x76,0xa6,0x1b,0xc1,0xdb,0x0b,0x62,0x96,0x3a,0x09,0x38,0xdc,0x01,0xe3,0x78,0xc4,0x79,0x00,0x0b,0x3c,0x93,0x99,0x00,0x00,
+ 0x05,0x20,0x52,0xe4,0x04,0xf0,0xda,0x49,0xff,0x6f,0x9a,0xf6,0x14,0xda,0x85,0x4c,0xdb,0x3c,0x2d,0x27,0xb3,0xf9,0x5a,0xad,0x39,0x02,0xf6,0xe3,0x69,0xbe,0xa6,0x52,0x48,0x25,0x00,0x00,
+ 0x05,0x20,0x53,0x36,0x1e,0xa7,0xc2,0x84,0x45,0x02,0x58,0x6f,0xa5,0x48,0x80,0xbe,0x76,0xe9,0x8d,0x4b,0x2a,0x76,0x03,0x77,0xe4,0xad,0xd6,0xe5,0xf0,0xa7,0x9b,0x43,0x34,0x7c,0x00,0x00,
+ 0x05,0x20,0x53,0x8f,0xfe,0x2a,0xa1,0x29,0xa8,0x80,0x33,0x7b,0x2c,0x88,0x51,0xad,0x52,0xe9,0xe7,0x41,0x2a,0xa1,0xd9,0xf1,0xbf,0x54,0xe1,0x65,0x6c,0x78,0xc1,0x77,0x78,0x58,0x00,0x00,
+ 0x05,0x20,0x54,0xc8,0x41,0xaf,0x6a,0xf2,0xad,0xf5,0x19,0xbd,0x30,0x63,0x00,0x8d,0x77,0xab,0x20,0x13,0x20,0x13,0x05,0x1b,0x08,0xc2,0x6d,0x47,0xa9,0x6f,0xd3,0x0a,0x71,0x7d,0x00,0x00,
+ 0x05,0x20,0x55,0xb7,0x5f,0x1a,0x1d,0x91,0x18,0x69,0xf0,0xc6,0xf2,0x27,0x46,0x6e,0x13,0x06,0x16,0x06,0xe1,0xc5,0xfd,0x9b,0xe0,0xb4,0x2d,0x30,0xc8,0x1c,0x72,0xe8,0xbd,0x1c,0x00,0x00,
+ 0x05,0x20,0x5f,0x9d,0xd7,0x90,0xab,0x48,0x8d,0xa2,0x94,0x71,0x0d,0x41,0x3c,0x8b,0x7f,0x06,0x86,0xab,0xc5,0xa3,0xd7,0x73,0xfa,0xdd,0x48,0x66,0xa7,0xbc,0xb2,0x59,0xb4,0x8f,0x00,0x00,
+ 0x05,0x20,0x58,0xbb,0xc0,0x3b,0x4e,0xab,0x7c,0x0b,0x13,0x2b,0xf3,0x8c,0xfb,0x8f,0x77,0x02,0x89,0x6e,0x79,0xd3,0x1d,0x3f,0x45,0xe3,0xa0,0x34,0xc2,0x36,0x20,0xaa,0x33,0xf9,0x00,0x00,
+ 0x05,0x20,0x5a,0x29,0xfe,0x8a,0xaa,0x9d,0x78,0x81,0x04,0x53,0x37,0xf5,0x6f,0xb6,0xe1,0x57,0x08,0x80,0xcf,0xf6,0x03,0x11,0x92,0x8d,0x08,0xe3,0x99,0x9f,0x98,0x4a,0x27,0x6b,0x00,0x00,
+ 0x05,0x20,0x5a,0x9a,0x96,0x22,0xf6,0xad,0xf2,0xb0,0x6c,0x46,0xa8,0x7b,0x06,0x3c,0x24,0x3c,0x1e,0x52,0xae,0x89,0x10,0x1e,0xde,0xb0,0xea,0x55,0x3d,0xbb,0x80,0x06,0xb9,0xa4,0x00,0x00,
+ 0x05,0x20,0x5a,0xc1,0x5a,0x79,0xa7,0x36,0x9c,0xfa,0x81,0xfa,0x5e,0xfb,0x42,0xa3,0x5f,0xfe,0x7e,0x4b,0x6a,0xcd,0x99,0x1f,0x57,0x45,0xb4,0x05,0x79,0x3f,0x15,0x8f,0x61,0x72,0x00,0x00,
+ 0x05,0x20,0x5b,0x2e,0x80,0x3e,0x46,0x70,0x7a,0x08,0x24,0x9e,0x71,0x69,0xc6,0xbe,0xee,0x17,0x4c,0xd4,0xcc,0x25,0x19,0xb1,0x2e,0x88,0x81,0xe1,0xc3,0x21,0x3a,0x33,0x5e,0x71,0x00,0x00,
+ 0x05,0x20,0x5b,0xc8,0xa9,0xb9,0xb1,0xd5,0x30,0x87,0x1e,0x99,0x46,0xfb,0x23,0xcd,0x3b,0x70,0x01,0xff,0xc5,0x4b,0x64,0x24,0x8a,0xd3,0x03,0xba,0x85,0x75,0x10,0x1a,0x1d,0xa9,0x00,0x00,
+ 0x05,0x20,0x5c,0x40,0x7f,0x80,0x43,0x91,0x9c,0xfc,0x04,0xdc,0xdc,0x8e,0x01,0xda,0xc8,0xaf,0x90,0x62,0x64,0x16,0xf7,0x11,0xe4,0x87,0xac,0xa4,0x06,0x6f,0x8d,0x87,0x4e,0xd6,0x00,0x00,
+ 0x05,0x20,0x5c,0x4a,0x29,0xcb,0xf8,0x8d,0xa1,0xc8,0x4e,0x20,0x0a,0xf6,0x04,0x75,0x69,0xbb,0x4e,0x60,0xe4,0x1c,0x72,0x43,0xa7,0x29,0xb9,0x73,0x82,0x3a,0x8d,0xb9,0x3b,0xfd,0x00,0x00,
+ 0x05,0x20,0x5d,0x46,0x18,0x02,0xa6,0x1b,0x99,0xd3,0xf4,0x64,0x6d,0x94,0xc1,0xda,0x4b,0x2e,0x6e,0x25,0x17,0xc4,0x18,0xec,0x55,0x91,0x61,0x71,0xbf,0x33,0x3b,0x4c,0xfd,0x24,0x00,0x00,
+ 0x05,0x20,0x5d,0x93,0x10,0x3d,0x45,0x25,0xd3,0x84,0xc0,0xba,0x8c,0x47,0x1e,0x18,0xe7,0xbb,0x17,0x1d,0xa4,0x78,0x34,0x9c,0xd2,0x4c,0xd3,0x39,0x0c,0xba,0xb2,0x34,0xed,0xfd,0x00,0x00,
+ 0x05,0x20,0x5d,0xcf,0xc1,0xcb,0x26,0xb5,0x53,0x92,0xa5,0xf8,0xde,0x89,0x14,0x0c,0x2d,0xd6,0x2f,0x96,0x08,0x22,0x2c,0xbd,0x73,0x81,0x9f,0xd7,0xf5,0x11,0xec,0x6c,0x44,0xf0,0x00,0x00,
+ 0x05,0x20,0x5e,0x0d,0xaf,0x49,0x2a,0x15,0xfa,0x82,0x0f,0xa0,0xe0,0x3e,0x91,0xdd,0x85,0x23,0xd6,0x51,0x36,0x97,0xd9,0x69,0x7e,0xc6,0x57,0xca,0x99,0xd6,0x18,0x21,0x92,0xd7,0x00,0x00,
+ 0x05,0x20,0x5e,0x40,0xd1,0x09,0x74,0x77,0xd7,0x99,0x1b,0xb9,0xca,0xf0,0xe6,0x27,0x9c,0x20,0x03,0x0a,0xb9,0xe1,0xd7,0xea,0xb0,0xc8,0x11,0x31,0x26,0x90,0xa0,0x3f,0x91,0xc7,0x00,0x00,
+ 0x05,0x20,0x5e,0x62,0x6d,0xd4,0x84,0xdd,0x83,0x9f,0xc0,0x1a,0x1f,0x19,0x50,0x21,0x39,0x20,0x70,0xd3,0xdf,0x7d,0xf7,0xe2,0xf4,0x9c,0x75,0x20,0x48,0x4a,0x94,0xe5,0x8b,0xfc,0x00,0x00,
+ 0x05,0x20,0x60,0x70,0x5e,0x8f,0x75,0x3a,0xf0,0xa4,0xb2,0x0f,0x50,0xd1,0x6e,0x6a,0x4f,0x08,0x7f,0x4e,0x0b,0xf5,0xa7,0xd3,0x4a,0xcb,0x78,0x28,0x6c,0x08,0x4d,0x2d,0x83,0x7b,0x00,0x00,
+ 0x05,0x20,0x60,0x73,0xcb,0x60,0xa4,0x84,0xd6,0xb1,0x08,0x11,0xc6,0x85,0x10,0x2b,0x50,0x2b,0xaa,0xd0,0x43,0x5b,0xf7,0xaa,0x31,0x8e,0x2e,0xff,0x90,0x7b,0x88,0x00,0xa9,0x5f,0x00,0x00,
+ 0x05,0x20,0x60,0xaa,0xa1,0x92,0x7a,0xf5,0xf3,0x2c,0xf3,0xe7,0x5d,0x21,0xdc,0x98,0x18,0x66,0x13,0x5c,0xeb,0x3e,0x6a,0x24,0x2e,0x92,0x6c,0x6b,0xd4,0xea,0x0f,0x2a,0xc2,0xd1,0x00,0x00,
+ 0x05,0x20,0x64,0x2b,0x8c,0xfb,0x8b,0xc5,0xba,0xe5,0x0d,0xf2,0x2a,0x4a,0x52,0x80,0x34,0xed,0x34,0xb2,0x38,0x3e,0xa4,0xa0,0xc2,0x8f,0xa0,0x9f,0x48,0x00,0x7e,0x3b,0xf8,0xcb,0x00,0x00,
+ 0x05,0x20,0x65,0x89,0x53,0xf6,0x3d,0x1a,0xb2,0x31,0xad,0xda,0x72,0xfc,0x17,0x25,0xe3,0x1c,0xb6,0xa6,0xbb,0x97,0x83,0xb1,0xe7,0xfa,0x8b,0x40,0xf6,0xf0,0x01,0x86,0x8c,0xd6,0x00,0x00,
+ 0x05,0x20,0x65,0xb0,0x9c,0x8e,0x26,0x9e,0x1e,0x1b,0x27,0x14,0x5d,0xb8,0x82,0x92,0x64,0x4e,0x7d,0x7a,0x4a,0x12,0x9d,0x73,0x85,0xe6,0x72,0x79,0xde,0x6d,0x47,0x59,0x2f,0xe8,0x00,0x00,
+ 0x05,0x20,0x65,0xcc,0xb3,0x43,0xa8,0x17,0x23,0xa6,0x20,0xd3,0xa3,0x09,0xde,0x3a,0xc5,0xd3,0xd4,0xe5,0xa7,0x91,0xb4,0x4c,0xa5,0xd7,0xb0,0x90,0xfa,0x06,0x07,0xb5,0x62,0x32,0x00,0x00,
+ 0x05,0x20,0x6e,0xdf,0xd1,0xa9,0x1c,0xaa,0x92,0xca,0xc3,0xec,0x33,0xfa,0x12,0x1c,0x05,0x27,0x45,0x1a,0xaf,0xd0,0xeb,0xc8,0xa1,0x14,0x47,0x8d,0xb1,0x39,0x7c,0x7e,0x18,0x43,0x00,0x00,
+ 0x05,0x20,0x6e,0xee,0x4b,0xbf,0x4a,0x4d,0x45,0x08,0x8f,0xb7,0x93,0x0c,0xe1,0xbe,0x5a,0x41,0xeb,0x59,0x28,0x50,0x45,0x1e,0xbd,0x0d,0xd9,0x1e,0x43,0x1c,0x90,0x1e,0x4b,0x61,0x00,0x00,
+ 0x05,0x20,0x6f,0x4e,0x81,0xcb,0xfd,0xfb,0x4e,0x74,0xb3,0x84,0x2a,0x1a,0xd2,0xd4,0xc1,0xea,0x98,0x6b,0xda,0xb3,0xf0,0x06,0x60,0x9f,0xdc,0xe9,0xba,0x54,0x85,0xe7,0x11,0xff,0x00,0x00,
+ 0x05,0x20,0x6f,0xd2,0xe8,0xa1,0x8b,0x84,0x52,0x59,0x0c,0x32,0xad,0x9d,0x96,0x13,0xc4,0x40,0x9f,0x44,0x6f,0xbb,0x13,0xb6,0xe8,0x07,0x48,0xa3,0xca,0x4b,0x7a,0xcb,0x4b,0x53,0x00,0x00,
+ 0x05,0x20,0x68,0x1d,0x7f,0xe5,0xe0,0x32,0xb7,0x9d,0x64,0x51,0x13,0x63,0x56,0xa6,0x54,0x80,0x4c,0xc3,0xca,0x61,0xde,0x7a,0x6c,0xb5,0xed,0x1d,0xb6,0x75,0x87,0x97,0xee,0x40,0x00,0x00,
+ 0x05,0x20,0x68,0xb4,0x36,0xf9,0xa8,0x29,0x3e,0x92,0x30,0x41,0x50,0x97,0xb4,0x19,0xf8,0xb5,0x29,0x94,0x77,0xb2,0x9c,0x09,0x5d,0xca,0xa2,0x6b,0x68,0x9d,0x02,0x69,0x75,0x97,0x00,0x00,
+ 0x05,0x20,0x68,0xc7,0xb8,0x91,0x85,0xda,0x06,0x2e,0x7e,0x84,0xa6,0x1e,0x7d,0xec,0x44,0xd0,0xcd,0x0b,0x3d,0x11,0xb8,0x20,0xe6,0x54,0xda,0xd5,0x5b,0xf1,0x94,0xb6,0xd2,0xfc,0x00,0x00,
+ 0x05,0x20,0x68,0xe6,0xe4,0x77,0x65,0xcf,0xc9,0xe6,0x2f,0xd5,0xf2,0x5b,0xbd,0xfb,0xfd,0x6d,0x84,0x8b,0x7d,0x94,0xeb,0x24,0xdf,0x80,0xb9,0x09,0xc8,0x17,0xc6,0x92,0x81,0xbe,0x00,0x00,
+ 0x05,0x20,0x6a,0x1e,0x4a,0x9f,0xae,0x78,0x8d,0xf9,0x4e,0x4c,0x2f,0xb8,0x3a,0xcd,0x5d,0x0b,0x79,0xd7,0x44,0x4a,0x70,0x35,0x1d,0xf8,0xc2,0x6c,0xcb,0xd4,0x6c,0xf2,0xda,0x47,0x00,0x00,
+ 0x05,0x20,0x6a,0x93,0xac,0x80,0x29,0xe8,0x79,0x53,0xb9,0x63,0xde,0xdb,0x9d,0xa8,0xcf,0xd5,0xf6,0x8d,0x92,0x5a,0x5e,0xd1,0x9f,0x72,0x37,0xbf,0xc8,0xcf,0xc5,0x46,0xa0,0x41,0x00,0x00,
+ 0x05,0x20,0x6a,0xe9,0x69,0x19,0xe1,0x56,0xc4,0xf5,0x88,0x3a,0x2b,0xda,0x57,0xa6,0x27,0x74,0xf5,0x6f,0x83,0xcc,0x9a,0x4c,0x65,0x41,0x0a,0xa0,0xe4,0xfc,0x4a,0x0b,0x90,0x89,0x00,0x00,
+ 0x05,0x20,0x6b,0x34,0x3a,0x48,0xdb,0x7e,0x3f,0xf6,0x6b,0x62,0x8e,0xdb,0x3d,0x27,0x90,0xfd,0x15,0x6c,0xd6,0x06,0xaf,0x8f,0xed,0xf5,0xf6,0xe4,0x96,0x6b,0x59,0xf3,0x22,0x8a,0x00,0x00,
+ 0x05,0x20,0x6b,0xdc,0x57,0x84,0x31,0xa6,0x75,0x00,0x70,0x35,0x11,0xd6,0x05,0xef,0xdb,0x8e,0xe8,0x84,0x78,0xc9,0x61,0x8a,0xf1,0x76,0x31,0x21,0x83,0xa7,0x23,0xab,0x10,0x15,0x00,0x00,
+ 0x05,0x20,0x6c,0xde,0xd2,0xc7,0x42,0x65,0xf2,0xb6,0x4b,0x2d,0xa9,0x8b,0x5d,0xea,0x36,0xd3,0xc7,0x50,0xe7,0xec,0xbd,0x27,0xb0,0x99,0xe7,0x27,0x1d,0xae,0x0e,0x0b,0xa8,0xf8,0x00,0x00,
+ 0x05,0x20,0x6d,0x2c,0xf3,0xce,0x94,0x19,0x63,0x2b,0x20,0x72,0xd6,0xa0,0x98,0x7b,0x79,0x35,0xcf,0xdb,0x53,0xe4,0x88,0x0a,0xbd,0xf9,0x38,0x6a,0x29,0x73,0xe7,0xfd,0x42,0xb1,0x00,0x00,
+ 0x05,0x20,0x6d,0x8a,0x3b,0x2c,0x2b,0x3d,0x06,0xe6,0x6d,0xd0,0x26,0xf5,0x8c,0xe6,0x94,0x4e,0xa4,0x1d,0xfe,0x69,0xaa,0xd8,0x86,0x22,0x34,0xe0,0x9c,0x0c,0xa3,0xa5,0x89,0x09,0x00,0x00,
+ 0x05,0x20,0x6d,0xcf,0x2f,0xa8,0xff,0xd1,0xa6,0x4b,0xff,0x67,0x3d,0x3a,0x0f,0xcc,0xc9,0xa2,0xfb,0x96,0x7a,0x1f,0x1d,0xc8,0x98,0x15,0x75,0x1c,0x3c,0x17,0x43,0xc0,0xe3,0x11,0x00,0x00,
+ 0x05,0x20,0x6e,0x78,0xb8,0x7d,0xec,0x95,0x9a,0x60,0x12,0xb5,0xd5,0x21,0x80,0x21,0xb0,0xcd,0x26,0x5b,0xad,0x40,0xad,0xcc,0x32,0x6a,0xda,0x92,0xdd,0xa7,0xf8,0x9a,0x50,0x8b,0x00,0x00,
+ 0x05,0x20,0x76,0xa2,0x25,0x46,0x1f,0x49,0x12,0xaf,0x64,0xb7,0x85,0x37,0x92,0x0f,0xb5,0xc2,0x5f,0x00,0x19,0x5e,0x71,0xa1,0x27,0xc3,0xfe,0xf9,0x2a,0x01,0x12,0x3a,0x9d,0x81,0x00,0x00,
+ 0x05,0x20,0x77,0x26,0xa0,0x0f,0xf6,0x19,0x30,0x08,0x90,0xb4,0x25,0xb4,0x3d,0xe2,0x6f,0xb0,0xb9,0xd9,0xd9,0x42,0x07,0x6a,0xe0,0x99,0x03,0x3d,0x2b,0xe3,0xff,0x91,0xdc,0x8b,0x00,0x00,
+ 0x05,0x20,0x77,0x65,0xd4,0xec,0xc7,0x3a,0x3e,0x94,0x3e,0x43,0xe2,0x7a,0x91,0x07,0xf0,0x48,0x64,0x09,0xaa,0xd7,0x15,0x5d,0x33,0x25,0x38,0x34,0xc4,0x9d,0xad,0x00,0x4b,0xb0,0x00,0x00,
+ 0x05,0x20,0x70,0x1a,0xfe,0xcb,0x8e,0x5c,0xba,0x81,0xc5,0xeb,0x03,0x98,0xb5,0x25,0xde,0xbf,0x88,0x00,0x25,0x1a,0xb8,0x69,0xd5,0x35,0x6e,0xa5,0xc0,0x76,0x59,0x19,0x82,0x1f,0x00,0x00,
+ 0x05,0x20,0x70,0x30,0x29,0xb3,0xf5,0xbc,0xc0,0x66,0x8e,0xc0,0x7b,0x7b,0x27,0x26,0x16,0xd6,0xdc,0x33,0x37,0x2d,0xd8,0xb9,0xfc,0xae,0xc2,0xed,0xc0,0xb1,0x45,0xa5,0x2e,0x15,0x00,0x00,
+ 0x05,0x20,0x70,0xfd,0x70,0x0e,0xb5,0x5c,0x08,0x35,0xfe,0xa9,0x27,0x41,0x4a,0x39,0xfc,0x7b,0x6c,0x5d,0x79,0xe5,0x4f,0x3c,0xcb,0xde,0x82,0xac,0xf7,0xc8,0xaf,0xb7,0xeb,0xb8,0x00,0x00,
+ 0x05,0x20,0x70,0xd9,0xc7,0x5d,0xd9,0x63,0x0d,0xda,0x94,0xf9,0xf8,0xbf,0x55,0xbd,0xe8,0x50,0x75,0x2f,0xcf,0xd1,0x69,0xd5,0xd4,0x07,0x3d,0xa9,0x92,0x4f,0xb3,0x68,0x30,0xba,0x00,0x00,
+ 0x05,0x20,0x71,0x8c,0xdf,0x40,0x2f,0x60,0x40,0x6d,0x6b,0x86,0xa3,0x00,0x6c,0x99,0xae,0xee,0xd8,0x67,0x64,0x3e,0xec,0xdf,0x99,0xf5,0x64,0xca,0x42,0x50,0x85,0x10,0x56,0x39,0x00,0x00,
+ 0x05,0x20,0x71,0xde,0x08,0xc6,0x86,0xaa,0x74,0xb8,0x1d,0x23,0xee,0x8b,0xb0,0x8d,0x9b,0xb0,0x38,0xc6,0x13,0x5d,0x76,0x53,0x04,0xc0,0xc2,0x32,0x5b,0x4e,0x4a,0x56,0xc2,0x40,0x00,0x00,
+ 0x05,0x20,0x72,0x14,0x51,0x06,0xf4,0x36,0xf9,0x59,0x95,0xaa,0x2a,0xcf,0xe7,0x19,0xa2,0xbb,0xeb,0x99,0x75,0x39,0x29,0xc0,0x04,0x6b,0x97,0xa5,0x73,0x86,0x96,0x48,0xdc,0x97,0x00,0x00,
+ 0x05,0x20,0x72,0x29,0x23,0x1d,0xfb,0x56,0xf9,0xb7,0x16,0x58,0xb6,0xb0,0xcf,0x20,0x89,0xaa,0x32,0xda,0x2a,0xfd,0x5c,0x4e,0x02,0xdf,0x23,0x04,0x98,0x95,0x63,0x5c,0x45,0xc2,0x00,0x00,
+ 0x05,0x20,0x72,0x8b,0x72,0x38,0xfe,0x44,0xe9,0xc2,0xf4,0xbc,0xd8,0xce,0x1c,0xd5,0x50,0xb1,0x63,0x56,0x74,0x5e,0xf2,0xd3,0xe5,0xd5,0x29,0xe4,0x34,0x1d,0xf5,0x1c,0x7a,0xb9,0x00,0x00,
+ 0x05,0x20,0x73,0x14,0x85,0xbf,0xe4,0x1e,0x55,0xf2,0xbd,0x8c,0x5e,0x8b,0x85,0x82,0x3e,0xe3,0xc5,0xd7,0x28,0x17,0xa2,0x33,0x5f,0xcc,0xb0,0x56,0xa0,0xc9,0x14,0x6e,0x53,0xf8,0x00,0x00,
+ 0x05,0x20,0x74,0x72,0x72,0xac,0x9f,0xc1,0x1a,0x14,0x12,0x51,0x99,0xb7,0xf5,0xa9,0x78,0xa2,0x84,0x9c,0x24,0x55,0x28,0xe2,0xf5,0x6d,0xed,0x8c,0x64,0x79,0xaf,0xd2,0x18,0xa3,0x00,0x00,
+ 0x05,0x20,0x75,0x54,0x9c,0x2c,0x32,0x29,0x35,0xfe,0xf8,0x4f,0x79,0xf3,0x7d,0x66,0xa7,0x3b,0x26,0x12,0x4e,0x3d,0x12,0x3d,0x2b,0x33,0x03,0x80,0xba,0x89,0x81,0x30,0xbb,0x3e,0x00,0x00,
+ 0x05,0x20,0x75,0x89,0x75,0xd0,0x89,0x0e,0xc9,0x2c,0xdf,0x8f,0xd8,0x7d,0x9a,0x5f,0x06,0x34,0xaf,0x79,0xaa,0xe5,0x35,0xdd,0x85,0xa8,0x06,0x29,0x05,0x2d,0x84,0xc5,0x6b,0xd2,0x00,0x00,
+ 0x05,0x20,0x7e,0xe1,0x73,0xcd,0xd7,0x02,0x54,0xc9,0xfe,0x66,0x17,0xa5,0x3a,0xf7,0xac,0x92,0x09,0x51,0x77,0x7a,0xdc,0x67,0x19,0x22,0xd2,0x9d,0x66,0x5d,0xfd,0x16,0x47,0x07,0x00,0x00,
+ 0x05,0x20,0x7f,0x27,0x28,0x5a,0xa3,0x78,0x11,0x3a,0xac,0xc0,0xa2,0x4b,0x1d,0x33,0x50,0x0c,0x77,0xe8,0x22,0xd4,0x90,0x25,0xdc,0xa9,0x14,0x9f,0xed,0xab,0x24,0x4f,0xdc,0xa0,0x00,0x00,
+ 0x05,0x20,0x7f,0x97,0xc5,0x6f,0x0b,0xf1,0xd9,0x22,0x3f,0x92,0x3c,0x79,0xf6,0x92,0xf6,0xc8,0xfa,0xce,0x4f,0xe3,0x1e,0x7d,0x82,0x3d,0x7a,0x94,0x18,0xa4,0x0a,0xf5,0x28,0x42,0x00,0x00,
+ 0x05,0x20,0x79,0x23,0x63,0x95,0x6f,0x9b,0x12,0xaa,0x30,0xa1,0xd4,0x36,0xc9,0xde,0x0a,0xc9,0xd5,0x88,0x3f,0xfa,0xda,0xc2,0xbe,0x0a,0x7a,0xca,0x2a,0x7c,0x32,0x8f,0x54,0xe9,0x00,0x00,
+ 0x05,0x20,0x7a,0xc8,0x27,0x35,0xb4,0x50,0xe7,0xc2,0xbf,0xe2,0x48,0x92,0x7f,0x80,0xba,0x06,0xdb,0x99,0x35,0x45,0x82,0x4d,0x7d,0x4b,0xe9,0x0f,0x6f,0x83,0xc3,0x61,0xed,0xc0,0x00,0x00,
+ 0x05,0x20,0x7b,0x98,0xe1,0xe0,0xbb,0x6b,0x41,0x5f,0xe0,0x94,0xd5,0x25,0x19,0x1f,0x30,0xf8,0xea,0x38,0x02,0xd1,0x3b,0x81,0x4d,0xd2,0xeb,0x43,0x11,0x53,0xe3,0x9e,0x5b,0x01,0x00,0x00,
+ 0x05,0x20,0x7b,0xa8,0x45,0xdf,0x63,0x53,0xa0,0xde,0x8e,0xab,0x0e,0xaa,0x40,0x64,0xe8,0x42,0x9b,0x6a,0xce,0xa0,0x18,0x43,0x95,0x3e,0x2a,0xdb,0x59,0x55,0xf2,0xb0,0x78,0x98,0x00,0x00,
+ 0x05,0x20,0x7b,0xc9,0x9e,0xef,0x11,0x97,0x96,0x06,0xe2,0xb8,0xbd,0x2e,0x15,0xc2,0xe8,0xa5,0x4e,0xd8,0x56,0xb3,0x01,0x59,0x60,0x20,0x7a,0x51,0x9f,0xa1,0xdf,0x55,0xea,0x01,0x00,0x00,
+ 0x05,0x20,0x7c,0x1b,0x0b,0x5d,0x7f,0x4c,0xa2,0xe5,0x7e,0xa6,0x79,0x85,0x55,0xde,0xcb,0x51,0xbd,0x81,0x2a,0xfb,0xdb,0x76,0x6e,0x5c,0xbd,0x5d,0x68,0xd9,0xd9,0xbe,0xd8,0x7c,0x00,0x00,
+ 0x05,0x20,0x7c,0x1e,0x98,0xa5,0xb5,0x0c,0x57,0x9c,0xe5,0xb5,0xdc,0x5b,0xae,0x3d,0x45,0x23,0x2b,0xed,0x4a,0x83,0x1c,0x66,0x5e,0xab,0x37,0xba,0xf6,0x00,0x91,0x5d,0xb9,0x77,0x00,0x00,
+ 0x05,0x20,0x7c,0xf6,0x85,0x05,0x70,0xd6,0x26,0xe8,0x10,0x44,0x9d,0xc7,0x44,0x6c,0x97,0x16,0x24,0xd8,0x87,0x29,0xd4,0x6d,0x1e,0x40,0x37,0x84,0xd6,0x25,0x2e,0x4a,0x4b,0xba,0x00,0x00,
+ 0x05,0x20,0x7d,0x0e,0x49,0x44,0x50,0xeb,0x92,0x2a,0xbc,0x8d,0x1b,0xd3,0x5e,0x9d,0x1f,0x51,0x6f,0x5c,0x7b,0x87,0x5b,0xcc,0x27,0x28,0xb6,0x44,0x36,0x22,0x29,0xcc,0x3c,0x7c,0x00,0x00,
+ 0x05,0x20,0x7d,0x7c,0x6f,0xd1,0x0d,0xf7,0x77,0x12,0x44,0x68,0x45,0x46,0x69,0xb9,0x11,0x4d,0x5c,0xa4,0xba,0xc8,0xe0,0x76,0x5b,0x02,0x72,0xc8,0xd7,0x32,0x61,0xd2,0xda,0x34,0x00,0x00,
+ 0x05,0x20,0x7d,0x61,0x8a,0xb7,0x4b,0x7d,0x5c,0x4c,0x1c,0xc2,0x35,0x1a,0xe8,0x4c,0x93,0x54,0x54,0xff,0xf9,0x04,0x36,0x1c,0x84,0x68,0x05,0xe0,0xa2,0xd5,0xcd,0xde,0x30,0x75,0x00,0x00,
+ 0x05,0x20,0x7d,0xdb,0xe0,0x17,0x76,0xe3,0xfc,0x0a,0x19,0x6a,0x9a,0x09,0x45,0x52,0x5e,0xa6,0x73,0xa7,0x85,0xfa,0x26,0x01,0xc7,0x52,0xb1,0xfa,0xf2,0xbb,0x9f,0x46,0x8e,0x79,0x00,0x00,
+ 0x05,0x20,0x87,0x74,0x2d,0x93,0x04,0xd9,0xaa,0x02,0x3e,0x07,0xa7,0x3a,0xd9,0xf1,0x07,0x34,0x0b,0x4c,0xca,0x3d,0x39,0xfa,0xce,0xb4,0xd0,0x9c,0x4f,0x06,0x59,0x24,0x4a,0x5b,0x00,0x00,
+ 0x05,0x20,0x87,0xd8,0xd6,0x3c,0xcb,0xef,0x04,0x10,0x3a,0x24,0x68,0x94,0x0c,0x04,0xf6,0x69,0xfa,0xea,0xe0,0x0a,0x15,0x66,0x76,0x24,0x72,0x65,0x61,0x44,0x3f,0xa4,0x2f,0x1a,0x00,0x00,
+ 0x05,0x20,0x80,0xc6,0x6f,0xb3,0x18,0x5a,0x1a,0xde,0x4e,0xde,0x50,0xd2,0xc6,0x3f,0xc5,0x96,0x09,0x35,0x3a,0x4d,0x88,0x5f,0xa3,0x49,0x37,0xff,0xe6,0xc5,0x43,0x10,0xaf,0xa8,0x00,0x00,
+ 0x05,0x20,0x81,0x43,0x43,0x1c,0xb1,0xe9,0xce,0x67,0x39,0x80,0x96,0x2a,0x8b,0x2b,0x79,0x43,0x75,0xca,0x12,0x2f,0x5f,0xa9,0x1c,0xf6,0x4c,0xcd,0xc5,0xa1,0xa2,0xbd,0x45,0xee,0x00,0x00,
+ 0x05,0x20,0x82,0xa5,0x33,0xa3,0x30,0x99,0x46,0x94,0xdc,0x51,0x01,0xe1,0x75,0x2f,0x61,0x25,0x7f,0xd5,0x6b,0x81,0x58,0x0d,0x15,0x3a,0x59,0xb9,0x1b,0xce,0xe4,0x8b,0x42,0x5e,0x00,0x00,
+ 0x05,0x20,0x83,0x3d,0x52,0xc3,0x8f,0x2d,0x52,0x6d,0xc7,0x86,0xd6,0xae,0xa3,0x73,0xf7,0x17,0x07,0xac,0x74,0x5f,0x82,0xe4,0xe8,0x60,0xe5,0x7b,0xe5,0x53,0xec,0xd1,0x49,0x54,0x00,0x00,
+ 0x05,0x20,0x83,0x21,0x20,0xe0,0x1f,0xc1,0xde,0x35,0x1a,0xf8,0x84,0xf2,0x26,0x5c,0x09,0x41,0xc8,0x36,0xbf,0xd2,0x61,0xda,0x6b,0xfe,0x5a,0x6f,0x0d,0x7e,0xb2,0x91,0x9f,0xac,0x00,0x00,
+ 0x05,0x20,0x83,0x60,0xe4,0xae,0x67,0xc3,0x3f,0x9e,0x1a,0xc8,0xc8,0x82,0xb3,0xbc,0x7a,0x99,0xf1,0xfa,0xf0,0x1e,0x41,0x58,0x4e,0xfc,0x39,0xc2,0xf6,0xdb,0xe5,0x49,0xf2,0x04,0x00,0x00,
+ 0x05,0x20,0x83,0xc1,0xd6,0xbf,0xff,0x64,0x4c,0x96,0x30,0xe7,0xfe,0x83,0x04,0xb4,0xeb,0xbc,0x3a,0x94,0xec,0x0d,0x6c,0xce,0xe8,0x58,0x5f,0xd4,0xb3,0xfa,0x71,0x3c,0xca,0x8d,0x00,0x00,
+ 0x05,0x20,0x84,0x19,0x7a,0xd1,0x36,0x47,0x15,0x33,0x27,0x42,0xa4,0x19,0x6e,0x29,0x14,0x4a,0x8b,0xfa,0x2a,0x2a,0x71,0x3b,0x1c,0x63,0x81,0x48,0x7f,0x3c,0x2c,0x8f,0x5c,0x92,0x00,0x00,
+ 0x05,0x20,0x84,0x23,0x5c,0x0a,0x74,0x73,0x25,0x78,0x22,0x0a,0xb4,0xf2,0xf2,0xde,0x63,0x73,0xf3,0x11,0xc1,0x80,0xbb,0x6c,0xd3,0xb6,0x99,0xca,0xf4,0xb8,0x8c,0x56,0xf9,0x9e,0x00,0x00,
+ 0x05,0x20,0x85,0x82,0xc4,0xdc,0xcd,0xb3,0x51,0x34,0x37,0x5f,0x30,0x2d,0x3a,0x76,0xc4,0x46,0x02,0xee,0xb5,0xab,0x34,0xb9,0x38,0xc4,0xfd,0xaa,0x3b,0xad,0x74,0xa4,0xcb,0x11,0x00,0x00,
+ 0x05,0x20,0x85,0x8f,0x55,0xbe,0x27,0x56,0xdb,0x39,0x5a,0x3d,0xbb,0x66,0xd1,0x68,0xe7,0x33,0x2a,0x3d,0x84,0x26,0xc9,0x94,0x17,0x30,0x28,0x40,0x4f,0x19,0x27,0xea,0xf1,0xb1,0x00,0x00,
+ 0x05,0x20,0x85,0xa6,0xf6,0x1f,0xd2,0x93,0x54,0x47,0x59,0xc2,0x6d,0x57,0xfa,0x54,0x94,0x39,0x5c,0x33,0xcf,0x67,0x91,0xad,0x6c,0x0c,0xf8,0xdd,0x79,0x76,0x5a,0x01,0xb5,0x49,0x00,0x00,
+ 0x05,0x20,0x85,0xec,0x3d,0xb6,0x9c,0x52,0x05,0x6a,0x60,0xee,0x49,0x38,0x30,0x18,0x67,0x0a,0x0b,0xc0,0xdc,0x8c,0xe4,0x95,0xd2,0x4e,0xb5,0x41,0xb0,0x20,0x93,0xba,0x71,0x50,0x00,0x00,
+ 0x05,0x20,0x8f,0x8e,0x3d,0xa9,0xb0,0x46,0x9f,0xe5,0x02,0xdf,0x3e,0x03,0x11,0x17,0x50,0xea,0xc4,0x08,0xd1,0x62,0x16,0x65,0xb9,0x18,0x54,0xcf,0x30,0x2d,0x48,0x09,0xd9,0xb0,0x00,0x00,
+ 0x05,0x20,0x8f,0xc3,0x43,0x7a,0xc1,0x39,0x2b,0x08,0x2c,0x20,0xab,0xa8,0x9d,0x98,0xcf,0x07,0xc9,0xdf,0xc8,0x23,0xdb,0x91,0x55,0x66,0x04,0xc0,0x0d,0x19,0xde,0x47,0x62,0x5e,0x00,0x00,
+ 0x05,0x20,0x88,0x3f,0x99,0xc3,0xee,0x87,0xd2,0x27,0x65,0xf4,0x47,0xc5,0xcc,0xd7,0xfe,0x31,0xff,0x14,0xd8,0xf0,0xe9,0x54,0xfb,0xbf,0xe3,0xad,0xbf,0x14,0x4d,0x02,0x57,0xbd,0x00,0x00,
+ 0x05,0x20,0x88,0x7f,0x3c,0x24,0x7e,0x32,0x3e,0x4a,0xb2,0x7d,0x66,0x6b,0x30,0xba,0x20,0x64,0x10,0xfe,0x6e,0x47,0xfe,0xb2,0x9b,0xb6,0xc7,0x4f,0x55,0xfd,0x64,0xa8,0xd9,0xbc,0x00,0x00,
+ 0x05,0x20,0x88,0x44,0x8b,0x59,0xc8,0x63,0xb7,0x5e,0xf4,0x1f,0x6f,0x2e,0x1d,0x60,0xf8,0xb9,0x23,0x4a,0xe7,0x13,0xd0,0x86,0x52,0x34,0xdb,0x3e,0xc1,0x10,0x1a,0x1c,0x46,0x51,0x00,0x00,
+ 0x05,0x20,0x89,0x0a,0xee,0x57,0xfa,0xfa,0x58,0x52,0xfb,0x0b,0x8b,0xc2,0xaa,0x8f,0xa4,0x62,0xcb,0x1d,0x1c,0x0c,0x01,0x0f,0xfc,0x9d,0xde,0x75,0x40,0xbe,0x8d,0x8d,0xb2,0xe6,0x00,0x00,
+ 0x05,0x20,0x89,0x4d,0x24,0x9f,0x15,0x80,0x68,0xd2,0x17,0xa1,0xec,0x74,0x46,0x26,0x8e,0xbd,0xf4,0x8f,0xc4,0x52,0x5f,0xcc,0x09,0x9f,0x1a,0x6f,0x0d,0x64,0xe3,0x00,0x9f,0x83,0x00,0x00,
+ 0x05,0x20,0x8a,0x21,0x15,0x27,0xf9,0x3d,0x2d,0x00,0xbc,0x6b,0xa1,0x16,0x84,0x9b,0x14,0xae,0x28,0x12,0x40,0x99,0xd3,0x46,0xda,0xa3,0xd9,0x26,0x59,0x51,0x5a,0x0c,0xc5,0xe5,0x00,0x00,
+ 0x05,0x20,0x8a,0x77,0xf3,0x26,0x77,0xd5,0x19,0x01,0x08,0x4b,0xbd,0x99,0x32,0x8c,0xc3,0xba,0x8b,0x2b,0x3f,0x8f,0x34,0x5a,0x68,0xd4,0xf0,0x87,0x0a,0x73,0xa6,0x04,0xa0,0xfe,0x00,0x00,
+ 0x05,0x20,0x8a,0xe5,0xe7,0x6b,0x68,0xcf,0x6c,0x30,0x0d,0xda,0x6d,0xe4,0x3b,0xda,0xf2,0x51,0x7c,0xc1,0x4e,0x45,0xf6,0xb6,0xa4,0x7a,0x8a,0xa3,0xe2,0x32,0xe9,0x65,0x10,0x6a,0x00,0x00,
+ 0x05,0x20,0x8b,0x3d,0x54,0x9e,0x74,0x6f,0x72,0x94,0x6c,0xa4,0x30,0x6b,0x4d,0x65,0x83,0x5b,0xbd,0xf9,0xd2,0xa3,0x06,0x86,0x1a,0x92,0x08,0xd5,0x59,0x08,0x5c,0x71,0x0c,0x96,0x00,0x00,
+ 0x05,0x20,0x8c,0x19,0x6c,0x70,0x40,0xcd,0xa6,0xc5,0x55,0x74,0xb5,0xf3,0x9f,0xab,0x4b,0xc7,0x53,0x61,0x39,0x01,0x04,0x7d,0x52,0xdd,0xf1,0xee,0x80,0x06,0x2e,0x2c,0xed,0x88,0x00,0x00,
+ 0x05,0x20,0x8c,0x59,0xa7,0x91,0x92,0xe6,0xba,0x1a,0x1d,0xcd,0x7c,0xdf,0xf5,0x86,0x61,0x7c,0x59,0x6b,0x24,0xe1,0x2c,0xc9,0x8e,0x51,0x35,0x56,0xba,0xd1,0x2e,0xff,0x89,0x23,0x00,0x00,
+ 0x05,0x20,0x8c,0xb8,0x4b,0xb7,0x1c,0x99,0xf6,0x0f,0xb4,0xc8,0x34,0x4c,0xf5,0xae,0x46,0x71,0x25,0x77,0x5f,0x30,0x82,0xbb,0x47,0xe7,0x34,0xd7,0x0c,0x32,0xd7,0xd1,0x48,0x05,0x00,0x00,
+ 0x05,0x20,0x8c,0xec,0xcf,0x35,0x24,0x2f,0x66,0x82,0xda,0xbd,0x72,0xe5,0xb0,0xf1,0xb2,0x0b,0x9a,0x84,0x1b,0xaa,0x1d,0xb7,0xa4,0x2b,0xb0,0x0d,0x77,0x66,0x1d,0xce,0xdb,0xc2,0x00,0x00,
+ 0x05,0x20,0x96,0x93,0xa8,0xd7,0x43,0x12,0x32,0x6d,0xa0,0x2c,0x8d,0xb2,0x2a,0xc0,0x9d,0x11,0xa6,0x01,0x93,0x20,0xb3,0xac,0xdf,0xf9,0x7e,0x91,0x60,0x39,0xa8,0xad,0xce,0x52,0x00,0x00,
+ 0x05,0x20,0x90,0x40,0xb7,0xe8,0x6e,0xbe,0x08,0x39,0xc7,0xba,0x52,0x7b,0xfa,0x83,0x51,0x60,0x51,0xd6,0xbe,0x4f,0xaf,0x07,0x15,0x72,0xb7,0x6d,0x12,0x03,0x7f,0x46,0x9b,0xd1,0x00,0x00,
+ 0x05,0x20,0x90,0x8b,0x8c,0xe4,0x6d,0xc0,0x9e,0xf0,0xea,0xb2,0xe2,0x00,0x4f,0xda,0xc9,0x88,0x67,0x8b,0x4e,0x85,0xe2,0x31,0x81,0x81,0x0e,0x5a,0xab,0x9c,0x68,0x7e,0x0e,0xe6,0x00,0x00,
+ 0x05,0x20,0x91,0x0c,0xda,0xcd,0x49,0x84,0x0f,0x97,0x77,0x4d,0x4d,0xd8,0x0d,0xa4,0xc4,0x8d,0x82,0xb6,0xbe,0xb0,0x8b,0x92,0x9c,0x12,0x90,0x36,0x41,0x5f,0x8e,0xc9,0x5e,0x5c,0x00,0x00,
+ 0x05,0x20,0x91,0x1a,0x19,0x6a,0xa3,0xdb,0x12,0x69,0x17,0x4d,0xab,0xd2,0x26,0x93,0xdb,0x7e,0x44,0x57,0x2d,0xaa,0xd5,0x66,0x5d,0x26,0xe0,0xfb,0xee,0x41,0x50,0x8f,0x2a,0x53,0x00,0x00,
+ 0x05,0x20,0x91,0x94,0x32,0xe9,0xaa,0xf6,0xa4,0xbb,0xf8,0xd3,0x8b,0x63,0x72,0x39,0x0a,0x6b,0xc6,0x72,0xa5,0x39,0x6c,0x22,0x22,0x4c,0x6d,0xa6,0x93,0xd4,0x21,0x73,0xbf,0x84,0x00,0x00,
+ 0x05,0x20,0x91,0xfa,0x7b,0x5b,0x9a,0xad,0x97,0x25,0xf7,0xe2,0x1c,0x5c,0xf0,0x12,0x0c,0x65,0x9d,0x94,0x35,0xb1,0xd4,0xcd,0xeb,0x43,0x8f,0x89,0xbb,0x68,0xaa,0x92,0xad,0xd2,0x00,0x00,
+ 0x05,0x20,0x91,0xcf,0xa2,0x5b,0x04,0x33,0x69,0x66,0xb0,0x72,0x27,0x54,0xbe,0xcd,0xd8,0x08,0xeb,0x95,0x55,0x5a,0xc2,0x79,0x91,0x3a,0xd9,0xf2,0x2c,0x73,0x9f,0x78,0x50,0xca,0x00,0x00,
+ 0x05,0x20,0x92,0x22,0x1f,0x8a,0x44,0x4c,0xd5,0xfb,0xda,0x3e,0x86,0x18,0x63,0x50,0x73,0x2c,0xfc,0x2b,0x0f,0xa3,0xe2,0x22,0xe4,0xf2,0xab,0x02,0x4e,0x84,0x3e,0x7a,0x3a,0x01,0x00,0x00,
+ 0x05,0x20,0x92,0x65,0xff,0x27,0xea,0x05,0x16,0xd7,0xad,0xfe,0xb2,0x65,0xd6,0xb9,0x52,0x38,0xdd,0x63,0x14,0x3f,0x17,0x9a,0xf6,0x32,0x6d,0x6c,0x10,0xc3,0x66,0xf7,0x89,0xf5,0x00,0x00,
+ 0x05,0x20,0x92,0xc9,0xb1,0x04,0x23,0x73,0x3d,0x15,0x34,0x5b,0x1c,0x61,0x30,0x58,0x53,0x7e,0x3d,0xbe,0xa0,0x40,0xe8,0xfa,0x62,0x45,0x29,0x18,0x0e,0x5c,0x31,0x4e,0x57,0x18,0x00,0x00,
+ 0x05,0x20,0x93,0x96,0x86,0xc8,0x64,0xb6,0x32,0x33,0x40,0x24,0xe5,0xe4,0xef,0x59,0x5d,0x47,0xa5,0x4e,0x18,0x56,0x04,0xbd,0x9b,0x8f,0x90,0xdb,0x99,0xc5,0xa6,0xa9,0xaf,0x34,0x00,0x00,
+ 0x05,0x20,0x93,0xda,0x29,0x12,0xda,0xc9,0xb0,0xd0,0x4f,0x15,0xaa,0xfa,0xc0,0xf2,0x74,0xc4,0x87,0xfd,0xba,0xec,0x06,0x66,0x14,0x59,0x2d,0x70,0x96,0x4c,0x5e,0x84,0xbe,0x29,0x00,0x00,
+ 0x05,0x20,0x94,0xd7,0x30,0x49,0x85,0xe0,0x7b,0xc9,0x46,0x29,0x0e,0xd8,0x5f,0x9d,0x33,0x4d,0x59,0x5a,0xb2,0x5a,0xf0,0x67,0x70,0x28,0x42,0x1c,0xd6,0xb3,0x45,0x9a,0x86,0x4d,0x00,0x00,
+ 0x05,0x20,0x95,0x3e,0x3e,0x05,0x14,0x8a,0x0e,0xac,0x47,0x70,0x21,0x01,0xf6,0x01,0x4a,0xbe,0x50,0xab,0xc7,0xb9,0x47,0x32,0xda,0xc7,0x07,0xd8,0x52,0x49,0x3d,0xef,0x29,0xef,0x00,0x00,
+ 0x05,0x20,0x96,0x01,0xec,0x0d,0x1c,0x47,0x87,0x25,0xe5,0x37,0x62,0xd7,0x43,0x4b,0xa6,0xc3,0xa4,0x6f,0xc5,0xf6,0xb1,0x4c,0x05,0xc7,0x27,0x1e,0xb9,0xf5,0x73,0x57,0x88,0x83,0x00,0x00,
+ 0x05,0x20,0x96,0x0f,0x72,0x1e,0xab,0xf4,0x68,0x15,0xdb,0xca,0xee,0x24,0xcc,0x8a,0x50,0x8e,0x47,0x26,0x8f,0xe4,0x84,0x43,0x60,0x2c,0xaa,0xa9,0xcc,0x51,0x09,0xf4,0xd3,0xa5,0x00,0x00,
+ 0x05,0x20,0x96,0x14,0x9b,0x6d,0x2d,0x0f,0xdb,0xe0,0xbb,0xbf,0xe5,0x9a,0xf4,0x02,0xe7,0x7e,0x9a,0xce,0x18,0x5e,0x38,0xb8,0x93,0xf2,0xbe,0x9c,0x64,0x17,0x85,0xd8,0x93,0x9c,0x00,0x00,
+ 0x05,0x20,0x96,0x61,0x5b,0x17,0x98,0xbb,0x61,0x57,0xbe,0x35,0xf5,0x33,0x75,0x37,0xf5,0x75,0xc0,0x1d,0x23,0xb6,0x21,0x81,0xf5,0x37,0xbe,0x74,0x69,0xa4,0x7a,0xcf,0xcd,0x27,0x00,0x00,
+ 0x05,0x20,0x9f,0x1a,0xe9,0xad,0x03,0xe0,0x48,0x9b,0x67,0x53,0xcd,0x04,0xfa,0x90,0x6d,0x51,0x29,0x25,0x11,0xaf,0x6d,0x3b,0x28,0x08,0x23,0x39,0xf6,0xb8,0x3a,0x88,0x34,0x2e,0x00,0x00,
+ 0x05,0x20,0x9f,0xbc,0x8c,0x21,0xab,0xa0,0x66,0x6e,0x65,0xa7,0x9e,0x81,0xe3,0x5a,0xc2,0xc2,0x0b,0x34,0xba,0x54,0x87,0xee,0x1a,0x47,0x86,0x29,0x14,0xa3,0xdb,0x0c,0xbb,0x86,0x00,0x00,
+ 0x05,0x20,0x98,0xfc,0x41,0x3a,0x3f,0x83,0xce,0x68,0xd3,0xbe,0xbc,0xf5,0x81,0xa0,0xfe,0x57,0xa6,0x04,0xee,0x75,0x7f,0xff,0x93,0xa1,0x8e,0x4f,0x35,0x3d,0xad,0xdd,0xa7,0xda,0x00,0x00,
+ 0x05,0x20,0x99,0x18,0x50,0x29,0xbb,0x47,0xec,0x0d,0x0c,0x8a,0x12,0xc2,0x6e,0x7e,0x4c,0xc0,0x4b,0xdd,0x3b,0x6a,0xc5,0xb8,0x26,0xe2,0xc2,0x64,0x4f,0x18,0x6c,0x60,0x4b,0x6c,0x00,0x00,
+ 0x05,0x20,0x99,0x26,0xe8,0x24,0x06,0x91,0x7e,0x57,0x91,0x20,0x4a,0x2c,0xce,0x45,0xd2,0x84,0x85,0x8e,0x9e,0x90,0x0e,0x7a,0x71,0x40,0xc5,0xa1,0xc1,0xd9,0x8c,0xad,0x5c,0x5b,0x00,0x00,
+ 0x05,0x20,0x99,0x79,0x37,0x64,0xfd,0xa3,0x64,0x6c,0x65,0xe3,0x93,0x22,0x31,0x3c,0x26,0x22,0xad,0xa0,0x1a,0x9f,0x9b,0xfa,0x9a,0xe0,0x4b,0xc8,0xa5,0xd5,0x26,0x83,0xb5,0x9e,0x00,0x00,
+ 0x05,0x20,0x9a,0x4a,0x37,0xf9,0x84,0x5e,0xed,0x91,0xbe,0xea,0x38,0x70,0x78,0xb0,0xb1,0x38,0x3e,0x62,0x2a,0xbb,0x31,0x8e,0x05,0xb6,0xe4,0xcc,0x59,0x56,0x9f,0x1a,0x68,0xa2,0x00,0x00,
+ 0x05,0x20,0x9b,0x05,0xde,0x44,0xe9,0xf6,0x2e,0xd2,0x64,0x86,0xf4,0x5d,0x53,0x4d,0x58,0x1f,0xd5,0x65,0x91,0x0d,0x0f,0xc4,0x9e,0x62,0x63,0x04,0xec,0x71,0x91,0x7c,0xac,0xad,0x00,0x00,
+ 0x05,0x20,0x9b,0xf1,0x2f,0x96,0xdf,0xd8,0x58,0x65,0xb5,0x33,0x44,0xee,0x40,0xbe,0x26,0xbc,0xce,0x6f,0x12,0xdc,0x33,0x4e,0xfe,0xf2,0x82,0xd6,0xc4,0xd2,0x10,0xbf,0x92,0x35,0x00,0x00,
+ 0x05,0x20,0x9c,0x68,0x2a,0xac,0x16,0x7d,0x0b,0x19,0x65,0x58,0xe6,0x72,0x73,0xde,0x63,0x1b,0x4e,0x87,0x71,0x8d,0x80,0x2d,0x91,0x73,0xed,0xfa,0x90,0xaf,0x23,0x9c,0xe3,0x35,0x00,0x00,
+ 0x05,0x20,0x9d,0x19,0x58,0x72,0xaf,0x06,0xbb,0x9e,0xe7,0x8f,0x3c,0x97,0xa7,0x0e,0x26,0x95,0xa6,0x5d,0xac,0xe0,0xc4,0x4b,0x38,0x48,0x67,0xa9,0x13,0x9c,0xbf,0xf8,0xd6,0x56,0x00,0x00,
+ 0x05,0x20,0x9d,0x77,0x7e,0x28,0x63,0x0d,0x3f,0xdd,0xcd,0xab,0x31,0xcc,0x7d,0xce,0xee,0x33,0xf5,0xe9,0xaf,0x03,0x9f,0x3f,0x15,0xf6,0x42,0xbf,0xc8,0xeb,0x99,0xae,0x11,0x78,0x00,0x00,
+ 0x05,0x20,0x9d,0xac,0x96,0x06,0xb1,0x11,0x54,0xbf,0xcb,0x67,0x3f,0x3f,0xb4,0xd9,0x97,0x1e,0x25,0xac,0xdd,0xda,0x76,0x56,0x54,0x56,0x49,0xa8,0x4f,0xa5,0x38,0x2b,0xdd,0x65,0x00,0x00,
+ 0x05,0x20,0x9d,0xff,0xd9,0xf4,0x45,0x78,0xbb,0x49,0x31,0x0f,0x20,0xd8,0xde,0xdb,0xf2,0xbb,0x58,0x47,0x15,0xcb,0xbe,0x15,0xb9,0x44,0x52,0x1f,0x31,0x47,0xa9,0x46,0x95,0x3b,0x00,0x00,
+ 0x05,0x20,0x9d,0xd9,0x15,0x05,0x09,0xa3,0x0d,0x71,0x9e,0x3b,0xe9,0x83,0x88,0x48,0x45,0x0f,0x01,0xbc,0x7d,0x61,0x8a,0xf4,0x30,0x69,0xb8,0x84,0x47,0x34,0x2e,0x0f,0x27,0x7c,0x00,0x00,
+ 0x05,0x20,0xa7,0x08,0xd8,0x1d,0x0b,0x07,0xde,0xab,0x06,0xd4,0xc1,0x42,0x51,0xef,0xd0,0x5a,0xc3,0x8a,0xff,0x1b,0x7f,0x1a,0x45,0xdc,0x8a,0x89,0x76,0x54,0x65,0xfc,0x3c,0xf2,0x00,0x00,
+ 0x05,0x20,0xa7,0xb7,0xde,0x7f,0xf4,0xbc,0x25,0xfc,0xf2,0x95,0xb5,0xf5,0xae,0x53,0xce,0x4b,0x76,0x2d,0x92,0xc2,0x0f,0xbc,0x5d,0xa7,0xf0,0x58,0x73,0x0c,0x46,0x24,0xad,0xd2,0x00,0x00,
+ 0x05,0x20,0xa0,0x38,0x51,0x80,0x99,0xf9,0x0a,0xdf,0xf3,0x08,0xad,0x57,0x83,0x6a,0x0e,0x74,0x85,0x09,0x2a,0xa8,0xa3,0xab,0x83,0x22,0x89,0x31,0xf6,0x9c,0x37,0xcf,0x28,0x18,0x00,0x00,
+ 0x05,0x20,0xa0,0x8c,0x2d,0xb8,0x4f,0x88,0x90,0x4c,0x25,0x3b,0x52,0x57,0x89,0x03,0xb8,0xd6,0x32,0x52,0x2a,0xb3,0x7b,0x08,0x6e,0x7a,0x7c,0x3c,0xeb,0x54,0x00,0x93,0xe9,0x2b,0x00,0x00,
+ 0x05,0x20,0xa0,0xb3,0x9d,0x6b,0x08,0x16,0x69,0x81,0xb5,0xd0,0x18,0xe3,0x80,0x23,0xdd,0xef,0x3e,0x05,0xf1,0x42,0xd6,0xc9,0x5f,0xd3,0xc2,0x61,0x92,0x36,0xda,0xf0,0xb0,0x9a,0x00,0x00,
+ 0x05,0x20,0xa1,0x38,0x9e,0x1d,0x56,0xf0,0xf1,0xc0,0xc2,0xfd,0x5f,0x0d,0x69,0x75,0x43,0x91,0x21,0x37,0x6b,0x1e,0xc5,0xc2,0x01,0x9f,0x7a,0xc2,0x1f,0x61,0x62,0xd2,0x2f,0x1e,0x00,0x00,
+ 0x05,0x20,0xa1,0x0c,0xbe,0x81,0x1d,0xae,0x86,0x3c,0x94,0x90,0xf1,0x06,0x0f,0xab,0x74,0x5e,0xbb,0xc2,0x08,0x38,0x4a,0x7a,0xb8,0x2c,0x53,0xfb,0x65,0x15,0xa5,0x37,0x54,0x8e,0x00,0x00,
+ 0x05,0x20,0xa1,0x7d,0xa4,0xd4,0x3d,0xf1,0x98,0x7c,0x96,0xb8,0xe4,0x37,0x18,0xc5,0x0f,0xb6,0xcc,0x0d,0x19,0xe4,0xa4,0xdf,0xec,0xe1,0xeb,0x29,0x22,0x2e,0x52,0x9f,0x4e,0x90,0x00,0x00,
+ 0x05,0x20,0xa1,0xd4,0x58,0xba,0x50,0x16,0xa9,0x01,0x66,0xc2,0x54,0xc2,0x1f,0xd1,0xf2,0xe8,0x7b,0x3d,0x51,0xff,0xc1,0xd8,0x81,0x47,0x11,0xcc,0x14,0xd5,0x27,0x7b,0xe4,0x5b,0x00,0x00,
+ 0x05,0x20,0xa2,0x42,0xbf,0x4b,0x0f,0xe1,0xff,0x63,0x84,0xcc,0x81,0x43,0x23,0xad,0xbf,0xbd,0x59,0x24,0x3a,0x29,0x87,0x6e,0x9d,0x76,0xd5,0x5f,0xac,0xf1,0x61,0x81,0xb5,0x81,0x00,0x00,
+ 0x05,0x20,0xa2,0x4d,0xe0,0xf0,0x58,0xb9,0xd1,0xd7,0x97,0x8f,0xa5,0xab,0x6a,0x3e,0x91,0xda,0x06,0x36,0x6b,0x74,0x40,0x40,0xf4,0x19,0xf6,0x5f,0x03,0x29,0xd5,0x73,0xe0,0xaa,0x00,0x00,
+ 0x05,0x20,0xa2,0xec,0x7a,0xc1,0x85,0x22,0x3d,0x9a,0xdd,0xb4,0x92,0xfb,0x88,0x61,0x37,0x30,0x7c,0x2b,0xba,0xee,0x28,0x34,0x43,0x3f,0xa4,0x15,0x62,0xfe,0x9e,0xef,0x64,0x23,0x00,0x00,
+ 0x05,0x20,0xa3,0x16,0x15,0x59,0xec,0xdf,0x46,0xf7,0xfb,0xc6,0x35,0xe7,0xad,0xcc,0x79,0x94,0x0f,0xb9,0xe8,0x0d,0x10,0xf1,0x13,0x03,0xad,0xba,0x06,0xdd,0x2d,0xaa,0x19,0xaf,0x00,0x00,
+ 0x05,0x20,0xa3,0x47,0x9a,0x16,0x49,0x20,0x79,0x05,0x97,0xf8,0xea,0xd6,0x7e,0xfa,0x69,0x47,0xb2,0xb3,0xce,0x47,0x5c,0xb0,0x79,0xf3,0x09,0x1c,0x81,0xa5,0x70,0x18,0xbf,0xeb,0x00,0x00,
+ 0x05,0x20,0xa3,0xc5,0x61,0x3c,0xf4,0x7e,0xc8,0xe4,0x43,0x8e,0x80,0x90,0xd3,0x76,0x2f,0x5a,0x84,0xbf,0x71,0x64,0x33,0x6b,0xed,0xc6,0xf7,0x8e,0xab,0xaf,0x02,0x7e,0x46,0xcf,0x00,0x00,
+ 0x05,0x20,0xa4,0x0a,0xf8,0xf0,0x7c,0xa8,0x83,0x2f,0xb4,0x7d,0x5f,0x5d,0xc9,0x6d,0x99,0x5e,0xc6,0xf9,0x82,0x42,0x31,0x24,0x54,0x44,0xb4,0xa1,0xeb,0x40,0x0f,0x23,0x6e,0xbc,0x00,0x00,
+ 0x05,0x20,0xa5,0x79,0xc6,0x25,0xd0,0x8a,0x76,0xcd,0x9b,0x39,0xed,0xae,0xb6,0xcb,0x33,0xeb,0xea,0x65,0x6d,0x10,0x58,0xb6,0xf6,0x40,0xa4,0xf5,0x1b,0xe3,0x5c,0x18,0x96,0x85,0x00,0x00,
+ 0x05,0x20,0xa6,0x02,0xe4,0xfb,0x4a,0x64,0x75,0x02,0x6d,0xec,0x07,0xd6,0x44,0xf3,0x56,0x30,0xae,0xad,0x23,0xc9,0xcc,0xd0,0xc5,0x5b,0x83,0x20,0x7f,0x82,0xf7,0xae,0x67,0xc2,0x00,0x00,
+ 0x05,0x20,0xaf,0xde,0xd1,0x52,0x17,0x5b,0x8b,0x66,0x1e,0xe8,0xd4,0x48,0x10,0xde,0xa9,0x8e,0xc5,0x01,0x8f,0x24,0xb0,0x73,0x73,0x49,0x92,0xcf,0x7e,0x8e,0xc6,0x49,0xe6,0x48,0x00,0x00,
+ 0x05,0x20,0xa8,0x2a,0xf7,0x12,0xb3,0x77,0x3a,0x3a,0xf6,0x4f,0x1f,0x05,0x25,0x6e,0x93,0xd8,0x0a,0x4e,0x89,0x63,0x9e,0x6a,0xe1,0x12,0x88,0x45,0xf8,0x86,0x99,0x85,0x3d,0xd6,0x00,0x00,
+ 0x05,0x20,0xa8,0x95,0x26,0xe2,0x98,0xb6,0xd1,0xe3,0x96,0xa8,0x70,0x7b,0x8c,0xbb,0x0d,0x87,0xdc,0xab,0xa3,0xdf,0xf8,0x6d,0xfd,0x6b,0x9a,0xfe,0xca,0x93,0xc9,0x5a,0x51,0xa2,0x00,0x00,
+ 0x05,0x20,0xaa,0xb3,0xfd,0x21,0x0c,0x24,0xad,0xe5,0x2d,0xb4,0x8d,0x12,0x9c,0x3b,0x00,0x79,0xcd,0x72,0xa7,0xfc,0xb1,0xbe,0x74,0xd1,0x18,0x8e,0xd2,0x78,0x53,0xe5,0x76,0xe3,0x00,0x00,
+ 0x05,0x20,0xaa,0xde,0xa9,0xd2,0x09,0x53,0x97,0xdc,0x56,0xa9,0x4c,0xc0,0xc5,0x87,0xaa,0xec,0xf5,0x8b,0x46,0x52,0xc6,0x9a,0x8a,0x81,0xa2,0x6e,0xc9,0x1e,0x61,0x8d,0xc5,0xd1,0x00,0x00,
+ 0x05,0x20,0xab,0xb5,0xa7,0x6b,0x38,0xf1,0x83,0xc6,0xc9,0x82,0x99,0x08,0xb7,0xe1,0xc0,0xe2,0x8e,0x7d,0x9d,0xc6,0x71,0x36,0x99,0x19,0x12,0xf6,0x0c,0xbc,0x46,0x77,0xca,0xdd,0x00,0x00,
+ 0x05,0x20,0xac,0x3b,0x53,0xf3,0xa3,0x41,0xf3,0x4b,0xa8,0xd5,0xa7,0x56,0x4f,0x30,0x14,0xa8,0xd6,0xc5,0x6d,0xe9,0xc9,0x5c,0x16,0x8a,0xa0,0x22,0xe8,0xcb,0x17,0xbe,0x1f,0x2d,0x00,0x00,
+ 0x05,0x20,0xac,0x27,0xad,0x5f,0x8d,0x69,0x56,0xc0,0x99,0x13,0x49,0xc8,0xd2,0x80,0xd9,0x3a,0x99,0x02,0x28,0x29,0x72,0x19,0xea,0xdd,0x2c,0x06,0x04,0xee,0x12,0xc3,0x6d,0xe5,0x00,0x00,
+ 0x05,0x20,0xac,0x40,0xdd,0x3c,0x9a,0xf4,0x53,0x4d,0x05,0xcb,0xf0,0xd6,0xb8,0x9d,0x86,0x8d,0x07,0xe2,0x52,0x6c,0x3f,0x91,0xa1,0xba,0x6b,0xaf,0x0c,0xd5,0x6f,0x14,0x56,0xb1,0x00,0x00,
+ 0x05,0x20,0xad,0x20,0xaf,0xf9,0x35,0xb9,0x55,0xde,0x85,0x4e,0xac,0x04,0xc6,0x2a,0xb8,0x13,0x1a,0x32,0x13,0xe9,0xdc,0xe9,0x5f,0x93,0x23,0x0e,0xa4,0xb8,0x95,0xe9,0xc5,0x5c,0x00,0x00,
+ 0x05,0x20,0xad,0x22,0x4b,0x2e,0x78,0xc5,0x1d,0xf9,0x7a,0xf9,0x6a,0x7f,0x41,0xa6,0x6e,0x82,0xc4,0xcf,0x75,0x5f,0xc8,0x4b,0xa4,0x8d,0x34,0x0a,0xc4,0xc4,0x50,0x8e,0x08,0x29,0x00,0x00,
+ 0x05,0x20,0xae,0x6b,0x3e,0x0c,0x6a,0x76,0x7f,0x21,0x25,0x89,0xcd,0x38,0x3a,0x81,0xaa,0x8a,0xaf,0x7d,0x86,0x53,0x2c,0x93,0x44,0x08,0x9e,0xe7,0xbc,0x15,0x92,0x84,0x32,0x65,0x00,0x00,
+ 0x05,0x20,0xb6,0xbb,0x09,0xb6,0x9d,0xcb,0xbb,0x2e,0x10,0x59,0x72,0x10,0x3c,0x5d,0x38,0xbe,0x8d,0x6f,0x69,0xa8,0x98,0x08,0xad,0xd1,0xd3,0x00,0x2c,0x08,0xd4,0x69,0xdf,0x46,0x00,0x00,
+ 0x05,0x20,0xb6,0x98,0x60,0x64,0x1f,0xe8,0x19,0x1a,0x95,0xc2,0x5f,0xed,0x3f,0x57,0xe4,0x43,0x1f,0x15,0x82,0x54,0x4e,0xc2,0x8e,0x5c,0x99,0x1c,0x75,0x6c,0x40,0xea,0xbe,0x6d,0x00,0x00,
+ 0x05,0x20,0xb6,0xa9,0x1a,0x58,0x25,0x83,0x29,0x17,0x27,0x92,0xd2,0x9c,0xd0,0xfd,0x22,0x9c,0x07,0xf6,0x4f,0x9f,0xc4,0x2d,0x23,0x1b,0x1e,0xe9,0xc9,0xf2,0xd4,0xb1,0x91,0xac,0x00,0x00,
+ 0x05,0x20,0xb6,0xcf,0x88,0x35,0x74,0x20,0x79,0x8a,0xf5,0x6a,0xca,0x77,0x65,0xb6,0x29,0x7f,0xcb,0x97,0xdd,0xa8,0x37,0xaf,0xe6,0x6e,0xdd,0x1d,0x34,0xf9,0x95,0x22,0x66,0x93,0x00,0x00,
+ 0x05,0x20,0xb6,0xe3,0xd3,0xc6,0xb8,0x0e,0x9e,0xf4,0x5a,0x8b,0xb7,0x65,0xa8,0xf6,0xd6,0x45,0x7d,0x7e,0xde,0xa8,0x8b,0xcb,0x31,0xd0,0xd5,0x9d,0x41,0x19,0xa8,0x88,0x2c,0x83,0x00,0x00,
+ 0x05,0x20,0xb7,0x33,0x86,0x25,0x90,0xf9,0x6e,0xf2,0x0b,0x02,0xf0,0x76,0xf9,0x08,0x12,0x48,0x51,0xb5,0x27,0x86,0x31,0x68,0x20,0xfc,0xc7,0xe5,0x9c,0x4c,0x09,0xa9,0x95,0xd8,0x00,0x00,
+ 0x05,0x20,0xb0,0x04,0x52,0x59,0x1e,0x21,0xd8,0x5b,0xd4,0xb3,0xbc,0x19,0x10,0x08,0xa7,0xfc,0x89,0xa9,0xfd,0xd9,0x5f,0xb5,0x4e,0x1e,0x54,0xc0,0xf8,0x2e,0xdc,0xb9,0xa0,0x13,0x00,0x00,
+ 0x05,0x20,0xb1,0x04,0xad,0x10,0xac,0x24,0x86,0x4b,0x10,0xa7,0x18,0xe8,0x1d,0xf5,0xcf,0x92,0xb3,0x6e,0xf6,0x67,0xa0,0x6b,0x01,0x24,0xa0,0x0b,0x59,0x40,0x1f,0x34,0x5c,0xbc,0x00,0x00,
+ 0x05,0x20,0xb1,0x63,0x56,0x80,0x90,0x00,0xfd,0x92,0x54,0xab,0xc3,0x09,0xef,0x37,0x6f,0xff,0xc3,0xc0,0x5f,0x0c,0x6a,0x37,0xb2,0xd3,0x9a,0x09,0xe4,0x02,0x23,0xc2,0x64,0x5e,0x00,0x00,
+ 0x05,0x20,0xb2,0xf7,0xeb,0x70,0x68,0x10,0x1d,0x50,0x2e,0xbe,0xb7,0x2a,0x84,0xb7,0x69,0xb5,0xa5,0xeb,0x52,0x3b,0xed,0x5a,0xb3,0xa0,0x7d,0x8f,0xfc,0x70,0x2f,0x4e,0xa7,0x71,0x00,0x00,
+ 0x05,0x20,0xb3,0x85,0xed,0x8a,0x80,0xb5,0x2f,0xbd,0xe4,0xda,0x13,0xba,0x54,0x0e,0x76,0xd8,0x16,0x58,0x14,0x5b,0x63,0xab,0xb0,0xa5,0x5e,0xea,0x1f,0xc3,0x13,0x83,0xcf,0x09,0x00,0x00,
+ 0x05,0x20,0xb3,0xc1,0x4d,0xdc,0xcf,0x54,0x7f,0xa8,0xeb,0x12,0x08,0x1a,0x72,0x4f,0xff,0xb9,0xe6,0x0b,0x33,0xac,0x8b,0x3c,0x0f,0x32,0xa9,0x6d,0x78,0xe8,0x71,0x58,0x7d,0xea,0x00,0x00,
+ 0x05,0x20,0xb4,0x82,0x5e,0xcd,0xee,0xf9,0x05,0x20,0x16,0x92,0x2a,0xf1,0x86,0x7f,0x4a,0xf4,0xc3,0x81,0x2c,0xd5,0x80,0x2b,0xdf,0x40,0x05,0xae,0x05,0xc4,0xee,0x4f,0xc8,0xdd,0x00,0x00,
+ 0x05,0x20,0xb4,0xca,0x40,0x86,0xcc,0x95,0xdd,0x8b,0x53,0xcd,0xb7,0x44,0xeb,0x2e,0xf0,0x3c,0xdc,0xab,0xc6,0xe5,0x9d,0x49,0xac,0x90,0x9e,0x2a,0xeb,0x17,0xc0,0xdc,0x4f,0x98,0x00,0x00,
+ 0x05,0x20,0xb5,0x10,0xa2,0xd9,0x44,0xbc,0xfc,0xb0,0xaf,0xd4,0x89,0xdd,0x89,0x47,0x40,0x08,0xb0,0x52,0xf5,0x6a,0x66,0x9c,0x98,0xf9,0x85,0x23,0x61,0x0d,0x75,0xb9,0x5a,0xe9,0x00,0x00,
+ 0x05,0x20,0xb5,0x83,0x6f,0xb6,0x11,0xd8,0x0e,0xa8,0x57,0xda,0x15,0x20,0x5b,0x1a,0x6d,0x21,0x15,0x5a,0xbd,0xb4,0x17,0x11,0xc2,0xfb,0x0e,0xfc,0xde,0xe8,0x26,0x56,0xa8,0xac,0x00,0x00,
+ 0x05,0x20,0xb5,0xad,0x1b,0xfc,0xbb,0xa4,0x59,0xc3,0x68,0x3d,0xae,0xe3,0x31,0x5c,0x48,0x48,0xc8,0x54,0xa2,0x24,0xc4,0x30,0x25,0xf8,0x62,0x76,0x00,0xff,0x54,0x15,0xd4,0xa0,0x00,0x00,
+ 0x05,0x20,0xb6,0x35,0x41,0xa9,0x66,0xc0,0xcf,0xf4,0x29,0xad,0x29,0x43,0x9a,0xac,0x6e,0x45,0xa4,0x29,0xf8,0x78,0xdb,0xbe,0x54,0x8a,0x49,0x10,0xd2,0xe8,0x70,0x3e,0xed,0x4e,0x00,0x00,
+ 0x05,0x20,0xb6,0x16,0xe1,0x81,0x6b,0x5f,0x82,0x3d,0xaf,0x75,0x49,0x41,0x95,0xd5,0x93,0x96,0x18,0x66,0xf4,0x2e,0x50,0xed,0x81,0xb0,0x39,0x7f,0x5a,0x2b,0x5b,0x7d,0x4b,0xe4,0x00,0x00,
+ 0x05,0x20,0xbe,0xd8,0x00,0xb0,0xd7,0xde,0x8e,0xb4,0x86,0xfc,0xf5,0xe0,0x97,0x04,0xfe,0x5e,0xe7,0x58,0xc5,0x03,0x6d,0xcd,0x15,0x83,0x90,0xfc,0xb4,0x13,0x29,0x5e,0xd8,0x20,0x00,0x00,
+ 0x05,0x20,0xb8,0x24,0x4b,0x3d,0x10,0x7e,0x4f,0x83,0x1a,0xf6,0x90,0x12,0xc6,0xaa,0x2f,0x7a,0x34,0xec,0xb0,0x0f,0x85,0x7d,0xef,0xef,0x34,0xa6,0x18,0xea,0x12,0x1e,0xfc,0xd6,0x00,0x00,
+ 0x05,0x20,0xb8,0x5a,0xbd,0x49,0x91,0xff,0xfe,0x18,0x28,0xab,0xb0,0x73,0x29,0xd2,0xcc,0x5d,0x69,0xf2,0x55,0x77,0x5f,0x18,0x4d,0xe1,0xaf,0x38,0xa5,0xb2,0x7f,0x51,0x59,0xba,0x00,0x00,
+ 0x05,0x20,0xb9,0x79,0x74,0x9d,0x11,0xc6,0xef,0xdf,0x9a,0x5f,0xdd,0xce,0x22,0xca,0xd4,0x59,0x8d,0x90,0x64,0xae,0xa4,0xb2,0xa0,0x9b,0xb4,0x77,0xdc,0x05,0x0b,0xe2,0xa6,0xdd,0x00,0x00,
+ 0x05,0x20,0xb9,0x71,0x92,0xd0,0xce,0xdc,0x26,0x57,0xc3,0x72,0xee,0x44,0x20,0x86,0x11,0xb9,0x54,0x6c,0x6e,0x73,0x5c,0x0f,0x9f,0x4f,0xce,0xab,0x26,0x68,0xca,0x98,0x11,0x3f,0x00,0x00,
+ 0x05,0x20,0xb9,0xf2,0xeb,0x82,0x4a,0x04,0x4f,0x4e,0xde,0x40,0xf4,0x81,0x3f,0xa8,0x37,0x78,0x89,0xe9,0xae,0xa2,0xd5,0x8b,0x0f,0x21,0x83,0x61,0x60,0x6b,0x04,0x38,0x86,0x1f,0x00,0x00,
+ 0x05,0x20,0xba,0x67,0x18,0xbc,0x23,0x77,0x47,0x58,0x27,0x32,0x8f,0xc6,0x77,0x61,0x2e,0x14,0x62,0xb4,0x95,0x54,0x9b,0xb1,0x16,0x0b,0x00,0x49,0x72,0x17,0xbb,0x2b,0xc4,0xe4,0x00,0x00,
+ 0x05,0x20,0xbb,0x43,0xb7,0xde,0x6c,0x02,0x3c,0xe2,0x84,0x11,0xc0,0x84,0xbb,0x5a,0x84,0x00,0x22,0xde,0x47,0x79,0x9e,0xf2,0x65,0x10,0x8f,0x77,0x1e,0x66,0x4a,0xd0,0xa9,0x45,0x00,0x00,
+ 0x05,0x20,0xbb,0x51,0x5c,0xfe,0xde,0xc1,0xd2,0x7a,0xc6,0xb8,0x9d,0x1e,0x5e,0x0f,0xe4,0x1e,0x06,0xd2,0xd7,0x2c,0x2b,0xe1,0x5f,0x34,0x67,0xb9,0x44,0xf5,0x0b,0x3c,0xf6,0x04,0x00,0x00,
+ 0x05,0x20,0xbb,0x8a,0x02,0x1e,0x26,0xdb,0xe6,0x9c,0x0c,0xc6,0x5e,0x32,0xab,0x6f,0xc2,0xba,0x3c,0x23,0x38,0xca,0x1c,0xff,0x81,0x71,0x6c,0x0b,0x4d,0xea,0xbd,0xae,0x21,0xaf,0x00,0x00,
+ 0x05,0x20,0xbc,0xee,0x7e,0x5a,0x6c,0x0a,0x57,0x2f,0xfa,0xd7,0x69,0x0e,0x4e,0xfc,0x93,0xa0,0x69,0x0a,0xc8,0x68,0xa3,0x6c,0x6a,0x93,0xca,0xb2,0x67,0xc0,0x0a,0xd2,0xb3,0x53,0x00,0x00,
+ 0x05,0x20,0xbd,0x11,0x5a,0xb5,0xe2,0x4e,0xa2,0x79,0x5d,0x8a,0xc6,0x13,0x96,0x62,0x1e,0x07,0xcd,0x63,0x52,0x4d,0x85,0x86,0xa5,0x99,0x0c,0x03,0x2a,0xac,0xd3,0xf1,0x6b,0x59,0x00,0x00,
+ 0x05,0x20,0xbd,0x47,0x03,0x4e,0x69,0x75,0x76,0x9c,0x99,0x8a,0x26,0xdd,0x67,0x17,0x98,0xf6,0xd3,0x64,0x4e,0xf3,0x0d,0xca,0xb9,0x3e,0xef,0xf9,0xa0,0x5e,0x4f,0x55,0x70,0x6b,0x00,0x00,
+ 0x05,0x20,0xbd,0x5f,0x90,0x40,0xb3,0x59,0x6f,0xa2,0x4e,0x18,0x97,0xf7,0xb6,0x34,0x6c,0xfa,0x63,0xb5,0xe9,0x3b,0x41,0x77,0x69,0x28,0xab,0x4e,0x40,0xeb,0x76,0x5c,0x8c,0x4b,0x00,0x00,
+ 0x05,0x20,0xbe,0x55,0x60,0xbe,0xea,0x46,0xdf,0x19,0x45,0x98,0x5c,0x53,0x9c,0x1b,0xb9,0xd8,0x14,0x99,0xd6,0xdc,0x45,0x3b,0x93,0x92,0xac,0xcf,0x40,0x41,0x98,0x3a,0x6b,0x7b,0x00,0x00,
+ 0x05,0x20,0xc6,0xdc,0x21,0x2f,0xb1,0x80,0xb4,0xcc,0xfb,0x84,0x95,0x3a,0xc8,0x65,0xd8,0x2e,0x56,0x1b,0xb9,0xff,0x9c,0xe6,0x5d,0x07,0x66,0xc5,0xd3,0x49,0x4f,0xbf,0x9d,0xcb,0x00,0x00,
+ 0x05,0x20,0xc7,0x3b,0x73,0xc1,0x41,0xe6,0xda,0x27,0x28,0xb6,0x3c,0x99,0x1e,0x67,0xc5,0xb6,0x15,0x44,0x4f,0xce,0xdb,0xf4,0xa0,0xc9,0xdb,0x23,0x2b,0xf9,0x4d,0xe8,0xb5,0x9d,0x00,0x00,
+ 0x05,0x20,0xc7,0xc4,0x03,0x80,0x5b,0xb6,0x0f,0xe5,0x5e,0x81,0xb2,0x15,0x88,0xb8,0x24,0xe7,0x82,0xce,0x9c,0xe4,0xe3,0xab,0x76,0xf0,0x97,0xf6,0x4b,0xa7,0x25,0x4a,0x05,0xa3,0x00,0x00,
+ 0x05,0x20,0xc7,0xca,0xb2,0xa9,0x11,0x63,0x43,0x9c,0xd6,0xc9,0xc1,0x78,0xbe,0xbc,0xc4,0x86,0x52,0x6b,0xc7,0x67,0xd0,0xe5,0xed,0xac,0x5f,0x52,0xef,0xc0,0xe1,0x0d,0x23,0xad,0x00,0x00,
+ 0x05,0x20,0xc0,0x46,0x77,0xc8,0xcc,0x9d,0xb8,0x42,0x5a,0x24,0x77,0xd5,0x2b,0x09,0x66,0x25,0xc7,0x99,0xe5,0x5b,0xd0,0x3b,0x7e,0x3c,0x31,0xed,0xa5,0xe6,0xb3,0x9a,0x33,0xdd,0x00,0x00,
+ 0x05,0x20,0xc0,0x9b,0x34,0x23,0x0f,0x5a,0xc2,0xec,0x3f,0x68,0x52,0xfc,0xd4,0xa7,0x1c,0xf9,0xae,0xa2,0xe0,0x55,0xb0,0xaa,0xc0,0xe1,0x0a,0x91,0xda,0x9b,0xed,0x7a,0x0d,0x6a,0x00,0x00,
+ 0x05,0x20,0xc1,0x19,0x15,0x62,0x0c,0x4e,0x6d,0x66,0xeb,0x00,0x94,0xf4,0x60,0x78,0x62,0x6c,0x9d,0x56,0xde,0xc8,0x7e,0xa2,0x97,0xa0,0x7d,0xf1,0xa2,0x33,0x7d,0x13,0xa1,0x9e,0x00,0x00,
+ 0x05,0x20,0xc1,0x74,0xdc,0x68,0x6e,0xce,0xa0,0x88,0x9a,0xcb,0xc8,0xbc,0x62,0x05,0x5e,0x22,0x0b,0x0a,0xe4,0x8e,0xc8,0x89,0x28,0x91,0x84,0xfd,0x3f,0xea,0x30,0xac,0xa8,0x38,0x00,0x00,
+ 0x05,0x20,0xc2,0x77,0x5d,0xb8,0x46,0x58,0xda,0x01,0x2a,0xef,0x9c,0x92,0xcb,0x02,0x40,0xe5,0xf3,0x74,0xed,0x13,0xf4,0x67,0x43,0xb1,0x6f,0xbd,0x6c,0xb8,0x75,0x4c,0xc6,0x27,0x00,0x00,
+ 0x05,0x20,0xc2,0xab,0xed,0x45,0x15,0x5d,0xe9,0x18,0x6a,0xca,0x20,0x80,0x6c,0xcb,0xfe,0x9d,0x16,0x57,0x47,0xfe,0xe8,0xb5,0xbf,0x86,0x49,0x6f,0xd3,0x3e,0x73,0x7e,0x53,0x75,0x00,0x00,
+ 0x05,0x20,0xc2,0xf5,0x8d,0xc3,0x8a,0xf6,0xc7,0xc0,0x7e,0x75,0x82,0x58,0x19,0xc3,0x54,0xc6,0x59,0x14,0xc0,0xcd,0x3a,0xfb,0x70,0x4c,0x40,0x62,0x48,0xdf,0x14,0x00,0xbc,0x5d,0x00,0x00,
+ 0x05,0x20,0xc2,0xd7,0x58,0x2b,0x54,0x9a,0x19,0x74,0xcd,0xd8,0xca,0xbe,0xbd,0x72,0x5c,0x6f,0x65,0x07,0xf4,0x61,0x6f,0x6b,0x69,0x06,0x7b,0x36,0xc6,0x3f,0x1f,0x83,0xbc,0x89,0x00,0x00,
+ 0x05,0x20,0xc2,0xee,0x88,0x4c,0x60,0xec,0x36,0x87,0x2d,0x18,0x29,0x78,0x29,0x5b,0x2b,0xc7,0x03,0x50,0x80,0x00,0x0b,0xd0,0x2f,0x08,0xf1,0x12,0xec,0x95,0x4f,0x7b,0x98,0xc1,0x00,0x00,
+ 0x05,0x20,0xc3,0x86,0xde,0xea,0x07,0xb7,0x2b,0xd0,0x38,0x0e,0x81,0x65,0x46,0xd4,0xa4,0x10,0x42,0xbf,0x0b,0x0a,0xea,0x78,0x08,0x69,0xe5,0x67,0x1d,0x3a,0x7b,0x70,0x5b,0xfc,0x00,0x00,
+ 0x05,0x20,0xc3,0x9e,0x7a,0x68,0xb9,0x2d,0x97,0x2f,0x0d,0x8f,0x69,0xf1,0xb3,0xe5,0xe5,0x21,0x73,0xb9,0x51,0xb4,0xf6,0xc3,0x3e,0xb9,0x1b,0xcd,0xfd,0x6c,0x14,0xe4,0x03,0xa9,0x00,0x00,
+ 0x05,0x20,0xc3,0xa4,0xd4,0xcb,0xa7,0x43,0x66,0xa0,0xa6,0x36,0xc4,0x6a,0x19,0x79,0x98,0x16,0xb2,0x3f,0x99,0xe5,0x94,0x4d,0xf9,0xfc,0x2f,0x8b,0x67,0x6c,0x21,0x70,0x69,0x5b,0x00,0x00,
+ 0x05,0x20,0xc3,0xc7,0x1a,0x37,0xf6,0xb8,0x76,0x03,0xf6,0x2f,0xf8,0xb0,0x26,0xa3,0x26,0xf1,0xda,0xa1,0xd1,0x0e,0x80,0x05,0xf7,0xff,0xab,0x52,0xe5,0x3a,0x0b,0x2e,0x42,0x53,0x00,0x00,
+ 0x05,0x20,0xc3,0xce,0xcc,0x7a,0xdb,0x66,0x31,0x8d,0x81,0x9d,0x05,0x86,0xa9,0x17,0x07,0x0b,0x18,0xb2,0x41,0x81,0x5c,0x69,0xb7,0x95,0xc0,0x49,0xd2,0x34,0x2d,0x53,0xb0,0xc4,0x00,0x00,
+ 0x05,0x20,0xc5,0x95,0x18,0x87,0x19,0xb1,0x85,0xd0,0xe9,0x74,0x0f,0x11,0xdc,0xf5,0x16,0x99,0x06,0x5c,0xe8,0x38,0x31,0xcf,0xfe,0xee,0xb9,0x5c,0x78,0xbb,0xc9,0x56,0x8c,0x9b,0x00,0x00,
+ 0x05,0x20,0xc5,0xfc,0x63,0xc0,0xe9,0xf8,0xbb,0x0d,0x8c,0xac,0xb4,0xd8,0xf3,0x73,0xc3,0x85,0x10,0x24,0x18,0x06,0x6d,0x8f,0x6f,0x02,0xdb,0x35,0x32,0x83,0x73,0x11,0x1d,0xa6,0x00,0x00,
+ 0x05,0x20,0xce,0x93,0x84,0x27,0x52,0x78,0xc5,0x64,0xc2,0x05,0xcf,0xa6,0x77,0x83,0x80,0xf0,0x5f,0xc5,0xe0,0xda,0x48,0x41,0x05,0x35,0x08,0xc6,0x07,0xc3,0xb8,0x41,0x5d,0x8d,0x00,0x00,
+ 0x05,0x20,0xce,0xf8,0xfb,0x76,0x6b,0x75,0xac,0x8d,0x99,0xe9,0xde,0x04,0x1d,0x0d,0xf3,0x36,0x29,0x0f,0x74,0x2f,0x4f,0xed,0xbf,0x5c,0x07,0x92,0xcc,0x85,0x18,0xce,0xe9,0x00,0x00,0x00,
+ 0x05,0x20,0xce,0xd3,0xab,0xc8,0xeb,0xe4,0xde,0x1b,0x83,0x01,0x13,0xe2,0x7c,0xc3,0xe2,0xa6,0x7d,0x48,0x85,0xd0,0x75,0xeb,0x57,0xb4,0xb1,0x45,0x78,0xdd,0x2e,0x1f,0xd2,0x65,0x00,0x00,
+ 0x05,0x20,0xce,0xde,0x6c,0x15,0x16,0x2e,0x44,0x3d,0x1b,0xf5,0xe4,0x65,0xe2,0x2f,0xb3,0xa8,0xbb,0xdc,0x7c,0x1b,0x98,0x11,0xc3,0x08,0x2f,0x93,0xbc,0x55,0x80,0x89,0x12,0x88,0x00,0x00,
+ 0x05,0x20,0xcf,0x8d,0xe5,0xb2,0xd4,0x3b,0x56,0x34,0x03,0x38,0x2f,0xf5,0x95,0xca,0xb3,0xb0,0x60,0xbe,0xb0,0xb5,0x7b,0x30,0x04,0x3e,0x95,0x49,0x6c,0xd0,0xfa,0x4b,0x22,0xfc,0x00,0x00,
+ 0x05,0x20,0xcf,0x8c,0x5f,0xd3,0xdf,0xf2,0x84,0x14,0x88,0xbb,0xbe,0x07,0x29,0x24,0x17,0x27,0xff,0x50,0x4e,0x11,0xfa,0xe3,0xcd,0xf7,0xd4,0x91,0x87,0x59,0x50,0xfd,0xe2,0x5e,0x00,0x00,
+ 0x05,0x20,0xc8,0xac,0x68,0x5b,0xe7,0x5d,0xbf,0xcd,0xfc,0x1f,0x05,0x3c,0xdf,0x38,0x2b,0x48,0xc3,0xc0,0x45,0xb2,0x3b,0x90,0x11,0xc1,0xde,0xab,0xa2,0x42,0x72,0xe8,0xcb,0x5d,0x00,0x00,
+ 0x05,0x20,0xc9,0xf7,0xca,0x27,0x62,0xb6,0x23,0xfc,0xcb,0x54,0x17,0x00,0x4c,0x44,0xe5,0x29,0xa8,0xcb,0x8f,0xb4,0xcb,0xca,0xf0,0xb0,0x34,0xc1,0x27,0x05,0x0f,0x77,0xc7,0x10,0x00,0x00,
+ 0x05,0x20,0xcb,0x67,0xe6,0x0e,0xac,0x94,0xee,0x21,0x82,0x04,0x45,0x1d,0xef,0xab,0x54,0x37,0x09,0xcd,0x68,0xc9,0x2c,0xe2,0xd6,0x7d,0xd5,0xd2,0x32,0x02,0x50,0xff,0xd8,0xfb,0x00,0x00,
+ 0x05,0x20,0xcc,0x0e,0xe8,0x18,0xbb,0x23,0x53,0xa7,0xd7,0xfc,0x92,0x5d,0x5f,0x0e,0x67,0x7c,0x7c,0x98,0x00,0xb6,0xec,0x21,0x9c,0xca,0xad,0x28,0xe1,0x9c,0x0b,0x02,0x3d,0xdf,0x00,0x00,
+ 0x05,0x20,0xcc,0x7f,0xce,0x2f,0x37,0xa6,0x97,0x5c,0xb4,0x54,0x10,0xac,0x17,0x69,0xfd,0x8b,0xdc,0x29,0x20,0x6e,0x89,0xfa,0xda,0x1b,0x48,0x9e,0xb0,0x59,0x3d,0xe1,0x12,0x64,0x00,0x00,
+ 0x05,0x20,0xcc,0xd8,0x73,0xec,0xfc,0xf5,0x2b,0x61,0xf5,0xec,0xa0,0x29,0x94,0x9c,0x52,0xc0,0x5d,0xe9,0xc0,0xd7,0xe8,0x38,0xf6,0x1d,0xee,0x5d,0xa7,0x7c,0x11,0x14,0x1f,0xae,0x00,0x00,
+ 0x05,0x20,0xcd,0xe3,0xa9,0x59,0x8a,0xdf,0xdb,0x76,0x88,0x6a,0xc9,0xf6,0x0c,0x33,0xc1,0x51,0x37,0x66,0xa8,0xbe,0xf6,0x4a,0x5a,0xf9,0x5c,0xb2,0x2a,0x22,0x7a,0x4c,0x0c,0x49,0x00,0x00,
+ 0x05,0x20,0xce,0x11,0x15,0xb3,0x32,0x69,0xd5,0x83,0x86,0x5a,0x5e,0x01,0xd6,0x34,0x35,0xc8,0x6a,0xdb,0xea,0x70,0x83,0x58,0xf5,0xaa,0x40,0xd1,0x0f,0x2f,0xcb,0x98,0xb8,0xa5,0x00,0x00,
+ 0x01,0x04,0x02,0x27,0xa3,0xbf,0x20,0x8d,
+ 0x01,0x04,0x02,0x53,0xf8,0x4d,0x20,0x8d,
+ 0x01,0x04,0x02,0x57,0x48,0xeb,0x20,0x8d,
+ 0x01,0x04,0x03,0x09,0xbc,0x2c,0x20,0x8d,
+ 0x01,0x04,0x03,0x4c,0x8f,0xb9,0x20,0x8d,
+ 0x01,0x04,0x03,0xe7,0x9a,0xc3,0x20,0x8d,
0x01,0x04,0x05,0x02,0x17,0xe2,0x20,0x8d,
+ 0x01,0x04,0x05,0x2d,0x48,0x0b,0x20,0x8d,
+ 0x01,0x04,0x05,0x4e,0x47,0xad,0x20,0x8d,
+ 0x01,0x04,0x05,0x4e,0x74,0x7f,0x20,0x8d,
0x01,0x04,0x05,0x80,0x57,0x7e,0x20,0x8d,
- 0x01,0x04,0x05,0x9d,0x67,0xca,0x20,0x8d,
+ 0x01,0x04,0x05,0x90,0x58,0x53,0x20,0x8d,
+ 0x01,0x04,0x05,0xac,0x84,0x68,0x20,0x8d,
+ 0x01,0x04,0x05,0xba,0x3c,0x0d,0x20,0x8d,
0x01,0x04,0x05,0xbc,0x3e,0x12,0x20,0x8d,
- 0x01,0x04,0x05,0xfd,0x12,0xda,0x20,0x8d,
- 0x01,0x04,0x05,0xff,0x6d,0xa0,0x20,0x8d,
- 0x01,0x04,0x08,0x81,0xb8,0xff,0x20,0x8d,
+ 0x01,0x04,0x05,0xff,0x61,0x5c,0x20,0x8d,
0x01,0x04,0x08,0xd1,0x46,0x4d,0x20,0x8d,
- 0x01,0x04,0x08,0xd2,0x12,0x38,0x20,0x8d,
- 0x01,0x04,0x0c,0x22,0x62,0x94,0x20,0x8d,
- 0x01,0x04,0x12,0x1b,0x4f,0x11,0x20,0x8d,
- 0x01,0x04,0x17,0x5d,0xaa,0x76,0x20,0x8d,
- 0x01,0x04,0x17,0x9a,0x88,0x90,0x20,0x8d,
- 0x01,0x04,0x17,0xaf,0x00,0xd4,0x20,0x8d,
+ 0x01,0x04,0x0e,0xcb,0x39,0x32,0x20,0x8d,
+ 0x01,0x04,0x0f,0xeb,0x52,0xb2,0x20,0x8d,
+ 0x01,0x04,0x12,0xb7,0x57,0xf0,0x20,0x8d,
+ 0x01,0x04,0x14,0x59,0xf3,0x8b,0x20,0x8d,
+ 0x01,0x04,0x17,0x86,0x5e,0x52,0x20,0x8d,
+ 0x01,0x04,0x17,0x8e,0x91,0xee,0x20,0x8d,
0x01,0x04,0x17,0xaf,0x00,0xde,0x20,0x8d,
- 0x01,0x04,0x18,0x54,0xa4,0x32,0x20,0x8d,
- 0x01,0x04,0x18,0x56,0x5a,0x7f,0x20,0x8d,
- 0x01,0x04,0x18,0x65,0x7e,0xc2,0x20,0x8d,
- 0x01,0x04,0x18,0xb7,0x4b,0x9a,0x20,0x8d,
- 0x01,0x04,0x1b,0x7c,0x6c,0x13,0x20,0x8d,
+ 0x01,0x04,0x18,0x06,0x59,0x9b,0x20,0x8d,
+ 0x01,0x04,0x18,0x24,0x60,0x0e,0x20,0x8d,
+ 0x01,0x04,0x18,0x4c,0xc7,0x56,0x20,0x8d,
+ 0x01,0x04,0x18,0x74,0xa3,0xe3,0x20,0x8d,
+ 0x01,0x04,0x18,0x77,0x29,0xea,0x20,0x8d,
+ 0x01,0x04,0x18,0x92,0x21,0x0d,0x20,0x8d,
+ 0x01,0x04,0x18,0x94,0x34,0x6c,0x20,0x8d,
+ 0x01,0x04,0x18,0x9c,0x2a,0x9a,0x20,0x8d,
0x01,0x04,0x1b,0x94,0xce,0x8c,0x20,0x8d,
- 0x01,0x04,0x1f,0x19,0x62,0x10,0x20,0x8d,
- 0x01,0x04,0x1f,0x29,0x17,0xf9,0x20,0x8d,
- 0x01,0x04,0x1f,0x2f,0xca,0x70,0x20,0x8d,
- 0x01,0x04,0x1f,0x9c,0x80,0xf8,0x20,0x8d,
- 0x01,0x04,0x1f,0xa4,0xa0,0xa2,0x20,0x8d,
- 0x01,0x04,0x1f,0xc9,0xbe,0x86,0x20,0x8d,
- 0x01,0x04,0x1f,0xd0,0x22,0x3d,0x20,0x8d,
- 0x01,0x04,0x22,0x4e,0x0e,0x19,0x20,0x8d,
- 0x01,0x04,0x22,0x50,0x86,0x44,0x20,0x8d,
- 0x01,0x04,0x23,0x89,0x85,0xe1,0x20,0x8d,
- 0x01,0x04,0x23,0xc1,0xc0,0x30,0x20,0x8d,
- 0x01,0x04,0x23,0xc2,0x27,0xfa,0x20,0x8d,
- 0x01,0x04,0x25,0x0f,0x3c,0x90,0x20,0x8d,
- 0x01,0x04,0x25,0x3c,0xe4,0xfb,0x20,0x8d,
- 0x01,0x04,0x25,0x3c,0xe5,0x75,0x20,0x8d,
- 0x01,0x04,0x25,0x6e,0x84,0x5e,0x20,0x8d,
- 0x01,0x04,0x25,0x78,0xb3,0x1d,0x20,0x8d,
- 0x01,0x04,0x25,0x8b,0x66,0x49,0x20,0x8d,
+ 0x01,0x04,0x1f,0x13,0xcd,0x13,0x20,0x8d,
+ 0x01,0x04,0x1f,0x1e,0x3b,0xc9,0x20,0x8d,
+ 0x01,0x04,0x1f,0xbd,0x18,0xbc,0x20,0x8d,
+ 0x01,0x04,0x23,0xaa,0x4d,0xce,0x20,0x8d,
+ 0x01,0x04,0x23,0xd0,0x3e,0x82,0x20,0x8d,
+ 0x01,0x04,0x23,0xd5,0x9f,0xa8,0x20,0x8d,
+ 0x01,0x04,0x23,0xe4,0xd2,0xc1,0x20,0x8d,
+ 0x01,0x04,0x23,0xf4,0x09,0xb6,0x20,0x8d,
+ 0x01,0x04,0x25,0x3c,0xf6,0x52,0x20,0x8d,
0x01,0x04,0x25,0x9d,0xc0,0x5e,0x20,0x8d,
- 0x01,0x04,0x25,0xdc,0x87,0x97,0x20,0x8d,
- 0x01,0x04,0x26,0x09,0x51,0xa0,0x20,0x8d,
- 0x01,0x04,0x26,0x15,0xdd,0xfc,0x20,0x8d,
- 0x01,0x04,0x26,0x36,0x0e,0x59,0x20,0x8d,
- 0x01,0x04,0x26,0x5b,0x6a,0x6f,0x20,0x8d,
+ 0x01,0x04,0x25,0xdd,0xc5,0xd0,0x20,0x8d,
+ 0x01,0x04,0x26,0x26,0xc0,0xf8,0x20,0x8d,
+ 0x01,0x04,0x26,0x28,0x6e,0x42,0x20,0x8d,
+ 0x01,0x04,0x26,0x4b,0xd7,0xfa,0x20,0x8d,
+ 0x01,0x04,0x26,0x4b,0xeb,0x61,0x20,0x8d,
0x01,0x04,0x26,0x66,0x55,0x24,0x20,0x8d,
- 0x01,0x04,0x2a,0x02,0xa2,0xda,0x20,0x8d,
- 0x01,0x04,0x2b,0x81,0x4b,0x14,0x20,0x8d,
+ 0x01,0x04,0x26,0x6f,0x72,0x9b,0x20,0x8d,
+ 0x01,0x04,0x26,0xfe,0x8c,0x28,0x20,0x8d,
+ 0x01,0x04,0x28,0xa0,0x0d,0x07,0x20,0x8d,
0x01,0x04,0x2b,0x9f,0x3d,0x10,0x20,0x8d,
- 0x01,0x04,0x2b,0xe1,0x3e,0x6b,0x20,0x8d,
- 0x01,0x04,0x2b,0xf5,0xc4,0xd6,0x20,0x8d,
- 0x01,0x04,0x2d,0x0d,0x07,0xdd,0x20,0x8d,
- 0x01,0x04,0x2d,0x2c,0xd5,0x7b,0x20,0x8d,
- 0x01,0x04,0x2d,0x30,0x4b,0xe0,0x20,0x8d,
- 0x01,0x04,0x2d,0x4f,0x4c,0x0c,0x20,0x8d,
- 0x01,0x04,0x2d,0x5e,0xd1,0x7f,0x20,0x8d,
- 0x01,0x04,0x2d,0x82,0x17,0x39,0x20,0x8d,
- 0x01,0x04,0x2d,0x84,0x76,0x19,0x20,0x8d,
- 0x01,0x04,0x2d,0x90,0xf9,0xcf,0x20,0x8d,
- 0x01,0x04,0x2d,0x91,0x28,0x2b,0x20,0x8d,
- 0x01,0x04,0x2d,0x9b,0xa9,0x1e,0x20,0x8d,
- 0x01,0x04,0x2e,0x11,0x63,0x0d,0x20,0x8d,
- 0x01,0x04,0x2e,0x11,0x63,0x1a,0x20,0x8d,
- 0x01,0x04,0x2e,0x15,0xfa,0x19,0x20,0x8d,
- 0x01,0x04,0x2e,0x1c,0xcc,0xa1,0x20,0x8d,
- 0x01,0x04,0x2e,0x80,0xc7,0x1a,0x20,0x8d,
- 0x01,0x04,0x2e,0xa4,0x3b,0x8b,0x20,0x8d,
- 0x01,0x04,0x2e,0xa6,0x8e,0x02,0x20,0x8d,
- 0x01,0x04,0x2e,0xac,0xe9,0xf1,0x20,0x8d,
- 0x01,0x04,0x2e,0xfc,0x05,0x70,0x20,0x8d,
- 0x01,0x04,0x2f,0x1c,0x55,0x47,0x20,0x8d,
- 0x01,0x04,0x2f,0xb0,0xf8,0xfa,0x20,0x8d,
- 0x01,0x04,0x2f,0xc6,0x3c,0xb4,0x20,0x8d,
- 0x01,0x04,0x32,0x1b,0x16,0x8d,0x20,0x8d,
- 0x01,0x04,0x32,0x27,0xaa,0x95,0x20,0x8d,
- 0x01,0x04,0x32,0x35,0xfa,0xa2,0x20,0x8d,
- 0x01,0x04,0x33,0x9a,0x3e,0x67,0x20,0x8d,
- 0x01,0x04,0x33,0x9e,0x96,0x9b,0x20,0x8d,
+ 0x01,0x04,0x2b,0xc6,0x9f,0x11,0x20,0x8d,
+ 0x01,0x04,0x2b,0xe1,0x8f,0x11,0x20,0x8d,
+ 0x01,0x04,0x2d,0x2d,0x1b,0xe9,0x20,0x8d,
+ 0x01,0x04,0x2d,0x58,0x6a,0x6b,0x20,0x8d,
+ 0x01,0x04,0x2d,0x81,0x54,0x88,0x20,0x8d,
+ 0x01,0x04,0x2d,0x81,0xb5,0x6b,0x20,0x8d,
+ 0x01,0x04,0x2d,0x82,0x14,0xb1,0x20,0x8d,
+ 0x01,0x04,0x2d,0x8e,0xeb,0x2e,0x20,0x8d,
+ 0x01,0x04,0x2d,0x96,0x42,0x0a,0x20,0x8d,
+ 0x01,0x04,0x2d,0xcf,0x2b,0x6e,0x20,0x8d,
+ 0x01,0x04,0x2e,0x0a,0xd3,0x8f,0x20,0x8d,
+ 0x01,0x04,0x2e,0x17,0x57,0xda,0x20,0x8d,
+ 0x01,0x04,0x2e,0x1c,0xcd,0x44,0x20,0x8d,
+ 0x01,0x04,0x2e,0x20,0xb2,0x52,0x20,0x8d,
+ 0x01,0x04,0x2e,0x27,0xa7,0x31,0x20,0x8d,
+ 0x01,0x04,0x2e,0x3b,0x28,0x5b,0x20,0x8d,
+ 0x01,0x04,0x2e,0x94,0xeb,0x24,0x20,0x8d,
+ 0x01,0x04,0x2e,0x96,0xa1,0x2b,0x20,0x8d,
+ 0x01,0x04,0x2e,0xaf,0xb2,0x03,0x20,0x8d,
+ 0x01,0x04,0x2e,0xe5,0xee,0xbb,0x20,0x8d,
+ 0x01,0x04,0x2f,0x0c,0xe4,0x7a,0x20,0x8d,
+ 0x01,0x04,0x2f,0xb8,0x9f,0xec,0x20,0x8d,
+ 0x01,0x04,0x2f,0xfe,0xb2,0x2c,0x20,0x8d,
+ 0x01,0x04,0x32,0x04,0x12,0x5a,0x20,0x8d,
+ 0x01,0x04,0x32,0x1e,0x24,0x8c,0x20,0x8d,
+ 0x01,0x04,0x32,0x2d,0x80,0x1c,0x20,0x8d,
+ 0x01,0x04,0x32,0x4f,0x56,0x71,0x20,0x8d,
+ 0x01,0x04,0x32,0x7e,0x60,0x16,0x20,0x8d,
+ 0x01,0x04,0x32,0x90,0x87,0x28,0x20,0x8d,
+ 0x01,0x04,0x33,0x9a,0x1a,0x0b,0x20,0x8d,
0x01,0x04,0x33,0xae,0xce,0x4c,0x20,0x8d,
- 0x01,0x04,0x36,0xd9,0x88,0x7a,0x20,0x8d,
- 0x01,0x04,0x36,0xfd,0x0f,0x21,0x20,0x8d,
- 0x01,0x04,0x39,0x80,0x60,0x73,0x20,0x8d,
- 0x01,0x04,0x39,0x80,0x94,0xa9,0x20,0x8d,
- 0x01,0x04,0x3a,0x06,0x2e,0xab,0x20,0x8d,
- 0x01,0x04,0x3a,0x60,0x4d,0x72,0x20,0x8d,
- 0x01,0x04,0x3a,0x60,0x7b,0x78,0x20,0x8d,
- 0x01,0x04,0x3a,0xa8,0xfd,0x23,0x20,0x8d,
- 0x01,0x04,0x3b,0xa7,0xbf,0x3c,0x20,0x8d,
- 0x01,0x04,0x3c,0xcd,0xcd,0x77,0x20,0x8d,
- 0x01,0x04,0x3c,0xd4,0xbd,0x97,0x20,0x8d,
- 0x01,0x04,0x3d,0x4a,0x63,0xc1,0x20,0x8d,
- 0x01,0x04,0x3e,0x18,0x4c,0x7a,0x20,0x8d,
- 0x01,0x04,0x3e,0x6a,0x46,0xf9,0x20,0x8d,
+ 0x01,0x04,0x33,0xc2,0x0d,0x19,0x20,0x8d,
+ 0x01,0x04,0x3a,0xe5,0x69,0x26,0x20,0x8d,
+ 0x01,0x04,0x3b,0xbc,0x6c,0x96,0x20,0x8d,
+ 0x01,0x04,0x3e,0x0c,0xa8,0x64,0x20,0x8d,
0x01,0x04,0x3e,0xa8,0x41,0x2a,0x20,0x8d,
- 0x01,0x04,0x3e,0xab,0x81,0x20,0x20,0x8d,
- 0x01,0x04,0x3e,0xf5,0x4b,0x46,0x20,0x8d,
- 0x01,0x04,0x3e,0xf8,0x08,0xa7,0x20,0x8d,
- 0x01,0x04,0x40,0x17,0x96,0xd3,0x20,0x8d,
- 0x01,0x04,0x40,0x62,0x77,0x88,0x20,0x8d,
- 0x01,0x04,0x41,0x18,0x4b,0x22,0x20,0x8d,
- 0x01,0x04,0x41,0xaf,0xb9,0x65,0x20,0x8d,
- 0x01,0x04,0x42,0x2d,0x8d,0x2e,0x20,0x8d,
- 0x01,0x04,0x42,0x3a,0xa3,0xb9,0x20,0x8d,
- 0x01,0x04,0x42,0x55,0x85,0xb6,0x20,0x8d,
- 0x01,0x04,0x42,0xce,0x16,0x1a,0x20,0x8d,
- 0x01,0x04,0x43,0x28,0x66,0x21,0x20,0x8d,
- 0x01,0x04,0x43,0x2b,0xd2,0x3e,0x20,0x8d,
- 0x01,0x04,0x43,0x52,0x88,0xb1,0x20,0x8d,
- 0x01,0x04,0x43,0xc1,0x57,0x32,0x20,0x8d,
+ 0x01,0x04,0x3e,0xb1,0x6f,0x4e,0x20,0x8d,
+ 0x01,0x04,0x3e,0xd2,0xcf,0x3f,0x20,0x8d,
+ 0x01,0x04,0x40,0x14,0x2d,0x2a,0x20,0x8d,
+ 0x01,0x04,0x40,0x1f,0x3d,0x96,0x20,0x8d,
+ 0x01,0x04,0x40,0x2a,0xb0,0xea,0x20,0x8d,
+ 0x01,0x04,0x40,0x2e,0x3a,0xac,0x20,0x8d,
+ 0x01,0x04,0x40,0x44,0xcb,0x0b,0x20,0x8d,
+ 0x01,0x04,0x40,0x9c,0xc0,0x3d,0x20,0x8d,
+ 0x01,0x04,0x40,0xb9,0xe1,0x1a,0x20,0x8d,
+ 0x01,0x04,0x40,0xbb,0xa8,0xc6,0x20,0x8d,
+ 0x01,0x04,0x40,0xfd,0x68,0x76,0x20,0x8d,
+ 0x01,0x04,0x42,0x12,0x0d,0xa2,0x20,0x8d,
+ 0x01,0x04,0x42,0x1d,0x81,0xe9,0x20,0x8d,
+ 0x01,0x04,0x42,0x23,0x54,0x1e,0x20,0x8d,
+ 0x01,0x04,0x42,0xc2,0x26,0x2d,0x20,0x8d,
+ 0x01,0x04,0x42,0xe4,0x1c,0x3f,0x20,0x8d,
+ 0x01,0x04,0x43,0x91,0xcc,0x12,0x20,0x8d,
+ 0x01,0x04,0x43,0xcd,0xbe,0x8f,0x20,0x8d,
0x01,0x04,0x43,0xd2,0xe4,0xcb,0x20,0x8d,
- 0x01,0x04,0x43,0xd3,0xd3,0x76,0x20,0x8d,
- 0x01,0x04,0x43,0xe7,0xf6,0x3a,0x20,0x8d,
- 0x01,0x04,0x44,0x06,0x54,0xde,0x20,0x8d,
- 0x01,0x04,0x44,0x30,0x88,0xd8,0x20,0x8d,
- 0x01,0x04,0x44,0x45,0xaa,0x5c,0x20,0x8d,
+ 0x01,0x04,0x43,0xd9,0x3d,0xd5,0x20,0x8d,
+ 0x01,0x04,0x43,0xfb,0x87,0x11,0x20,0x8d,
+ 0x01,0x04,0x44,0x27,0xbe,0xb9,0x20,0x8d,
+ 0x01,0x04,0x44,0x4b,0xc3,0x02,0x20,0x8d,
+ 0x01,0x04,0x44,0x66,0x86,0xe3,0x20,0x8d,
+ 0x01,0x04,0x44,0xdb,0xf2,0x22,0x20,0x8d,
0x01,0x04,0x45,0x04,0x5e,0xe2,0x20,0x8d,
- 0x01,0x04,0x45,0x08,0xaf,0xc9,0x20,0x8d,
- 0x01,0x04,0x45,0x39,0xa0,0x31,0x20,0x8d,
- 0x01,0x04,0x45,0x70,0x67,0x7c,0x20,0x8d,
+ 0x01,0x04,0x45,0x8e,0x1c,0x36,0x20,0x8d,
+ 0x01,0x04,0x45,0x92,0x3e,0x01,0x20,0x8d,
+ 0x01,0x04,0x45,0xb0,0xbc,0xfb,0x20,0x8d,
+ 0x01,0x04,0x45,0xb4,0xaa,0xd7,0x20,0x8d,
+ 0x01,0x04,0x45,0xb5,0x40,0x57,0x20,0x8d,
0x01,0x04,0x45,0xc4,0x98,0x21,0x20,0x8d,
- 0x01,0x04,0x47,0x13,0x94,0xb4,0x20,0x8d,
- 0x01,0x04,0x49,0xe3,0x99,0xd5,0x20,0x8d,
- 0x01,0x04,0x4a,0x32,0x51,0x5d,0x20,0x8d,
- 0x01,0x04,0x4a,0x65,0xcd,0xd6,0x20,0x8d,
- 0x01,0x04,0x4a,0x76,0x89,0x77,0x20,0x8d,
- 0x01,0x04,0x4a,0xd5,0xaf,0x6c,0x20,0x8d,
- 0x01,0x04,0x4a,0xd5,0xfb,0xef,0x20,0x8d,
+ 0x01,0x04,0x46,0x23,0x62,0x0c,0x20,0x8d,
+ 0x01,0x04,0x46,0x43,0x8b,0xcc,0x20,0x8d,
+ 0x01,0x04,0x46,0x79,0x32,0x93,0x20,0x8d,
+ 0x01,0x04,0x46,0xac,0x84,0x4e,0x20,0x8d,
+ 0x01,0x04,0x47,0xe0,0xc9,0xe0,0x20,0x8d,
+ 0x01,0x04,0x48,0x12,0x35,0xbd,0x20,0x8d,
+ 0x01,0x04,0x48,0x2e,0x83,0x12,0x20,0x8d,
+ 0x01,0x04,0x48,0x32,0xdc,0x05,0x20,0x8d,
+ 0x01,0x04,0x48,0x47,0xd1,0x60,0x20,0x8d,
+ 0x01,0x04,0x49,0x23,0xf6,0xaf,0x20,0x8d,
+ 0x01,0x04,0x49,0x62,0x6b,0x25,0x20,0x8d,
+ 0x01,0x04,0x49,0x62,0xb2,0xec,0x20,0x8d,
+ 0x01,0x04,0x49,0x75,0x84,0x8a,0x20,0x8d,
+ 0x01,0x04,0x49,0x83,0xd1,0x46,0x20,0x8d,
+ 0x01,0x04,0x49,0x9d,0x70,0xb2,0x20,0x8d,
+ 0x01,0x04,0x49,0xe4,0xad,0x15,0x20,0x8d,
+ 0x01,0x04,0x49,0xfd,0x37,0xd9,0x20,0x8d,
+ 0x01,0x04,0x4a,0x49,0xe5,0x94,0x20,0x8d,
+ 0x01,0x04,0x4a,0x70,0x73,0xc5,0x20,0x8d,
+ 0x01,0x04,0x4a,0x76,0x8a,0x7c,0x20,0x8d,
+ 0x01,0x04,0x4a,0x76,0x8f,0x08,0x20,0x8d,
+ 0x01,0x04,0x4a,0x85,0x5a,0xfb,0x20,0x8d,
+ 0x01,0x04,0x4a,0xd5,0xfb,0xe9,0x20,0x8d,
0x01,0x04,0x4a,0xdc,0xff,0xbe,0x20,0x8d,
- 0x01,0x04,0x4d,0x14,0x30,0x90,0x20,0x8d,
- 0x01,0x04,0x4d,0x15,0x95,0xa0,0x20,0x8d,
- 0x01,0x04,0x4d,0x25,0xf0,0xd1,0x20,0x8d,
- 0x01,0x04,0x4d,0x2b,0x0e,0x44,0x20,0x8d,
- 0x01,0x04,0x4d,0x6f,0x39,0x6d,0x20,0x8d,
- 0x01,0x04,0x4d,0xa2,0xbe,0x5a,0x20,0x8d,
- 0x01,0x04,0x4d,0xad,0x84,0x8c,0x20,0x8d,
- 0x01,0x04,0x4d,0xca,0x0a,0xdc,0x20,0x8d,
- 0x01,0x04,0x4e,0x1b,0x8b,0x0d,0x20,0x8d,
- 0x01,0x04,0x4e,0x1f,0x47,0xbe,0x20,0x8d,
- 0x01,0x04,0x4e,0x23,0x93,0xcb,0x20,0x8d,
- 0x01,0x04,0x4e,0x2a,0x90,0x18,0x20,0x8d,
- 0x01,0x04,0x4e,0x2b,0x99,0xb9,0x20,0x8d,
- 0x01,0x04,0x4e,0x38,0x59,0x92,0x20,0x8d,
- 0x01,0x04,0x4e,0x46,0xd0,0x35,0x20,0x8d,
- 0x01,0x04,0x4f,0x6d,0x78,0x26,0x20,0x8d,
- 0x01,0x04,0x4f,0x74,0x38,0x59,0x20,0x8d,
- 0x01,0x04,0x4f,0x7c,0x07,0xfd,0x20,0x8d,
- 0x01,0x04,0x4f,0x88,0xfa,0xa2,0x20,0x8d,
- 0x01,0x04,0x50,0x53,0xba,0x19,0x20,0x8d,
- 0x01,0x04,0x50,0x62,0x4b,0xf8,0x20,0x8d,
- 0x01,0x04,0x50,0xe5,0x1c,0x3c,0x20,0x8d,
- 0x01,0x04,0x50,0xf4,0x1a,0xc0,0x20,0x8d,
- 0x01,0x04,0x51,0x04,0x6e,0xa8,0x20,0x8d,
+ 0x01,0x04,0x4c,0x71,0x78,0xf6,0x20,0x8d,
+ 0x01,0x04,0x4c,0x7f,0xd3,0x5a,0x20,0x8d,
+ 0x01,0x04,0x4c,0x9a,0xa2,0xb6,0x20,0x8d,
+ 0x01,0x04,0x4d,0x21,0x90,0x9c,0x20,0x8d,
+ 0x01,0x04,0x4d,0x26,0x03,0x5a,0x20,0x8d,
+ 0x01,0x04,0x4d,0x64,0x14,0xb2,0x20,0x8d,
+ 0x01,0x04,0x4d,0x6d,0x70,0xdf,0x20,0x8d,
+ 0x01,0x04,0x4d,0xa5,0xfa,0x3e,0x20,0x8d,
+ 0x01,0x04,0x4d,0xdf,0x78,0x8b,0x20,0x8d,
+ 0x01,0x04,0x4d,0xf0,0xbe,0x29,0x20,0x8d,
+ 0x01,0x04,0x4e,0x1e,0x39,0x4e,0x20,0x8d,
+ 0x01,0x04,0x4e,0x9d,0x5b,0x78,0x20,0x8d,
+ 0x01,0x04,0x4f,0x36,0xf0,0x7c,0x20,0x8d,
+ 0x01,0x04,0x4f,0x74,0x35,0x32,0x20,0x8d,
+ 0x01,0x04,0x4f,0x86,0x63,0x72,0x20,0x8d,
+ 0x01,0x04,0x4f,0x9c,0x8a,0x6b,0x20,0x8d,
+ 0x01,0x04,0x50,0x3c,0x78,0x77,0x20,0x8d,
+ 0x01,0x04,0x50,0x40,0xd3,0x66,0x20,0x8d,
+ 0x01,0x04,0x50,0x40,0xd3,0x67,0x20,0x8d,
+ 0x01,0x04,0x50,0x5a,0x04,0xb2,0x20,0x8d,
+ 0x01,0x04,0x50,0x6c,0xdb,0x99,0x20,0x8d,
+ 0x01,0x04,0x50,0xd1,0xe7,0x7e,0x20,0x8d,
+ 0x01,0x04,0x50,0xf1,0xc2,0x93,0x20,0x8d,
0x01,0x04,0x51,0x07,0x11,0xca,0x20,0x8d,
- 0x01,0x04,0x51,0x13,0x0a,0x02,0x20,0x8d,
0x01,0x04,0x51,0x53,0xd6,0x86,0x20,0x8d,
- 0x01,0x04,0x51,0xaa,0x8e,0x64,0x20,0x8d,
- 0x01,0x04,0x51,0xab,0x16,0x8f,0x20,0x8d,
- 0x01,0x04,0x51,0xf2,0xef,0x8b,0x20,0x8d,
+ 0x01,0x04,0x51,0xc5,0xb6,0xc3,0x20,0x8d,
+ 0x01,0x04,0x51,0xe5,0xea,0x57,0x20,0x8d,
+ 0x01,0x04,0x52,0x0a,0xfa,0x82,0x20,0x8d,
+ 0x01,0x04,0x52,0x40,0x31,0x1b,0x20,0x8d,
0x01,0x04,0x52,0x42,0x0a,0x0b,0x20,0x8d,
- 0x01,0x04,0x52,0x42,0xcc,0xb1,0x20,0x8d,
- 0x01,0x04,0x52,0x60,0x60,0x28,0x20,0x8d,
- 0x01,0x04,0x52,0x95,0xe1,0xf9,0x20,0x8d,
- 0x01,0x04,0x52,0x9b,0x94,0xd3,0x20,0x8d,
- 0x01,0x04,0x52,0xb5,0xda,0x85,0x20,0x8d,
- 0x01,0x04,0x53,0x63,0xf7,0x19,0x20,0x8d,
+ 0x01,0x04,0x52,0x47,0x2f,0xd8,0x20,0x8d,
+ 0x01,0x04,0x52,0x49,0xbc,0xb2,0x20,0x8d,
+ 0x01,0x04,0x52,0x55,0x6e,0x14,0x20,0x8d,
+ 0x01,0x04,0x52,0x7c,0x21,0x77,0x20,0x8d,
+ 0x01,0x04,0x52,0xae,0x8e,0xca,0x20,0x8d,
+ 0x01,0x04,0x52,0xc3,0xed,0xfb,0x20,0x8d,
+ 0x01,0x04,0x52,0xda,0x22,0xa2,0x20,0x8d,
+ 0x01,0x04,0x53,0x31,0x0a,0xe3,0x20,0x8d,
+ 0x01,0x04,0x53,0x4e,0x70,0x8e,0x20,0x8d,
0x01,0x04,0x53,0x88,0xe8,0x15,0x20,0x8d,
- 0x01,0x04,0x53,0xc0,0xe2,0x42,0x20,0x8d,
+ 0x01,0x04,0x53,0x90,0xb4,0x58,0x20,0x8d,
+ 0x01,0x04,0x53,0x96,0x02,0x80,0x20,0x8d,
+ 0x01,0x04,0x53,0xa8,0x41,0xba,0x20,0x8d,
0x01,0x04,0x53,0xd0,0xc1,0xf2,0x20,0x8d,
- 0x01,0x04,0x53,0xf0,0x76,0xc4,0x20,0x8d,
- 0x01,0x04,0x54,0x07,0xdb,0x82,0x20,0x8d,
- 0x01,0x04,0x54,0x34,0x40,0x52,0x20,0x8d,
- 0x01,0x04,0x54,0x40,0x63,0x4e,0x20,0x8d,
- 0x01,0x04,0x54,0x70,0x3c,0x10,0x20,0x8d,
+ 0x01,0x04,0x53,0xda,0xa0,0xa1,0x20,0x8d,
+ 0x01,0x04,0x54,0x20,0xf8,0x3f,0x20,0x8d,
+ 0x01,0x04,0x54,0x4b,0x00,0xb2,0x20,0x8d,
0x01,0x04,0x54,0x71,0x81,0xc3,0x20,0x8d,
- 0x01,0x04,0x54,0xd3,0xbb,0xd3,0x20,0x8d,
- 0x01,0x04,0x54,0xd9,0x86,0xd5,0x20,0x8d,
- 0x01,0x04,0x54,0xf7,0x80,0x0f,0x20,0x8d,
- 0x01,0x04,0x54,0xf7,0x84,0x1b,0x20,0x8d,
- 0x01,0x04,0x54,0xf7,0xad,0x75,0x20,0x8d,
- 0x01,0x04,0x54,0xf7,0xb3,0x33,0x20,0x8d,
- 0x01,0x04,0x54,0xff,0xf5,0xc2,0x20,0x8d,
- 0x01,0x04,0x55,0x91,0x4f,0x1a,0x20,0x8d,
- 0x01,0x04,0x55,0xad,0xa5,0x42,0x20,0x8d,
- 0x01,0x04,0x55,0xc3,0xc4,0x56,0x20,0x8d,
- 0x01,0x04,0x55,0xd6,0x76,0x47,0x20,0x8d,
- 0x01,0x04,0x56,0x16,0x14,0x0d,0x20,0x8d,
- 0x01,0x04,0x56,0x2d,0xee,0x73,0x20,0x8d,
- 0x01,0x04,0x56,0xb6,0xdf,0xbd,0x20,0x8d,
- 0x01,0x04,0x56,0xd7,0xa8,0x73,0x20,0x8d,
- 0x01,0x04,0x57,0x4f,0x5e,0xdd,0x20,0x8d,
- 0x01,0x04,0x57,0x5a,0x5e,0x78,0x20,0x8d,
- 0x01,0x04,0x57,0x5c,0xab,0x35,0x20,0x8d,
+ 0x01,0x04,0x54,0xc3,0x74,0x1a,0x20,0x8d,
+ 0x01,0x04,0x54,0xf6,0xc8,0x7a,0x20,0x8d,
+ 0x01,0x04,0x54,0xff,0xee,0x78,0x20,0x8d,
+ 0x01,0x04,0x55,0x0e,0x4f,0x1a,0x20,0x8d,
+ 0x01,0x04,0x55,0x92,0x73,0x88,0x20,0x8d,
+ 0x01,0x04,0x55,0x9f,0xed,0x47,0x20,0x8d,
+ 0x01,0x04,0x55,0xc3,0x53,0x32,0x20,0x8d,
+ 0x01,0x04,0x55,0xd6,0xa1,0xfc,0x20,0x8d,
+ 0x01,0x04,0x55,0xd6,0xdf,0x24,0x20,0x8d,
+ 0x01,0x04,0x55,0xd7,0x4b,0xd2,0x20,0x8d,
+ 0x01,0x04,0x55,0xea,0x91,0x84,0x20,0x8d,
+ 0x01,0x04,0x55,0xf6,0x26,0x96,0x20,0x8d,
+ 0x01,0x04,0x55,0xfc,0xd8,0x92,0x20,0x8d,
+ 0x01,0x04,0x56,0x29,0x82,0x6c,0x20,0x8d,
+ 0x01,0x04,0x56,0x65,0x5c,0x5d,0x20,0x8d,
+ 0x01,0x04,0x56,0x68,0xe4,0x0c,0x20,0x8d,
+ 0x01,0x04,0x56,0x68,0xe4,0x24,0x20,0x8d,
+ 0x01,0x04,0x56,0x6d,0x0c,0x3c,0x20,0x8d,
+ 0x01,0x04,0x56,0x6f,0x30,0x47,0x20,0x8d,
+ 0x01,0x04,0x56,0x6f,0x30,0x48,0x20,0x8d,
+ 0x01,0x04,0x56,0x7c,0x91,0xb8,0x20,0x8d,
+ 0x01,0x04,0x56,0x85,0x85,0x52,0x20,0x8d,
+ 0x01,0x04,0x57,0x78,0x08,0xef,0x20,0x8d,
+ 0x01,0x04,0x57,0xb3,0x7a,0x81,0x20,0x8d,
0x01,0x04,0x57,0xec,0xc3,0xc6,0x20,0x8d,
- 0x01,0x04,0x57,0xec,0xc7,0xc5,0x20,0x8d,
- 0x01,0x04,0x58,0x06,0x1f,0x42,0x20,0x8d,
- 0x01,0x04,0x58,0x09,0x49,0xfc,0x20,0x8d,
- 0x01,0x04,0x58,0x54,0xdf,0x1e,0x20,0x8d,
- 0x01,0x04,0x58,0x92,0x72,0xad,0x20,0x8d,
- 0x01,0x04,0x59,0x23,0x8e,0xb1,0x20,0x8d,
- 0x01,0x04,0x59,0x2c,0x29,0x8e,0x20,0x8d,
- 0x01,0x04,0x59,0x74,0x19,0xea,0x20,0x8d,
- 0x01,0x04,0x59,0x75,0x3a,0x71,0x20,0x8d,
- 0x01,0x04,0x59,0x75,0xac,0x79,0x20,0x8d,
- 0x01,0x04,0x59,0xa5,0xe8,0xf2,0x20,0x8d,
- 0x01,0x04,0x59,0xbe,0x8e,0x38,0x20,0x8d,
- 0x01,0x04,0x59,0xd8,0x5b,0x78,0x20,0x8d,
- 0x01,0x04,0x59,0xf7,0xe0,0x1c,0x20,0x8d,
- 0x01,0x04,0x5a,0x92,0xcf,0x43,0x20,0x8d,
- 0x01,0x04,0x5a,0x9c,0x1a,0x94,0x20,0x8d,
- 0x01,0x04,0x5a,0xa3,0xac,0x4e,0x20,0x8d,
- 0x01,0x04,0x5a,0xc0,0x76,0xca,0x20,0x8d,
- 0x01,0x04,0x5a,0xd0,0x9f,0x0b,0x20,0x8d,
- 0x01,0x04,0x5a,0xf7,0x46,0x1f,0x20,0x8d,
- 0x01,0x04,0x5b,0x56,0x19,0xcf,0x20,0x8d,
- 0x01,0x04,0x5b,0x7b,0xb6,0xa4,0x20,0x8d,
- 0x01,0x04,0x5b,0x7b,0xb7,0xdb,0x20,0x8d,
- 0x01,0x04,0x5b,0x86,0x91,0xca,0x20,0x8d,
- 0x01,0x04,0x5b,0x87,0x00,0xbb,0x20,0x8d,
- 0x01,0x04,0x5b,0x98,0x7a,0x24,0x20,0x8d,
- 0x01,0x04,0x5b,0xb8,0xae,0xbf,0x20,0x8d,
- 0x01,0x04,0x5b,0xcc,0x95,0x05,0x20,0x8d,
- 0x01,0x04,0x5b,0xce,0x11,0xc3,0x20,0x8d,
- 0x01,0x04,0x5b,0xd1,0x33,0x83,0x20,0x8d,
- 0x01,0x04,0x5b,0xd7,0x5b,0xfe,0x20,0x8d,
- 0x01,0x04,0x5b,0xe7,0xb6,0x35,0x20,0x8d,
- 0x01,0x04,0x5b,0xec,0xfb,0x89,0x20,0x8d,
- 0x01,0x04,0x5b,0xec,0xfb,0x8b,0x20,0x8d,
- 0x01,0x04,0x5b,0xed,0x58,0xda,0x20,0x8d,
- 0x01,0x04,0x5c,0x1b,0x96,0x2e,0x20,0x8d,
- 0x01,0x04,0x5c,0x1b,0x96,0x2f,0x20,0x8d,
- 0x01,0x04,0x5c,0x2a,0x6e,0xdb,0x20,0x8d,
- 0x01,0x04,0x5c,0x2b,0xbb,0x22,0x20,0x8d,
+ 0x01,0x04,0x58,0x55,0x58,0x85,0x20,0x8d,
+ 0x01,0x04,0x58,0x58,0x3a,0xfb,0x20,0x8d,
+ 0x01,0x04,0x58,0x63,0x47,0xd5,0x20,0x8d,
+ 0x01,0x04,0x58,0x77,0x80,0x24,0x20,0x8d,
+ 0x01,0x04,0x58,0x86,0x29,0x58,0x20,0x8d,
+ 0x01,0x04,0x58,0xd2,0x0f,0x18,0x20,0x8d,
+ 0x01,0x04,0x58,0xd4,0x35,0xf6,0x20,0x8d,
+ 0x01,0x04,0x58,0xda,0xe2,0x5b,0x20,0x8d,
+ 0x01,0x04,0x59,0x01,0x68,0x61,0x20,0x8d,
+ 0x01,0x04,0x59,0x27,0x6a,0x1a,0x20,0x8d,
+ 0x01,0x04,0x59,0xb3,0xf0,0x85,0x20,0x8d,
+ 0x01,0x04,0x59,0xcf,0x83,0x13,0x20,0x8d,
+ 0x01,0x04,0x59,0xe9,0xcf,0x43,0x20,0x8d,
+ 0x01,0x04,0x5a,0x1a,0x52,0x2d,0x20,0x8d,
+ 0x01,0x04,0x5a,0xad,0x76,0x6d,0x20,0x8d,
+ 0x01,0x04,0x5a,0xfa,0x0a,0xa5,0x20,0x8d,
+ 0x01,0x04,0x5b,0x5a,0xa6,0xcb,0x20,0x8d,
+ 0x01,0x04,0x5b,0x5c,0x90,0xe2,0x20,0x8d,
+ 0x01,0x04,0x5b,0x5c,0x9a,0x12,0x20,0x8d,
+ 0x01,0x04,0x5b,0xca,0x04,0x41,0x20,0x8d,
+ 0x01,0x04,0x5b,0xe4,0x2d,0x82,0x20,0x8d,
+ 0x01,0x04,0x5b,0xef,0x82,0x3e,0x20,0x8d,
+ 0x01,0x04,0x5b,0xf0,0x54,0x34,0x20,0x8d,
+ 0x01,0x04,0x5c,0x2a,0x6e,0xd6,0x20,0x8d,
+ 0x01,0x04,0x5c,0x54,0xbc,0xce,0x20,0x8d,
+ 0x01,0x04,0x5c,0xcd,0xe8,0x2f,0x20,0x8d,
0x01,0x04,0x5c,0xce,0x69,0x1f,0x20,0x8d,
- 0x01,0x04,0x5c,0xe9,0x02,0x3b,0x20,0x8d,
- 0x01,0x04,0x5c,0xf0,0xb5,0x2d,0x20,0x8d,
- 0x01,0x04,0x5d,0x33,0x0d,0x78,0x20,0x8d,
- 0x01,0x04,0x5d,0x39,0x51,0xa2,0x20,0x8d,
- 0x01,0x04,0x5d,0x47,0x13,0x82,0x20,0x8d,
- 0x01,0x04,0x5d,0x51,0xfe,0x9f,0x20,0x8d,
- 0x01,0x04,0x5d,0x5a,0x52,0xe3,0x20,0x8d,
- 0x01,0x04,0x5d,0x64,0x23,0xbd,0x20,0x8d,
- 0x01,0x04,0x5d,0x67,0x0d,0x01,0x20,0x8d,
- 0x01,0x04,0x5d,0x7b,0xb4,0xa4,0x20,0x8d,
+ 0x01,0x04,0x5c,0xf7,0x31,0xd2,0x20,0x8d,
+ 0x01,0x04,0x5d,0x10,0x2b,0xf1,0x20,0x8d,
+ 0x01,0x04,0x5d,0x26,0x7f,0xb3,0x20,0x8d,
+ 0x01,0x04,0x5d,0x73,0x1a,0x06,0x20,0x8d,
0x01,0x04,0x5d,0xb1,0xbc,0x4a,0x20,0x8d,
- 0x01,0x04,0x5d,0xbc,0x66,0x35,0x20,0x8d,
- 0x01,0x04,0x5e,0x13,0x07,0x37,0x20,0x8d,
- 0x01,0x04,0x5e,0x3f,0x4b,0x4a,0x20,0x8d,
- 0x01,0x04,0x5e,0x48,0x8d,0x3d,0x20,0x8d,
- 0x01,0x04,0x5e,0x48,0x8f,0x2f,0x20,0x8d,
- 0x01,0x04,0x5e,0x69,0x35,0x7c,0x20,0x8d,
- 0x01,0x04,0x5e,0xb5,0x2e,0x6a,0x20,0x8d,
- 0x01,0x04,0x5e,0xe7,0xfd,0x12,0x20,0x8d,
- 0x01,0x04,0x5f,0x2a,0x8c,0x8e,0x20,0x8d,
- 0x01,0x04,0x5f,0x52,0x82,0xdf,0x20,0x8d,
- 0x01,0x04,0x5f,0x58,0x3d,0xb0,0x20,0x8d,
+ 0x01,0x04,0x5e,0x13,0x80,0xcc,0x20,0x8d,
+ 0x01,0x04,0x5e,0x83,0x00,0x49,0x20,0x8d,
+ 0x01,0x04,0x5e,0x88,0x02,0x7e,0x20,0x8d,
+ 0x01,0x04,0x5e,0x9c,0x80,0x99,0x20,0x8d,
+ 0x01,0x04,0x5e,0xcb,0x85,0xfb,0x20,0x8d,
+ 0x01,0x04,0x5e,0xd2,0x37,0x59,0x20,0x8d,
+ 0x01,0x04,0x5e,0xf1,0x5a,0xfb,0x20,0x8d,
0x01,0x04,0x5f,0x69,0xac,0xab,0x20,0x8d,
- 0x01,0x04,0x5f,0x6e,0xea,0x5d,0x20,0x8d,
- 0x01,0x04,0x5f,0xa4,0xb6,0x2c,0x20,0x8d,
- 0x01,0x04,0x5f,0xbf,0x82,0x64,0x20,0x8d,
- 0x01,0x04,0x60,0x03,0x35,0xfe,0x20,0x8d,
- 0x01,0x04,0x61,0x4b,0x90,0x09,0x20,0x8d,
- 0x01,0x04,0x62,0x11,0x5f,0x5d,0x20,0x8d,
- 0x01,0x04,0x62,0x80,0xe6,0xba,0x20,0x8d,
- 0x01,0x04,0x62,0xa3,0xf2,0x95,0x20,0x8d,
- 0x01,0x04,0x62,0xe5,0x7e,0x17,0x20,0x8d,
- 0x01,0x04,0x63,0xe9,0x14,0xd7,0x20,0x8d,
- 0x01,0x04,0x63,0xf6,0x57,0x02,0x20,0x8d,
- 0x01,0x04,0x65,0x33,0x8a,0xc2,0x20,0x8d,
- 0x01,0x04,0x66,0x82,0x71,0x5e,0x20,0x8d,
- 0x01,0x04,0x67,0x63,0xaa,0xd2,0x20,0x8d,
- 0x01,0x04,0x67,0x63,0xaa,0xdc,0x20,0x8d,
- 0x01,0x04,0x67,0x9c,0xa5,0xab,0x20,0x8d,
- 0x01,0x04,0x67,0xdb,0xa9,0x31,0x20,0x8d,
- 0x01,0x04,0x68,0xab,0xca,0xf4,0x20,0x8d,
- 0x01,0x04,0x68,0xe1,0xdc,0x21,0x20,0x8d,
- 0x01,0x04,0x68,0xf4,0x49,0x06,0x20,0x8d,
- 0x01,0x04,0x68,0xf4,0x4f,0x83,0x20,0x8d,
- 0x01,0x04,0x6c,0x31,0x41,0x84,0x20,0x8d,
- 0x01,0x04,0x6d,0x56,0x3c,0x21,0x20,0x8d,
- 0x01,0x04,0x6d,0x5b,0x8d,0x91,0x20,0x8d,
- 0x01,0x04,0x6d,0x63,0x3f,0x9f,0x20,0x8d,
- 0x01,0x04,0x6d,0x78,0xc2,0x88,0x20,0x8d,
- 0x01,0x04,0x6d,0xc4,0x7c,0xb6,0x20,0x8d,
- 0x01,0x04,0x6d,0xc9,0xa8,0x20,0x20,0x8d,
+ 0x01,0x04,0x5f,0xa9,0xc4,0xf7,0x20,0x8d,
+ 0x01,0x04,0x5f,0xd3,0x98,0x64,0x20,0x8d,
+ 0x01,0x04,0x5f,0xd5,0x91,0xda,0x20,0x8d,
+ 0x01,0x04,0x60,0x29,0x85,0x3a,0x20,0x8d,
+ 0x01,0x04,0x60,0x4a,0xb3,0x84,0x20,0x8d,
+ 0x01,0x04,0x61,0x71,0x8c,0xdf,0x20,0x8d,
+ 0x01,0x04,0x62,0x0d,0x4d,0x40,0x20,0x8d,
+ 0x01,0x04,0x62,0x9c,0x6c,0xd3,0x20,0x8d,
+ 0x01,0x04,0x63,0x5f,0x36,0x9f,0x20,0x8d,
+ 0x01,0x04,0x63,0xe5,0x6a,0xe1,0x20,0x8d,
+ 0x01,0x04,0x63,0xf0,0x62,0x24,0x20,0x8d,
+ 0x01,0x04,0x65,0x20,0x7f,0x8f,0x20,0x8d,
+ 0x01,0x04,0x65,0x64,0x8b,0xf9,0x20,0x8d,
+ 0x01,0x04,0x67,0x25,0xcd,0x2f,0x20,0x8d,
+ 0x01,0x04,0x67,0x2d,0xf7,0xca,0x20,0x8d,
+ 0x01,0x04,0x67,0x4c,0xcd,0xd5,0x20,0x8d,
+ 0x01,0x04,0x67,0x63,0xa9,0x6e,0x20,0x8d,
+ 0x01,0x04,0x67,0x65,0xcb,0x2c,0x20,0x8d,
+ 0x01,0x04,0x67,0xe7,0x2a,0x24,0x20,0x8d,
+ 0x01,0x04,0x67,0xe9,0x53,0x1c,0x20,0x8d,
+ 0x01,0x04,0x68,0x80,0x40,0x3a,0x20,0x8d,
+ 0x01,0x04,0x68,0x80,0xc9,0xb7,0x20,0x8d,
+ 0x01,0x04,0x68,0xac,0xeb,0xe3,0x20,0x8d,
+ 0x01,0x04,0x68,0xdb,0xd6,0xd3,0x20,0x8d,
+ 0x01,0x04,0x68,0xdd,0x22,0xe2,0x20,0x8d,
+ 0x01,0x04,0x68,0xe5,0x65,0x4e,0x20,0x8d,
+ 0x01,0x04,0x68,0xee,0xdc,0xc7,0x20,0x8d,
+ 0x01,0x04,0x6b,0x94,0x38,0x51,0x20,0x8d,
+ 0x01,0x04,0x6b,0x94,0x44,0xae,0x20,0x8d,
+ 0x01,0x04,0x6b,0x9b,0x43,0xd2,0x20,0x8d,
+ 0x01,0x04,0x6b,0xbf,0x21,0x52,0x20,0x8d,
+ 0x01,0x04,0x6c,0x1a,0x95,0xa1,0x20,0x8d,
+ 0x01,0x04,0x6c,0xe1,0xc3,0x35,0x20,0x8d,
+ 0x01,0x04,0x6d,0x96,0x81,0xe3,0x20,0x8d,
+ 0x01,0x04,0x6d,0xcf,0x4f,0xf8,0x20,0x8d,
0x01,0x04,0x6d,0xe0,0x54,0x95,0x20,0x8d,
- 0x01,0x04,0x6f,0x5a,0x8c,0x2e,0x20,0x8d,
- 0x01,0x04,0x70,0x8b,0x0a,0x19,0x20,0x8d,
- 0x01,0x04,0x72,0x22,0x82,0xce,0x20,0x8d,
- 0x01,0x04,0x74,0x3a,0xab,0x43,0x20,0x8d,
+ 0x01,0x04,0x6d,0xeb,0xf7,0x7a,0x20,0x8d,
+ 0x01,0x04,0x6f,0x5a,0x9e,0x7b,0x20,0x8d,
+ 0x01,0x04,0x6f,0x5a,0x9e,0x89,0x20,0x8d,
+ 0x01,0x04,0x73,0x8c,0x7c,0x63,0x20,0x8d,
0x01,0x04,0x74,0x56,0xc3,0xc0,0x20,0x8d,
- 0x01,0x04,0x77,0x1f,0xb3,0xca,0x20,0x8d,
- 0x01,0x04,0x77,0x2a,0x37,0xcb,0x20,0x8d,
+ 0x01,0x04,0x75,0x30,0x85,0x43,0x20,0x8d,
+ 0x01,0x04,0x76,0x18,0x25,0xfd,0x20,0x8d,
0x01,0x04,0x78,0xe2,0x27,0x64,0x20,0x8d,
- 0x01,0x04,0x78,0xe2,0x27,0x67,0x20,0x8d,
- 0x01,0x04,0x79,0x06,0x45,0x49,0x20,0x8d,
- 0x01,0x04,0x79,0x63,0xf0,0x57,0x20,0x8d,
- 0x01,0x04,0x7a,0x94,0x93,0x88,0x20,0x8d,
- 0x01,0x04,0x7a,0xc7,0x28,0x15,0x20,0x8d,
- 0x01,0x04,0x7b,0x3c,0xd5,0xc0,0x20,0x8d,
- 0x01,0x04,0x7b,0xca,0xc1,0x79,0x20,0x8d,
- 0x01,0x04,0x7c,0xaa,0xb6,0xc2,0x20,0x8d,
- 0x01,0x04,0x7c,0xc5,0x36,0x71,0x20,0x8d,
- 0x01,0x04,0x7d,0xa8,0x6e,0x1c,0x20,0x8d,
- 0x01,0x04,0x7d,0xe3,0xb2,0x44,0x20,0x8d,
+ 0x01,0x04,0x79,0x62,0x16,0x93,0x20,0x8d,
+ 0x01,0x04,0x7a,0x28,0x19,0x39,0x20,0x8d,
+ 0x01,0x04,0x80,0x00,0x62,0xd6,0x20,0x8d,
0x01,0x04,0x80,0x00,0xbe,0x1a,0x20,0x8d,
- 0x01,0x04,0x81,0x0d,0xbd,0xd7,0x20,0x8d,
- 0x01,0x04,0x82,0x2c,0xb0,0x6f,0x20,0x8d,
- 0x01,0x04,0x82,0xcc,0xa1,0x03,0x20,0x8d,
- 0x01,0x04,0x83,0x99,0xe8,0x8b,0x20,0x8d,
- 0x01,0x04,0x83,0xbc,0x28,0x2f,0x20,0x8d,
+ 0x01,0x04,0x80,0x02,0x0c,0x26,0x20,0x8d,
+ 0x01,0x04,0x81,0x0a,0x55,0x67,0x20,0x8d,
+ 0x01,0x04,0x81,0x50,0xc0,0x14,0x20,0x8d,
+ 0x01,0x04,0x81,0x7e,0xac,0x73,0x20,0x8d,
+ 0x01,0x04,0x82,0xb4,0xd3,0x7b,0x20,0x8d,
+ 0x01,0x04,0x82,0xfa,0x07,0xfc,0x20,0x8d,
+ 0x01,0x04,0x83,0x99,0xcb,0xcd,0x20,0x8d,
+ 0x01,0x04,0x83,0x99,0xe8,0xc7,0x20,0x8d,
+ 0x01,0x04,0x83,0x99,0xee,0x79,0x20,0x8d,
+ 0x01,0x04,0x85,0x03,0xf9,0x9b,0x20,0x8d,
+ 0x01,0x04,0x85,0x05,0xa5,0xc7,0x20,0x8d,
+ 0x01,0x04,0x85,0x7d,0x32,0xb4,0x20,0x8d,
0x01,0x04,0x86,0x41,0xc1,0x95,0x20,0x8d,
- 0x01,0x04,0x87,0x13,0x29,0xd0,0x20,0x8d,
- 0x01,0x04,0x87,0x13,0xfd,0x65,0x20,0x8d,
- 0x01,0x04,0x87,0x17,0xcc,0x62,0x20,0x8d,
- 0x01,0x04,0x87,0xb5,0xd7,0xed,0x20,0x8d,
- 0x01,0x04,0x88,0x37,0x2e,0x0f,0x20,0x8d,
- 0x01,0x04,0x88,0x3e,0x3a,0xe0,0x20,0x8d,
- 0x01,0x04,0x88,0xaf,0x08,0xaf,0x20,0x8d,
- 0x01,0x04,0x88,0xf4,0x13,0x7e,0x20,0x8d,
- 0x01,0x04,0x89,0xe2,0x22,0x2e,0x20,0x8d,
- 0x01,0x04,0x8a,0x3b,0x14,0xd1,0x20,0x8d,
- 0x01,0x04,0x8b,0x3b,0x46,0xa3,0x20,0x8d,
- 0x01,0x04,0x8c,0xee,0xdc,0x63,0x20,0x8d,
- 0x01,0x04,0x8d,0xc1,0x44,0x0b,0x20,0x8d,
- 0x01,0x04,0x8e,0x36,0xb5,0xda,0x20,0x8d,
+ 0x01,0x04,0x86,0xc3,0xc4,0x41,0x20,0x8d,
+ 0x01,0x04,0x88,0x31,0x1f,0x58,0x20,0x8d,
+ 0x01,0x04,0x88,0x3e,0x98,0xfb,0x20,0x8d,
+ 0x01,0x04,0x88,0xa9,0x34,0x8b,0x20,0x8d,
+ 0x01,0x04,0x8a,0x02,0x6e,0xd8,0x20,0x8d,
+ 0x01,0x04,0x8a,0x4b,0x83,0x30,0x20,0x8d,
+ 0x01,0x04,0x8c,0xba,0xc7,0x0e,0x20,0x8d,
+ 0x01,0x04,0x8d,0x00,0x9b,0x13,0x20,0x8d,
0x01,0x04,0x8e,0x73,0x8c,0x02,0x20,0x8d,
- 0x01,0x04,0x8e,0xbc,0x7d,0xc8,0x20,0x8d,
- 0x01,0x04,0x8f,0x6e,0xfc,0x7c,0x20,0x8d,
- 0x01,0x04,0x90,0x18,0xec,0x40,0x20,0x8d,
- 0x01,0x04,0x90,0x89,0x1d,0xb5,0x20,0x8d,
- 0x01,0x04,0x92,0x47,0x45,0x67,0x20,0x8d,
- 0x01,0x04,0x95,0x1c,0x9f,0x8d,0x20,0x8d,
- 0x01,0x04,0x95,0x8f,0x20,0x1a,0x20,0x8d,
- 0x01,0x04,0x95,0xca,0x4f,0xc7,0x20,0x8d,
- 0x01,0x04,0x95,0xf8,0x01,0xfe,0x20,0x8d,
- 0x01,0x04,0x97,0xf8,0xdd,0xc5,0x20,0x8d,
- 0x01,0x04,0x98,0x2c,0x89,0x53,0x20,0x8d,
- 0x01,0x04,0x98,0xe6,0xb4,0x73,0x20,0x8d,
- 0x01,0x04,0x9a,0x1a,0x89,0x69,0x20,0x8d,
- 0x01,0x04,0x9a,0x5c,0x6f,0x64,0x20,0x8d,
- 0x01,0x04,0x9d,0x83,0x14,0xae,0x20,0x8d,
- 0x01,0x04,0x9e,0x81,0x8c,0xc9,0x20,0x8d,
- 0x01,0x04,0x9e,0xb5,0x72,0xc4,0x20,0x8d,
- 0x01,0x04,0x9e,0xdc,0x55,0x52,0x20,0x8d,
- 0x01,0x04,0x9e,0xdc,0x79,0x5d,0x20,0x8d,
- 0x01,0x04,0x9f,0x02,0xbf,0xaf,0x20,0x8d,
- 0x01,0x04,0x9f,0xe0,0xee,0x91,0x20,0x8d,
- 0x01,0x04,0xa1,0x61,0xa7,0x0a,0x20,0x8d,
- 0x01,0x04,0xa2,0xd5,0x77,0x0c,0x20,0x8d,
- 0x01,0x04,0xa2,0xe2,0x3d,0x08,0x20,0x8d,
- 0x01,0x04,0xa2,0xfe,0xab,0xd1,0x20,0x8d,
- 0x01,0x04,0xa3,0x72,0x9f,0xcd,0x20,0x8d,
- 0x01,0x04,0xa3,0xac,0x54,0x86,0x20,0x8d,
- 0x01,0x04,0xa5,0xff,0xf1,0xb8,0x20,0x8d,
- 0x01,0x04,0xa7,0xb3,0x93,0x9b,0x20,0x8d,
- 0x01,0x04,0xa9,0x96,0xce,0xce,0x20,0x8d,
- 0x01,0x04,0xaa,0x11,0x97,0xeb,0x20,0x8d,
- 0x01,0x04,0xaa,0xfe,0x93,0x74,0x20,0x8d,
- 0x01,0x04,0xac,0x5c,0x66,0x73,0x20,0x8d,
- 0x01,0x04,0xac,0x69,0x15,0xd8,0x20,0x8d,
- 0x01,0x04,0xac,0xdb,0xe5,0xfc,0x20,0x8d,
- 0x01,0x04,0xac,0xfb,0x65,0x1b,0x20,0x8d,
- 0x01,0x04,0xad,0x0c,0x77,0x85,0x20,0x8d,
- 0x01,0x04,0xad,0x13,0xb0,0xe4,0x20,0x8d,
+ 0x01,0x04,0x8e,0xca,0x30,0x7c,0x20,0x8d,
+ 0x01,0x04,0x8f,0x00,0x8e,0x9c,0x20,0x8d,
+ 0x01,0x04,0x90,0x02,0x68,0x23,0x20,0x8d,
+ 0x01,0x04,0x90,0x02,0x68,0xbd,0x20,0x8d,
+ 0x01,0x04,0x90,0x7e,0x93,0xfc,0x20,0x8d,
+ 0x01,0x04,0x93,0x1c,0xd3,0x4b,0x20,0x8d,
+ 0x01,0x04,0x93,0x20,0x5f,0x3e,0x20,0x8d,
+ 0x01,0x04,0x95,0x07,0xd8,0xb2,0x20,0x8d,
+ 0x01,0x04,0x95,0x1c,0x74,0x22,0x20,0x8d,
+ 0x01,0x04,0x95,0x32,0x65,0x0f,0x20,0x8d,
+ 0x01,0x04,0x95,0x32,0x65,0x1c,0x20,0x8d,
+ 0x01,0x04,0x98,0x75,0x58,0x2b,0x20,0x8d,
+ 0x01,0x04,0x98,0xa5,0x26,0xa0,0x20,0x8d,
+ 0x01,0x04,0x99,0x5c,0x5d,0x72,0x20,0x8d,
+ 0x01,0x04,0x9a,0x07,0x01,0x72,0x20,0x8d,
+ 0x01,0x04,0x9a,0x1a,0x82,0x5f,0x20,0x8d,
+ 0x01,0x04,0x9a,0x1a,0x9a,0x49,0x20,0x8d,
+ 0x01,0x04,0x9a,0x26,0xa7,0x98,0x20,0x8d,
+ 0x01,0x04,0x9a,0x41,0x0e,0x13,0x20,0x8d,
+ 0x01,0x04,0x9b,0x04,0x8e,0x21,0x20,0x8d,
+ 0x01,0x04,0x9d,0x8f,0x15,0x66,0x20,0x8d,
+ 0x01,0x04,0x9d,0x93,0x83,0xfb,0x20,0x8d,
+ 0x01,0x04,0x9e,0xf8,0x22,0x8d,0x20,0x8d,
+ 0x01,0x04,0x9f,0x8a,0x57,0x12,0x20,0x8d,
+ 0x01,0x04,0x9f,0xc4,0xe3,0xc4,0x20,0x8d,
+ 0x01,0x04,0x9f,0xf6,0x19,0x35,0x20,0x8d,
+ 0x01,0x04,0xa0,0x10,0x6e,0x06,0x20,0x8d,
+ 0x01,0x04,0xa0,0x50,0x0c,0x10,0x20,0x8d,
+ 0x01,0x04,0xa0,0x50,0x61,0x42,0x20,0x8d,
+ 0x01,0x04,0xa1,0x61,0x97,0x09,0x20,0x8d,
+ 0x01,0x04,0xa2,0x00,0xe2,0x3c,0x20,0x8d,
+ 0x01,0x04,0xa2,0x37,0x7a,0x5d,0x20,0x8d,
+ 0x01,0x04,0xa2,0xdb,0x26,0x5e,0x20,0x8d,
+ 0x01,0x04,0xa2,0xf5,0xc4,0x2d,0x20,0x8d,
+ 0x01,0x04,0xa4,0x98,0xa7,0xd0,0x20,0x8d,
+ 0x01,0x04,0xa5,0x16,0xe5,0x58,0x20,0x8d,
+ 0x01,0x04,0xa6,0x46,0xd3,0x4e,0x20,0x8d,
+ 0x01,0x04,0xa6,0x4e,0xf1,0x14,0x20,0x8d,
+ 0x01,0x04,0xa6,0x4e,0xf1,0x19,0x20,0x8d,
+ 0x01,0x04,0xa7,0x58,0x0b,0xcb,0x20,0x8d,
+ 0x01,0x04,0xa7,0xf8,0xb9,0xc4,0x20,0x8d,
+ 0x01,0x04,0xa9,0x9b,0xaa,0xd3,0x20,0x8d,
+ 0x01,0x04,0xab,0x65,0x49,0x80,0x20,0x8d,
+ 0x01,0x04,0xac,0x51,0xb6,0xf0,0x20,0x8d,
+ 0x01,0x04,0xac,0x5c,0x1f,0x2d,0x20,0x8d,
+ 0x01,0x04,0xac,0x5d,0x6a,0x55,0x20,0x8d,
+ 0x01,0x04,0xac,0xe9,0xd3,0xab,0x20,0x8d,
+ 0x01,0x04,0xac,0xea,0x5f,0x23,0x20,0x8d,
+ 0x01,0x04,0xac,0xf1,0x46,0xec,0x20,0x8d,
+ 0x01,0x04,0xad,0x42,0xc5,0x13,0x20,0x8d,
+ 0x01,0x04,0xad,0x57,0xea,0xdc,0x20,0x8d,
0x01,0x04,0xad,0xb5,0x23,0x32,0x20,0x8d,
- 0x01,0x04,0xad,0xd4,0x62,0x00,0x20,0x8d,
- 0x01,0x04,0xad,0xf1,0xe3,0xf3,0x20,0x8d,
- 0x01,0x04,0xad,0xf6,0x1f,0x72,0x20,0x8d,
- 0x01,0x04,0xae,0x14,0x39,0x1e,0x20,0x8d,
- 0x01,0x04,0xaf,0x1b,0xf7,0x68,0x20,0x8d,
- 0x01,0x04,0xaf,0x88,0xae,0xae,0x20,0x8d,
- 0x01,0x04,0xb0,0x09,0x11,0x79,0x20,0x8d,
- 0x01,0x04,0xb0,0x25,0x52,0x53,0x20,0x8d,
+ 0x01,0x04,0xad,0xb7,0x82,0x2f,0x20,0x8d,
+ 0x01,0x04,0xad,0xc5,0xf4,0x9d,0x20,0x8d,
+ 0x01,0x04,0xae,0x15,0x4c,0x08,0x20,0x8d,
+ 0x01,0x04,0xae,0x39,0x88,0x48,0x20,0x8d,
+ 0x01,0x04,0xae,0x3f,0xab,0x4c,0x20,0x8d,
+ 0x01,0x04,0xae,0x58,0xf3,0x5e,0x20,0x8d,
+ 0x01,0x04,0xaf,0x6e,0x73,0x78,0x20,0x8d,
0x01,0x04,0xb0,0x4a,0x88,0xed,0x20,0x8d,
+ 0x01,0x04,0xb0,0x63,0x02,0x5a,0x20,0x8d,
+ 0x01,0x04,0xb0,0x72,0xf8,0xe1,0x20,0x8d,
0x01,0x04,0xb0,0x76,0xdc,0x1d,0x20,0x8d,
- 0x01,0x04,0xb0,0x8a,0xe9,0xa6,0x20,0x8d,
- 0x01,0x04,0xb1,0x20,0x32,0xa7,0x20,0x8d,
- 0x01,0x04,0xb2,0x15,0x76,0xb2,0x20,0x8d,
- 0x01,0x04,0xb2,0x29,0x0b,0xfe,0x20,0x8d,
- 0x01,0x04,0xb2,0x4f,0x53,0x93,0x20,0x8d,
- 0x01,0x04,0xb2,0x58,0xbd,0xfe,0x20,0x8d,
- 0x01,0x04,0xb2,0x9a,0xde,0x68,0x20,0x8d,
- 0x01,0x04,0xb2,0x9f,0x62,0x85,0x20,0x8d,
- 0x01,0x04,0xb2,0xc6,0x17,0x78,0x20,0x8d,
- 0x01,0x04,0xb2,0xfa,0xe8,0x6f,0x20,0x8d,
- 0x01,0x04,0xb6,0xe5,0x91,0xa1,0x20,0x8d,
+ 0x01,0x04,0xb0,0x7e,0x74,0x07,0x20,0x8d,
+ 0x01,0x04,0xb0,0x88,0xf3,0x3f,0x20,0x8d,
+ 0x01,0x04,0xb0,0xcd,0x9e,0xc6,0x20,0x8d,
+ 0x01,0x04,0xb2,0x26,0x06,0x34,0x20,0x8d,
0x01,0x04,0xb7,0x58,0xdf,0xd0,0x20,0x8d,
- 0x01,0x04,0xb7,0x81,0xb2,0xcd,0x20,0x8d,
- 0x01,0x04,0xb9,0x19,0x30,0xb8,0x20,0x8d,
+ 0x01,0x04,0xb8,0x38,0x7a,0x45,0x20,0x8d,
+ 0x01,0x04,0xb8,0x5f,0x20,0x82,0x20,0x8d,
+ 0x01,0x04,0xb8,0x69,0x83,0xb5,0x20,0x8d,
+ 0x01,0x04,0xb8,0xab,0xd0,0x6d,0x20,0x8d,
+ 0x01,0x04,0xb9,0x08,0x6a,0xb3,0x20,0x8d,
+ 0x01,0x04,0xb9,0x0b,0x3d,0x21,0x20,0x8d,
+ 0x01,0x04,0xb9,0x13,0x1e,0xf2,0x20,0x8d,
0x01,0x04,0xb9,0x1a,0x63,0xab,0x20,0x8d,
+ 0x01,0x04,0xb9,0x1f,0x88,0xa6,0x20,0x8d,
0x01,0x04,0xb9,0x1f,0x88,0xf6,0x20,0x8d,
- 0x01,0x04,0xb9,0x34,0x5d,0x2d,0x20,0x8d,
- 0x01,0x04,0xb9,0x45,0x35,0x99,0x20,0x8d,
- 0x01,0x04,0xb9,0x54,0xe0,0x74,0x20,0x8d,
- 0x01,0x04,0xb9,0x6b,0x53,0x37,0x20,0x8d,
- 0x01,0x04,0xb9,0x74,0x5e,0xef,0x20,0x8d,
- 0x01,0x04,0xb9,0x8c,0xd1,0x9f,0x20,0x8d,
+ 0x01,0x04,0xb9,0x3f,0x61,0xd8,0x20,0x8d,
+ 0x01,0x04,0xb9,0x40,0x7d,0x10,0x20,0x8d,
+ 0x01,0x04,0xb9,0x41,0x5d,0x68,0x20,0x8d,
+ 0x01,0x04,0xb9,0x44,0x43,0x2a,0x20,0x8d,
+ 0x01,0x04,0xb9,0x46,0x2b,0xc1,0x20,0x8d,
+ 0x01,0x04,0xb9,0x4e,0xd1,0x1c,0x20,0x8d,
+ 0x01,0x04,0xb9,0x58,0xe5,0xfe,0x20,0x8d,
+ 0x01,0x04,0xb9,0x70,0x90,0x77,0x20,0x8d,
+ 0x01,0x04,0xb9,0x89,0xad,0x7d,0x20,0x8d,
+ 0x01,0x04,0xb9,0x8c,0xf6,0x8c,0x20,0x8d,
+ 0x01,0x04,0xb9,0x90,0x53,0x83,0x20,0x8d,
0x01,0x04,0xb9,0x94,0x03,0xe3,0x20,0x8d,
- 0x01,0x04,0xb9,0x98,0x8a,0x4a,0x20,0x8d,
- 0x01,0x04,0xb9,0x99,0xc4,0x0e,0x20,0x8d,
- 0x01,0x04,0xb9,0x99,0xc4,0xa2,0x20,0x8d,
- 0x01,0x04,0xb9,0x9c,0x25,0x1e,0x20,0x8d,
- 0x01,0x04,0xb9,0x9c,0x9a,0x81,0x20,0x8d,
- 0x01,0x04,0xb9,0x9e,0x71,0xac,0x20,0x8d,
- 0x01,0x04,0xb9,0xa5,0xaa,0x13,0x20,0x8d,
- 0x01,0x04,0xb9,0xbe,0x18,0x48,0x20,0x8d,
- 0x01,0x04,0xb9,0xc7,0xd1,0x34,0x20,0x8d,
- 0x01,0x04,0xb9,0xcb,0x29,0x94,0x20,0x8d,
+ 0x01,0x04,0xb9,0x96,0xa2,0x6f,0x20,0x8d,
+ 0x01,0x04,0xb9,0x9c,0xca,0x23,0x20,0x8d,
+ 0x01,0x04,0xb9,0xa3,0x2c,0x24,0x20,0x8d,
+ 0x01,0x04,0xb9,0xc5,0x1e,0x42,0x20,0x8d,
+ 0x01,0x04,0xb9,0xc5,0xa0,0x3d,0x20,0x8d,
0x01,0x04,0xb9,0xd1,0x0c,0x4c,0x20,0x8d,
- 0x01,0x04,0xb9,0xd2,0x7d,0x21,0x20,0x8d,
- 0x01,0x04,0xb9,0xe9,0xbd,0xd2,0x20,0x8d,
- 0x01,0x04,0xb9,0xfa,0x24,0x42,0x20,0x8d,
- 0x01,0x04,0xb9,0xfe,0x61,0xa4,0x20,0x8d,
- 0x01,0x04,0xba,0xeb,0x56,0xf9,0x20,0x8d,
- 0x01,0x04,0xbc,0x1b,0x4f,0xeb,0x20,0x8d,
- 0x01,0x04,0xbc,0x23,0xa7,0x0e,0x20,0x8d,
- 0x01,0x04,0xbc,0x44,0x35,0x2c,0x20,0x8d,
- 0x01,0x04,0xbc,0x77,0x43,0x89,0x20,0x8d,
- 0x01,0x04,0xbc,0x7f,0xf3,0x29,0x20,0x8d,
+ 0x01,0x04,0xb9,0xef,0xdd,0x17,0x20,0x8d,
+ 0x01,0x04,0xb9,0xf3,0xda,0x13,0x20,0x8d,
+ 0x01,0x04,0xb9,0xf3,0xda,0x6a,0x20,0x8d,
+ 0x01,0x04,0xb9,0xf8,0xa0,0xa3,0x20,0x8d,
+ 0x01,0x04,0xbc,0x0c,0x95,0xd8,0x20,0x8d,
+ 0x01,0x04,0xbc,0x3f,0x9e,0xc0,0x20,0x8d,
+ 0x01,0x04,0xbc,0x8a,0x58,0x2f,0x20,0x8d,
0x01,0x04,0xbc,0x8a,0x70,0x3c,0x20,0x8d,
- 0x01,0x04,0xbc,0x8e,0xc7,0x11,0x20,0x8d,
- 0x01,0x04,0xbc,0x9b,0x48,0xa0,0x20,0x8d,
- 0x01,0x04,0xbc,0xd6,0x81,0x34,0x20,0x8d,
- 0x01,0x04,0xbc,0xd6,0x81,0x8b,0x20,0x8d,
- 0x01,0x04,0xbc,0xd7,0x3e,0x7a,0x20,0x8d,
- 0x01,0x04,0xbc,0xed,0xa7,0x33,0x20,0x8d,
- 0x01,0x04,0xbc,0xf6,0xe0,0x0c,0x20,0x8d,
- 0x01,0x04,0xbd,0x06,0xdd,0x25,0x20,0x8d,
- 0x01,0x04,0xbe,0x02,0x92,0x5a,0x20,0x8d,
- 0x01,0x04,0xbe,0x11,0x12,0xbe,0x20,0x8d,
- 0x01,0x04,0xbe,0xd2,0x62,0xfd,0x20,0x8d,
- 0x01,0x04,0xc0,0x03,0x0b,0x18,0x20,0x8d,
- 0x01,0x04,0xc0,0x45,0x35,0x12,0x20,0x8d,
- 0x01,0x04,0xc0,0x92,0x89,0x2c,0x20,0x8d,
- 0x01,0x04,0xc1,0x16,0x80,0x0c,0x20,0x8d,
- 0x01,0x04,0xc1,0x27,0x8e,0x59,0x20,0x8d,
- 0x01,0x04,0xc1,0x2e,0x4a,0xfc,0x20,0x8d,
- 0x01,0x04,0xc1,0x2e,0x4a,0xfe,0x20,0x8d,
- 0x01,0x04,0xc1,0x5f,0xf9,0x03,0x20,0x8d,
- 0x01,0x04,0xc1,0x95,0xb0,0xc8,0x20,0x8d,
- 0x01,0x04,0xc1,0x97,0x9b,0x7a,0x20,0x8d,
- 0x01,0x04,0xc1,0xbb,0x5a,0x7a,0x20,0x8d,
- 0x01,0x04,0xc1,0xc4,0x25,0x3e,0x20,0x8d,
- 0x01,0x04,0xc2,0x23,0xb8,0x5f,0x20,0x8d,
- 0x01,0x04,0xc2,0xa5,0x1e,0x14,0x20,0x8d,
- 0x01,0x04,0xc2,0xbf,0xe8,0x99,0x20,0x8d,
- 0x01,0x04,0xc3,0x20,0x6c,0xa4,0x20,0x8d,
- 0x01,0x04,0xc3,0x38,0x3f,0x0b,0x20,0x8d,
+ 0x01,0x04,0xbc,0xd5,0x5c,0x27,0x20,0x8d,
+ 0x01,0x04,0xbc,0xf3,0x47,0x91,0x20,0x8d,
+ 0x01,0x04,0xbd,0x20,0x88,0x09,0x20,0x8d,
+ 0x01,0x04,0xbe,0x35,0x64,0x22,0x20,0x8d,
+ 0x01,0x04,0xbe,0x40,0x86,0x34,0x20,0x8d,
+ 0x01,0x04,0xbf,0x0d,0x80,0x3a,0x20,0x8d,
+ 0x01,0x04,0xbf,0xfb,0x20,0xa2,0x20,0x8d,
+ 0x01,0x04,0xbf,0xff,0xdd,0x25,0x20,0x8d,
+ 0x01,0x04,0xc0,0x03,0x0b,0x14,0x20,0x8d,
+ 0x01,0x04,0xc0,0x03,0x0b,0x1a,0x20,0x8d,
+ 0x01,0x04,0xc0,0x22,0x57,0x56,0x20,0x8d,
+ 0x01,0x04,0xc0,0xa1,0x30,0x2f,0x20,0x8d,
+ 0x01,0x04,0xc0,0xbb,0x79,0x2e,0x20,0x8d,
+ 0x01,0x04,0xc0,0xe3,0x49,0x09,0x20,0x8d,
+ 0x01,0x04,0xc0,0xf3,0xd7,0x66,0x20,0x8d,
+ 0x01,0x04,0xc1,0x16,0x80,0x17,0x20,0x8d,
+ 0x01,0x04,0xc1,0x48,0x20,0xbb,0x20,0x8d,
+ 0x01,0x04,0xc1,0x54,0x74,0x16,0x20,0x8d,
+ 0x01,0x04,0xc1,0xb0,0x01,0x4a,0x20,0x8d,
+ 0x01,0x04,0xc1,0xc8,0xce,0x0e,0x20,0x8d,
+ 0x01,0x04,0xc1,0xda,0x76,0x0d,0x20,0x8d,
+ 0x01,0x04,0xc1,0xde,0x82,0x0e,0x20,0x8d,
+ 0x01,0x04,0xc2,0x00,0x9d,0x06,0x20,0x8d,
+ 0x01,0x04,0xc2,0x0e,0xf6,0x09,0x20,0x8d,
+ 0x01,0x04,0xc2,0x43,0x40,0xe5,0x20,0x8d,
+ 0x01,0x04,0xc2,0x43,0xd0,0xbf,0x20,0x8d,
0x01,0x04,0xc3,0x38,0x3f,0x0c,0x20,0x8d,
- 0x01,0x04,0xc3,0x7b,0xd9,0x3f,0x20,0x8d,
- 0x01,0x04,0xc3,0x80,0xf8,0x99,0x20,0x8d,
- 0x01,0x04,0xc3,0x8c,0xe2,0x9a,0x20,0x8d,
- 0x01,0x04,0xc3,0xa0,0xde,0x51,0x20,0x8d,
- 0x01,0x04,0xc3,0xce,0x69,0x07,0x20,0x8d,
+ 0x01,0x04,0xc3,0x9a,0xac,0xb1,0x20,0x8d,
+ 0x01,0x04,0xc3,0xb5,0xf5,0x95,0x20,0x8d,
+ 0x01,0x04,0xc3,0xbd,0x61,0x26,0x20,0x8d,
+ 0x01,0x04,0xc5,0x9b,0x06,0x2b,0x20,0x8d,
+ 0x01,0x04,0xc6,0x1b,0xae,0x8c,0x20,0x8d,
+ 0x01,0x04,0xc6,0x62,0x75,0xee,0x20,0x8d,
+ 0x01,0x04,0xc6,0x9a,0x5d,0x6e,0x20,0x8d,
+ 0x01,0x04,0xc7,0x07,0x90,0x97,0x20,0x8d,
0x01,0x04,0xc7,0x24,0xfd,0xfc,0x20,0x8d,
- 0x01,0x04,0xc7,0x3a,0x64,0x73,0x20,0x8d,
- 0x01,0x04,0xca,0x5a,0xf2,0x5d,0x20,0x8d,
- 0x01,0x04,0xca,0x70,0xee,0x80,0x20,0x8d,
- 0x01,0x04,0xca,0xba,0x26,0x63,0x20,0x8d,
- 0x01,0x04,0xcb,0x0c,0x00,0xa7,0x20,0x8d,
- 0x01,0x04,0xcb,0x0c,0x0a,0xe0,0x20,0x8d,
- 0x01,0x04,0xcb,0xd2,0xc1,0x15,0x20,0x8d,
- 0x01,0x04,0xcc,0xe4,0x8e,0xd3,0x20,0x8d,
- 0x01,0x04,0xcd,0xb2,0xb6,0x85,0x20,0x8d,
- 0x01,0x04,0xce,0x37,0xb2,0x9d,0x20,0x8d,
- 0x01,0x04,0xce,0xc0,0xcb,0x00,0x20,0x8d,
- 0x01,0x04,0xcf,0x62,0xfd,0x58,0x20,0x8d,
- 0x01,0x04,0xcf,0x73,0x54,0x2f,0x20,0x8d,
- 0x01,0x04,0xcf,0xff,0xc1,0x2f,0x20,0x8d,
- 0x01,0x04,0xd0,0x68,0x5c,0x4a,0x20,0x8d,
- 0x01,0x04,0xd1,0x26,0xf4,0x57,0x20,0x8d,
- 0x01,0x04,0xd1,0xcc,0x1d,0x12,0x20,0x8d,
+ 0x01,0x04,0xc8,0x7a,0xb5,0x1a,0x20,0x8d,
+ 0x01,0x04,0xc8,0xb4,0xc5,0xbc,0x20,0x8d,
+ 0x01,0x04,0xca,0x07,0xfe,0xfa,0x20,0x8d,
+ 0x01,0x04,0xca,0xba,0x29,0xdb,0x20,0x8d,
+ 0x01,0x04,0xcb,0x0b,0x48,0x76,0x20,0x8d,
+ 0x01,0x04,0xcb,0x0b,0x48,0xc7,0x20,0x8d,
+ 0x01,0x04,0xcb,0x22,0x3a,0x2b,0x20,0x8d,
+ 0x01,0x04,0xcb,0x33,0x0b,0xa7,0x20,0x8d,
+ 0x01,0x04,0xcc,0x0f,0x0b,0x23,0x20,0x8d,
+ 0x01,0x04,0xcc,0xc2,0xdc,0x27,0x20,0x8d,
+ 0x01,0x04,0xcc,0xc2,0xdc,0x28,0x20,0x8d,
+ 0x01,0x04,0xce,0x7d,0xa9,0xa4,0x20,0x8d,
+ 0x01,0x04,0xce,0xcc,0x6a,0x08,0x20,0x8d,
+ 0x01,0x04,0xcf,0x42,0x47,0x2e,0x20,0x8d,
+ 0x01,0x04,0xcf,0x5a,0xc0,0x36,0x20,0x8d,
+ 0x01,0x04,0xcf,0xb6,0x92,0x82,0x20,0x8d,
+ 0x01,0x04,0xd0,0x5d,0xe7,0xf0,0x20,0x8d,
+ 0x01,0x04,0xd1,0x8d,0x25,0x39,0x20,0x8d,
+ 0x01,0x04,0xd1,0xb1,0x8a,0xf5,0x20,0x8d,
0x01,0x04,0xd1,0xcd,0xcc,0xda,0x20,0x8d,
- 0x01,0x04,0xd1,0xed,0x85,0x36,0x20,0x8d,
- 0x01,0x04,0xd2,0x06,0x5f,0x7f,0x20,0x8d,
- 0x01,0x04,0xd2,0xcd,0x92,0x72,0x20,0x8d,
0x01,0x04,0xd3,0xdd,0x2a,0x8f,0x20,0x8d,
- 0x01,0x04,0xd4,0x05,0x9d,0x28,0x20,0x8d,
- 0x01,0x04,0xd4,0x33,0x88,0x32,0x20,0x8d,
+ 0x01,0x04,0xd4,0x0a,0xe5,0xf0,0x20,0x8d,
+ 0x01,0x04,0xd4,0x1d,0x29,0x9e,0x20,0x8d,
+ 0x01,0x04,0xd4,0x33,0x81,0x3c,0x20,0x8d,
+ 0x01,0x04,0xd4,0x44,0xda,0x7c,0x20,0x8d,
0x01,0x04,0xd4,0x56,0x20,0x6a,0x20,0x8d,
- 0x01,0x04,0xd4,0xa2,0x98,0x95,0x20,0x8d,
- 0x01,0x04,0xd4,0xe3,0x96,0x93,0x20,0x8d,
- 0x01,0x04,0xd4,0xe3,0x9b,0xaa,0x20,0x8d,
- 0x01,0x04,0xd4,0xfb,0xa2,0xbe,0x20,0x8d,
- 0x01,0x04,0xd5,0x6d,0xec,0x81,0x20,0x8d,
- 0x01,0x04,0xd5,0x8d,0x9a,0xc9,0x20,0x8d,
- 0x01,0x04,0xd5,0xc1,0x53,0xfb,0x20,0x8d,
- 0x01,0x04,0xd5,0xc1,0x53,0xfc,0x20,0x8d,
- 0x01,0x04,0xd5,0xca,0xe1,0x7a,0x20,0x8d,
+ 0x01,0x04,0xd4,0x9e,0x85,0xb9,0x20,0x8d,
+ 0x01,0x04,0xd5,0xa5,0x5f,0x8e,0x20,0x8d,
+ 0x01,0x04,0xd5,0xae,0x9c,0x51,0x20,0x8d,
+ 0x01,0x04,0xd5,0xae,0x9c,0x56,0x20,0x8d,
+ 0x01,0x04,0xd5,0xd9,0xd2,0x5a,0x20,0x8d,
+ 0x01,0x04,0xd5,0xe3,0x93,0xf4,0x20,0x8d,
0x01,0x04,0xd8,0x53,0x96,0x8e,0x20,0x8d,
- 0x01,0x04,0xd8,0xba,0xec,0x62,0x20,0x8d,
- 0x01,0x04,0xd8,0xe8,0x21,0x18,0x20,0x8d,
+ 0x01,0x04,0xd8,0xe2,0x80,0xbd,0x20,0x8d,
+ 0x01,0x04,0xd9,0x0b,0xf0,0x04,0x20,0x8d,
+ 0x01,0x04,0xd9,0x14,0x83,0x40,0x20,0x8d,
0x01,0x04,0xd9,0x40,0x2f,0x8a,0x20,0x8d,
0x01,0x04,0xd9,0x40,0x2f,0xc8,0x20,0x8d,
- 0x01,0x04,0xd9,0x4c,0x3d,0x4e,0x20,0x8d,
- 0x01,0x04,0xd9,0x5c,0x37,0xf6,0x20,0x8d,
- 0x01,0x04,0xd9,0x71,0x79,0xa9,0x20,0x8d,
0x01,0x04,0xd9,0x9b,0xf4,0xaa,0x20,0x8d,
- 0x01,0x04,0xd9,0xaa,0x7c,0xaa,0x20,0x8d,
- 0x01,0x04,0xd9,0xad,0xec,0x19,0x20,0x8d,
- 0x01,0x04,0xd9,0xb4,0xc0,0x74,0x20,0x8d,
0x01,0x04,0xd9,0xb4,0xdd,0xa2,0x20,0x8d,
- 0x01,0x04,0xda,0x2b,0x7b,0xec,0x20,0x8d,
- 0x01,0x04,0xdb,0x4d,0x4f,0x80,0x20,0x8d,
- 0x01,0x04,0xdf,0x12,0xde,0xd2,0x20,0x8d,
- 0x01,0x04,0xdf,0xa7,0x4b,0xa5,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x16,0x20,0x55,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x2c,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x16,0x20,0x0a,0x21,0x00,0x00,0xda,0x5e,0xd3,0xff,0xfe,0xe3,0x68,0xa0,0x20,0x8d,
+ 0x01,0x04,0xd9,0xe6,0x2a,0x37,0x20,0x8d,
+ 0x01,0x04,0xdb,0x4f,0xc8,0xe9,0x20,0x8d,
+ 0x01,0x04,0xdc,0x5c,0x8d,0x54,0x20,0x8d,
+ 0x01,0x04,0xde,0xef,0xa6,0x6c,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x13,0xd8,0x1c,0x01,0x00,0x21,0x02,0x15,0x17,0xff,0xfe,0x63,0x2a,0x7e,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x15,0x28,0x01,0x11,0xff,0xff,0x02,0x14,0x00,0x00,0x00,0x00,0x02,0x07,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x16,0x20,0x54,0x2c,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x18,0xb8,0x00,0x00,0x01,0x00,0x00,0x00,0xb0,0x0b,0x04,0x20,0x00,0x69,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x00,0x4f,0x89,0x54,0x00,0x04,0xff,0xfe,0xa0,0x38,0x37,0x20,0x8d,
0x02,0x10,0x20,0x01,0x19,0xf0,0x44,0x01,0x0e,0x8a,0x54,0x00,0x04,0xff,0xfe,0x8e,0xd3,0x98,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x50,0x00,0x1a,0x80,0x54,0x00,0x04,0xff,0xfe,0x71,0xaa,0xc5,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x2b,0x12,0x54,0x00,0x04,0xff,0xfe,0x6e,0x3a,0xfe,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x5b,0x81,0x5e,0x6f,0x69,0xff,0xfe,0x57,0x94,0xd0,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x68,0x01,0x06,0xec,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0xc8,0x00,0x2c,0xe5,0x54,0x00,0x04,0xff,0xfe,0xd7,0x66,0x3d,0x20,0x8d,
0x02,0x10,0x20,0x01,0x1b,0xc0,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x1c,0x03,0x39,0x11,0xd9,0x00,0x4b,0x0c,0x05,0xf2,0x13,0x8a,0x52,0x12,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x1c,0x04,0x13,0x08,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x85,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x1c,0x04,0x40,0x08,0x63,0x00,0x8a,0x5f,0x26,0x78,0x11,0x4b,0xa6,0x60,0x20,0x8d,
0x02,0x10,0x20,0x01,0x40,0x60,0x44,0x19,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x8f,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x0e,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x03,0x3d,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x05,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x08,0x83,0xcf,0x19,0x5b,0xb2,0x02,0x92,0x71,0xcc,0x5b,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x08,0xed,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x0a,0x69,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x0a,0x6b,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1b,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1b,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x09,0x0b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x0a,0x08,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x1b,0x05,0xa6,0x02,0x16,0x3e,0xff,0xfe,0x24,0x11,0x62,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x75,0xe9,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x10,0x04,0x24,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x52,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0xba,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x03,0x14,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x03,0x0c,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x07,0x00,0x1c,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x07,0x00,0x70,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x0c,0x04,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x28,0x50,0x02,0x06,0x00,0x80,0xbe,0x7b,0xff,0xfe,0xc4,0x9c,0x43,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1a,0x34,0x00,0x02,0xa8,0x04,0x86,0xff,0xfe,0xc2,0x86,0x3a,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x26,0x04,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x7c,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x28,0x0b,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x71,0x03,0x58,0x60,0x83,0xbe,0x0b,0xcb,0xaa,0x0a,0x97,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x07,0x0b,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x88,0xff,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x8c,0xa0,0x00,0x02,0x76,0x46,0xa0,0xff,0xfe,0x9b,0xe6,0x62,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x8a,0x71,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x0a,0x0c,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x0c,0x10,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0xda,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x30,0xb7,0x1d,0x7b,0x6f,0xec,0x4c,0x5c,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x08,0x8e,0xb4,0xff,0x2a,0xd0,0x69,0x9b,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x9c,0x1c,0xcc,0x31,0x9f,0xe8,0x55,0x05,0x20,0x8d,
@@ -545,1257 +1080,1314 @@ static const uint8_t chainparams_seed_main[] = {
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0xfd,0x76,0xc1,0xd3,0x18,0x54,0x5b,0xd9,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x76,0x80,0x90,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x01,0xb9,0x77,0xbd,0x71,0x46,0x12,0x8e,0x40,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x4d,0xd0,0xaf,0x0e,0x35,0x64,0x00,0x00,0x00,0x69,0x00,0x90,0x83,0x33,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0xaf,0x0e,0x35,0x64,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x01,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0xaf,0x0e,0x35,0x64,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x90,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x05,0x60,0x44,0x1f,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xc7,0xf5,0x00,0x7a,0x0d,0x0d,0x50,0x25,0x5e,0xdb,0xac,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0x69,0x50,0x79,0xab,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xc7,0xf5,0x00,0x26,0x01,0x7c,0xdc,0x1a,0x2d,0x66,0x1c,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xc7,0xf5,0x01,0xe0,0xaf,0x00,0x1c,0x14,0x68,0xe2,0x72,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xdb,0x20,0x00,0x86,0x68,0xa7,0x02,0x0c,0x89,0xbd,0xd4,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xdb,0x20,0x00,0x86,0x7b,0x8a,0xa6,0x20,0x10,0x87,0x9a,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x60,0xc0,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x20,0x8d,
0x02,0x10,0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x40,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x47,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x38,0xa0,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x3d,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x48,0x28,0x00,0x01,0x31,0x4b,0x1f,0xf6,0xfc,0x20,0xf7,0xf9,0x9f,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x78,0x06,0x8c,0xff,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x95,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x78,0x0d,0x78,0x22,0xd0,0x50,0x65,0xc1,0xff,0xfe,0xf2,0x3f,0x65,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x12,0x20,0x08,0x08,0x00,0x00,0x00,0x00,0x93,0xe5,0x08,0x1f,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x12,0x54,0x00,0xd1,0xa7,0xb7,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x12,0x54,0x00,0xd2,0x6b,0x9c,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x20,0x01,0x06,0x7c,0x26,0xb4,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x06,0x7c,0x04,0x40,0x06,0x88,0x00,0x91,0x02,0x36,0x02,0x51,0x01,0x37,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x06,0x7c,0x04,0x40,0x06,0x88,0x00,0x91,0x02,0x36,0x02,0x51,0x01,0x39,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x2d,0xb8,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x20,0x8d,
0x02,0x10,0x20,0x01,0x07,0xc0,0x23,0x10,0x00,0x00,0xf8,0x16,0x3e,0xff,0xfe,0x6c,0x4f,0x58,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x08,0x61,0x0c,0x62,0x2f,0xd0,0xca,0x7f,0x54,0xff,0xfe,0xce,0x06,0xd9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x07,0xd0,0x84,0x10,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x88,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x80,0x03,0xd1,0x17,0x35,0x00,0xbf,0xc5,0x7e,0x90,0x9d,0xa5,0xa8,0xc0,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0x18,0xdf,0x59,0x58,0x00,0xf8,0xa4,0xce,0xff,0xfe,0xfd,0xd6,0x3a,0x20,0x8d,
0x02,0x10,0x20,0x01,0x08,0x71,0x02,0x3d,0xd5,0xd1,0x5a,0x47,0xca,0xff,0xfe,0x71,0x0c,0x8d,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0x71,0x02,0x5f,0xef,0x0d,0x5e,0x55,0xda,0xd6,0xfe,0x43,0x1e,0x63,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0xb0,0x13,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0xe0,0x14,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0xf8,0x1b,0x69,0x15,0xe5,0xda,0x9e,0xf3,0xff,0xfe,0x75,0xd1,0x0d,0x20,0x8d,
0x02,0x10,0x20,0x01,0x09,0x10,0x10,0x9d,0x2c,0x03,0xd2,0x17,0xc2,0xff,0xfe,0x07,0x2c,0xd9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0xb0,0x11,0x80,0x13,0x3a,0x06,0x0e,0x6a,0x7f,0x23,0x65,0xd3,0xf1,0xdf,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0xb0,0x30,0x24,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x02,0xe9,0x5b,0xb0,0xa2,0xd5,0x2d,0xb3,0x8a,0xf4,0x04,0xbf,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x5d,0x26,0x7f,0xb3,0x6a,0xd1,0x35,0x0a,0xb6,0x5e,0x88,0xdd,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x61,0x78,0x11,0x04,0x89,0xd2,0xda,0x0e,0x07,0x1a,0xf7,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x6b,0x80,0x74,0x32,0xe8,0x92,0x43,0xa3,0x37,0xe6,0x0a,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x6d,0x0c,0xaf,0x3c,0x06,0x69,0x3f,0x73,0xa9,0xe7,0x1b,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x74,0x51,0xd8,0xc2,0x7e,0x42,0x7e,0xfe,0x37,0x63,0x56,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x74,0x51,0xd8,0xf3,0x1f,0x0f,0xdc,0x1c,0x90,0x67,0xac,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x0a,0xa7,0xf9,0x3a,0x21,0xb8,0xee,0xe1,0x49,0x73,0xed,0xf9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x07,0x01,0xca,0x1f,0x66,0xff,0xfe,0xc9,0x22,0x1c,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x07,0x15,0xca,0x1f,0x66,0xff,0xfe,0xc9,0x5f,0xf0,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x07,0x1a,0x2e,0x59,0xe5,0xff,0xfe,0x42,0x52,0xf4,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0xc8,0x16,0x00,0x00,0x00,0x02,0x08,0xa2,0xff,0xfe,0x0c,0x8a,0x2e,0x20,0x8d,
- 0x02,0x10,0x20,0x03,0x00,0xdc,0x2f,0x4a,0xeb,0x00,0x4e,0xcc,0x6a,0xff,0xfe,0x25,0xc9,0xa3,0x20,0x8d,
- 0x02,0x10,0x20,0x03,0x00,0xf6,0x3f,0x31,0x06,0x00,0x4c,0x9f,0x76,0x20,0x83,0x24,0xd4,0xa7,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x08,0x48,0x50,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x09,0x40,0x40,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x09,0x53,0x80,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x02,0x20,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x0f,0x90,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x3d,0xb0,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x3f,0x10,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x49,0xa0,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x56,0xd0,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x56,0xe0,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x10,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x3e,0x54,0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x60,0x05,0x00,0x1d,0x02,0x08,0xa2,0xff,0xfe,0x0c,0x6c,0xc2,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x06,0x10,0x00,0x09,0x46,0xa8,0x42,0xff,0xfe,0x0c,0xd3,0x85,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x00,0x23,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x01,0x04,0x09,0xb6,0x83,0x51,0xff,0xfe,0x06,0x75,0xf4,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x01,0x04,0x0d,0xae,0x16,0x2d,0xff,0xfe,0xa6,0xe8,0x68,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0d,0x08,0x00,0xd9,0x7a,0x02,0x9e,0x6b,0x00,0xff,0xfe,0x56,0xe9,0xb3,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0d,0xf0,0xa2,0x80,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0e,0x68,0x54,0x25,0x28,0x34,0x61,0x8e,0x90,0x69,0xa9,0x77,0x5c,0x66,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0e,0xe0,0x4b,0x4f,0xd4,0x80,0x02,0xe0,0x4c,0xff,0xfe,0x08,0x89,0x98,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0f,0x40,0x09,0x5c,0x8d,0x55,0x70,0x38,0xf1,0x46,0xd2,0xd4,0x01,0x18,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0f,0x40,0x09,0x5c,0x8d,0x55,0x72,0x70,0xfc,0xff,0xfe,0x05,0x03,0xcd,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0f,0x40,0x09,0x87,0x11,0x82,0x00,0x6f,0xa4,0x6e,0xec,0x5a,0x48,0xaa,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xd5,0xb7,0x03,0xeb,0x00,0xb2,0x41,0x6f,0xff,0xfe,0x10,0x31,0x2c,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xdc,0x2f,0x4a,0xc2,0x00,0x4e,0xcc,0x6a,0xff,0xfe,0x25,0xc9,0xa3,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xe6,0x7f,0x42,0xa9,0x00,0xe6,0x5f,0x01,0xff,0xfe,0xac,0xcb,0xfc,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xec,0x2f,0x04,0xb1,0x00,0x02,0x11,0x32,0xff,0xfe,0xf7,0xbe,0xef,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xf0,0xdf,0x08,0xec,0x02,0xaa,0xa1,0x59,0xff,0xfe,0x57,0x77,0x79,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x24,0x11,0x3e,0x05,0xcc,0x00,0x04,0x6a,0x17,0x44,0x4d,0x0f,0xd2,0x6b,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x24,0x11,0xa3,0xe1,0x49,0x00,0x85,0xc8,0x62,0xde,0xe8,0xcc,0x68,0x75,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x40,0x53,0x12,0x03,0x3f,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x34,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x01,0x4e,0xb0,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x3e,0xe1,0xd6,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x4e,0x95,0xf3,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x5a,0x68,0x5c,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x05,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xcc,0x14,0x66,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x07,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xd9,0x96,0x96,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0x25,0x00,0x02,0x04,0x11,0x49,0x01,0x33,0x01,0x25,0x00,0x50,0x01,0x80,0x20,0x8d,
0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x20,0x20,0x8d,
- 0x02,0x10,0x24,0x02,0xe2,0x80,0x3d,0x17,0x09,0x45,0x18,0x89,0xd3,0xc6,0x8e,0x85,0xd3,0xc4,0x20,0x8d,
- 0x02,0x10,0x24,0x03,0x62,0x00,0x88,0x21,0x2f,0xdf,0x39,0x03,0xa2,0xb1,0x00,0x9f,0xc8,0x97,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x10,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x20,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0xd0,0x02,0x21,0x03,0x04,0x00,0x02,0x11,0x32,0xff,0xfe,0x9e,0x7a,0xe3,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0xd0,0x02,0x39,0x02,0x07,0x00,0xd7,0x2c,0x5e,0x22,0x4e,0x95,0x38,0x9d,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0xd0,0x02,0x06,0x02,0x78,0x00,0x28,0x9b,0x8d,0xab,0xd5,0x0e,0xde,0xa2,0x20,0x8d,
+ 0x02,0x10,0x24,0x02,0xa7,0xc0,0x81,0x00,0xa0,0x15,0x00,0x00,0x00,0x00,0x06,0xf2,0x79,0xa5,0x20,0x8d,
+ 0x02,0x10,0x24,0x02,0xb8,0x01,0x28,0x7c,0x08,0x00,0x12,0x18,0x45,0xcf,0x2d,0x05,0xcb,0xe4,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x58,0x0c,0xc5,0x05,0x00,0x00,0x69,0x55,0x67,0xd3,0x62,0x29,0x88,0xe7,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x58,0x16,0xc8,0xa3,0x00,0x00,0x26,0x77,0x03,0xff,0xfe,0x03,0x94,0x22,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x71,0xc0,0x20,0x00,0xb3,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x71,0xc0,0x20,0x00,0xb3,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x71,0xc0,0x20,0x00,0xb3,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x93,0x20,0x8d,
+ 0x02,0x10,0x24,0x04,0x44,0x08,0x63,0x97,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x50,0x20,0x8d,
+ 0x02,0x10,0x24,0x05,0x65,0x82,0x0d,0xe0,0x44,0x00,0x08,0xce,0x2b,0x80,0x29,0x60,0x7b,0x4e,0x20,0x8d,
+ 0x02,0x10,0x24,0x05,0x65,0x82,0x0d,0xe0,0x44,0x00,0x00,0x0f,0x85,0x4d,0x50,0x57,0x4f,0xc9,0x20,0x8d,
+ 0x02,0x10,0x24,0x05,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0x30,0x03,0x20,0x02,0x3a,0x69,0x38,0x7e,0x3c,0x9a,0x81,0x66,0x10,0x6b,0x20,0x8d,
0x02,0x10,0x24,0x06,0x34,0x00,0x02,0x16,0x8b,0x00,0x02,0x11,0x32,0xff,0xfe,0xca,0x33,0x6b,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x14,0x03,0x35,0xb6,0x00,0xeb,0x14,0x05,0xfd,0x20,0x72,0x36,0x53,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x1c,0x05,0x0b,0xcd,0x00,0x3c,0xae,0x17,0x28,0xec,0xfc,0x43,0x34,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x1c,0x05,0x0b,0xcd,0x03,0x36,0xd6,0x13,0xfa,0xeb,0xa8,0x65,0x43,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x1e,0x0a,0x4e,0x8a,0x03,0xd9,0x0a,0xfb,0xb0,0x23,0xd3,0xcc,0xb4,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0x8c,0x00,0x00,0x00,0x34,0x22,0x01,0x33,0x00,0x18,0x02,0x28,0x01,0x08,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x12,0x0c,0xe1,0xf0,0x00,0xaf,0xcd,0x2e,0x3a,0x11,0xf6,0x67,0xc0,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x12,0x0c,0xe1,0xf0,0x01,0x2f,0x6e,0x08,0x91,0x55,0xf0,0x55,0xe1,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x12,0x0c,0xe1,0xf0,0x01,0x89,0x74,0x8c,0x19,0xba,0xe2,0x52,0x13,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x12,0x0c,0xe1,0xf0,0x01,0xa7,0x91,0xac,0x49,0x22,0xa4,0x0f,0xd2,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1a,0x05,0xb2,0xea,0x00,0xf1,0x7a,0x13,0x19,0xba,0xed,0x15,0x82,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1a,0x05,0xb2,0xea,0x01,0x05,0x8c,0x05,0xfb,0xae,0x7c,0x48,0x4c,0x20,0x8d,
0x02,0x10,0x24,0x07,0x36,0x40,0x21,0x07,0x12,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x07,0x70,0x00,0x9f,0x71,0x2d,0x00,0x1c,0x5a,0x52,0x92,0x51,0x08,0xc7,0x34,0x20,0x8d,
- 0x02,0x10,0x24,0x08,0x82,0x07,0x26,0x55,0xfa,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0b,0x20,0x8d,
- 0x02,0x10,0x24,0x08,0x82,0x07,0x54,0x56,0xd8,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xc6,0x20,0x8d,
- 0x02,0x10,0x24,0x09,0x02,0x50,0x60,0xa0,0x26,0x00,0xa9,0x71,0x1c,0xdd,0x3d,0x5b,0x65,0x4d,0x20,0x8d,
+ 0x02,0x10,0x24,0x07,0xc8,0x00,0x4f,0x12,0x05,0xe7,0x95,0xe3,0x4b,0xf5,0x0b,0x37,0x86,0xf7,0x20,0x8d,
+ 0x02,0x10,0x24,0x08,0x82,0x07,0x54,0x55,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x20,0x8d,
+ 0x02,0x10,0x24,0x09,0x8a,0x28,0x0e,0xc1,0x68,0x40,0xf7,0xa3,0x88,0xc8,0xca,0xcc,0xfe,0x0a,0x20,0x8d,
+ 0x02,0x10,0x24,0x09,0x8a,0x7c,0x1e,0x42,0x2a,0x50,0x45,0xd9,0x11,0xd8,0x0b,0x04,0xcb,0xd7,0x20,0x8d,
0x02,0x10,0x24,0x0d,0x00,0x1a,0x04,0xb1,0xe7,0x00,0x00,0x19,0xd9,0xef,0x07,0xf3,0x8e,0x75,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x17,0x00,0x39,0x48,0x08,0x2f,0xce,0x04,0xd3,0x82,0x52,0x26,0x4c,0xac,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x1f,0x16,0x0a,0x08,0xb9,0x00,0x4b,0xfe,0x2f,0x81,0xae,0x31,0x05,0xf5,0x20,0x8d,
+ 0x02,0x10,0x24,0x0e,0x03,0x8a,0x3e,0x3a,0xcf,0x00,0xa7,0x71,0x2e,0x91,0x51,0xa7,0x2f,0xb4,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x31,0x01,0xb0,0x0f,0x2c,0x96,0x27,0xa0,0x45,0x2c,0xf1,0x86,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x38,0xd5,0x14,0x0f,0xf6,0x4d,0x30,0xff,0xfe,0x63,0x50,0x4e,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x04,0x88,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x21,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x53,0x9e,0xb0,0x0f,0x50,0x54,0x00,0xff,0xfe,0x1b,0x29,0x13,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x54,0x53,0x06,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x09,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x5a,0xf3,0x2c,0x10,0x46,0xa8,0x42,0xff,0xfe,0x08,0x58,0x35,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x06,0xb0,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x94,0x4c,0xe0,0x0f,0x2a,0x27,0xf6,0x64,0x18,0x01,0x59,0x9f,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0xec,0x7b,0x57,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0xec,0x7b,0x57,0x30,0xf2,0xb6,0x1e,0xff,0xfe,0x70,0x75,0x83,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x20,0x06,0x5f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x30,0xa2,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0xb0,0x3a,0xf2,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0xb0,0x3a,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0xc0,0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0xe0,0x41,0xfa,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x41,0xa0,0xaf,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x54,0x00,0x06,0xe4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x01,0x81,0x80,0x05,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x14,0x04,0x0e,0xe3,0x00,0xce,0xa2,0x19,0xef,0xfa,0x3a,0xe1,0x25,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x16,0x0a,0x08,0xb9,0x00,0x23,0x21,0xe0,0x69,0xcd,0xe4,0x67,0xfb,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x64,0xd9,0x16,0x03,0x44,0x36,0x87,0x1e,0x2b,0xfe,0x74,0x03,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x66,0xfc,0xd7,0x00,0x9b,0x71,0x0f,0x45,0xf3,0xc9,0xc4,0x3b,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x66,0xfc,0xd7,0x01,0xd6,0x8d,0xea,0x70,0x77,0xa0,0x40,0x72,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x01,0x77,0x3d,0x13,0x75,0x24,0xfb,0xbf,0x24,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0x27,0x58,0x80,0x42,0x92,0x9f,0xa3,0x84,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0x4c,0x90,0xe1,0xe6,0x2a,0x59,0x82,0xc4,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0xe6,0xc0,0x88,0x78,0x40,0x1c,0x27,0xc2,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0xef,0x0c,0x40,0xab,0x0f,0x8f,0x6d,0x6c,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0xfa,0x9e,0x86,0xad,0xe4,0x63,0xae,0x17,0x20,0x8d,
0x02,0x10,0x26,0x00,0x1f,0x1c,0x02,0xd3,0x24,0x01,0x69,0x89,0xb1,0xfd,0xd2,0xa6,0xfb,0xc8,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x1f,0x1e,0x02,0xfe,0x36,0x01,0x63,0xa8,0xeb,0xf6,0x83,0xe4,0x19,0x32,0x20,0x8d,
0x02,0x10,0x26,0x00,0x21,0x04,0x10,0x03,0xc5,0xab,0xdc,0x5e,0x90,0xff,0xfe,0x18,0x1d,0x08,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x4b,0x0c,0x52,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x00,0xe0,0x02,0x2e,0x32,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xcc,0xc9,0x9c,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x6c,0x4e,0x0a,0x00,0x0c,0xd0,0x42,0x8d,0x5c,0xff,0xfe,0x58,0x48,0x84,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x92,0x27,0x45,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xb7,0x4d,0xd7,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xd1,0x1d,0x3d,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0xe6,0x21,0x46,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x5d,0x09,0xfb,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0x12,0x89,0x38,0x20,0x8d,
0x02,0x10,0x26,0x00,0x6c,0x54,0x71,0x00,0x1a,0xd1,0xc9,0x2e,0x03,0x6d,0x06,0x51,0xbd,0x18,0x20,0x8d,
- 0x02,0x10,0x26,0x01,0x01,0x84,0x03,0x00,0x15,0x6c,0xba,0x4c,0x00,0x30,0x09,0xda,0x6c,0x06,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x6c,0x67,0x21,0x00,0x06,0x70,0xb1,0x79,0xbe,0x4c,0x8c,0xca,0xe8,0xf0,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x6c,0x67,0x8a,0x3f,0xe1,0x91,0x42,0x61,0x86,0xff,0xfe,0x4f,0x0a,0xac,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x70,0xff,0xea,0xad,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x88,0x01,0x2f,0x80,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x1c,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x88,0x06,0x23,0x00,0x04,0x60,0xa0,0xe6,0x7e,0x10,0xc3,0xa8,0xbb,0x47,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x01,0x52,0x49,0x7f,0x2a,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x20,0x8d,
0x02,0x10,0x26,0x01,0x01,0x85,0x83,0x02,0x12,0xf0,0x1a,0xb2,0x28,0x40,0x9d,0xe4,0x15,0x50,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x01,0x8c,0x90,0x02,0x3d,0xe5,0x02,0x19,0xd1,0xff,0xfe,0x75,0xdc,0x2f,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x01,0x9c,0x41,0x7e,0x3a,0x11,0x20,0xe7,0xb3,0xff,0xfe,0xcf,0x0a,0x99,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x02,0x43,0x08,0x20,0x58,0x24,0x42,0x16,0x08,0xde,0xe0,0x4a,0xfb,0x54,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x02,0x80,0x5c,0x00,0x04,0x3d,0x4a,0xba,0x4e,0xff,0xfe,0xf8,0x6e,0x5d,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x06,0x03,0x53,0x00,0x83,0xb7,0x00,0x00,0x00,0xff,0xfe,0x00,0x42,0x09,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xfe,0xc3,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xfe,0xc3,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x73,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xff,0xb6,0x00,0x04,0x4d,0x3d,0xf8,0x16,0x3e,0xff,0xfe,0xc6,0x0c,0x15,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xff,0xb6,0x00,0x04,0x73,0x9e,0xf8,0x16,0x3e,0xff,0xfe,0x00,0xc2,0xb3,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xff,0xb6,0x00,0x04,0x7b,0x8e,0xf8,0x16,0x3e,0xff,0xfe,0x9d,0x9d,0xc2,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xff,0xc5,0x02,0x00,0x1e,0x01,0x24,0x1d,0xe5,0x89,0x96,0x50,0xc7,0x73,0x20,0x8d,
0x02,0x10,0x26,0x03,0x30,0x03,0x01,0x1b,0xe1,0x00,0x02,0x0c,0x29,0xff,0xfe,0x38,0xbb,0xc0,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x04,0x06,0xa1,0x38,0x00,0x85,0x1f,0x58,0x4d,0x7a,0xba,0xaf,0xfb,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x24,0x18,0xee,0x80,0x00,0x02,0x0e,0xc4,0xff,0xfe,0xd1,0xef,0x15,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x03,0x01,0x1b,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x04,0x07,0x17,0x58,0x00,0x48,0x5b,0x39,0xff,0xfe,0xab,0x1d,0x54,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x05,0x15,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0xf2,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x07,0x07,0x01,0x80,0x00,0xb7,0xd9,0x9e,0x1e,0x8e,0x0d,0x52,0xfa,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x0a,0x09,0x12,0x62,0x7a,0xbe,0x24,0x11,0xff,0xfe,0x7b,0x39,0xc3,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x15,0x0e,0x21,0x68,0x00,0x15,0xb3,0xd6,0x92,0xa5,0x36,0x12,0xff,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x24,0x1c,0x07,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x2d,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x24,0x20,0x05,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x1b,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x60,0x11,0xaf,0x41,0x72,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x60,0x80,0x90,0x03,0x2f,0xbc,0x60,0xb1,0x6a,0x4e,0xe3,0x64,0xc8,0x5d,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x80,0x01,0x33,0x00,0x7d,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x48,0x20,0x8d,
0x02,0x10,0x26,0x03,0x80,0x80,0x1f,0x07,0x6f,0xdd,0x7d,0xe2,0xd9,0x69,0x78,0xc9,0xb7,0xea,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x80,0x81,0x6c,0x00,0x00,0x77,0x02,0x15,0x5d,0xff,0xfe,0x02,0x15,0x55,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x80,0xa0,0x07,0x00,0x18,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x20,0x8d,
0x02,0x10,0x26,0x04,0x40,0x80,0x10,0x36,0x80,0xb1,0x50,0xe1,0x43,0xff,0xfe,0x0e,0x9d,0xf5,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x45,0x00,0x00,0x06,0x02,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x86,0xc0,0x30,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x73,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x0a,0x00,0x00,0x03,0x20,0x98,0x02,0x16,0x3e,0xff,0xfe,0x28,0xc4,0x47,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x0a,0x00,0x00,0x50,0x00,0x39,0xc5,0x14,0xbe,0xcd,0xbe,0xce,0xad,0x3a,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1c,0x96,0xe0,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1d,0x46,0xc0,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1d,0xef,0x80,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1d,0xfe,0xa0,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x08,0x49,0x60,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x00,0x31,0xe0,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x00,0xc5,0x60,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x10,0x80,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x21,0xc0,0x20,0x00,0x00,0x11,0x02,0x04,0x01,0x94,0x02,0x20,0x00,0x40,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x59,0xc8,0x18,0x00,0x25,0x96,0xc2,0x6c,0xe7,0x80,0x26,0xfd,0xfc,0xf8,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x59,0xc8,0x2a,0x99,0x9d,0x00,0x53,0x77,0x73,0x33,0xef,0xde,0x0d,0x32,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x59,0xc8,0x06,0x1f,0x39,0x00,0x2e,0xfd,0xa1,0xff,0xfe,0xdc,0xf8,0xd4,0x20,0x8d,
0x02,0x10,0x26,0x05,0x64,0x00,0x00,0x30,0xf2,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0x64,0x00,0x00,0x30,0xfd,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0xc0,0x00,0x2a,0x0a,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x40,0x30,0x01,0x00,0x2f,0x3e,0xec,0xef,0xff,0xfe,0x91,0xf8,0x40,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x40,0x30,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x40,0x30,0x01,0x00,0x49,0x7e,0xc2,0x55,0xff,0xfe,0xa8,0x31,0xcc,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x40,0x30,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x6f,0x80,0x00,0x00,0x00,0x07,0xfc,0x1b,0xcc,0xff,0xfe,0x8a,0xd8,0x22,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0xae,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x20,0x8d,
0x02,0x10,0x26,0x06,0x6d,0x00,0x01,0x00,0x51,0x02,0x03,0xd2,0xf0,0x6a,0xc2,0xe8,0x0a,0x54,0x20,0x8d,
- 0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x60,0x2e,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x61,0x08,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x02,0x03,0x46,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x60,0x31,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x14,0x25,0xb5,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x21,0x9c,0x2f,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x21,0xbf,0x32,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x33,0x4d,0x1b,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x3d,0x04,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x0d,0x30,0x15,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x03,0x26,0x6c,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x09,0x93,0x0b,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x0b,0x30,0x11,0x20,0x8d,
- 0x02,0x10,0x28,0x00,0x01,0x50,0x01,0x1d,0x24,0x26,0x06,0x2b,0xb1,0x64,0x70,0x4a,0x69,0x62,0x20,0x8d,
- 0x02,0x10,0x28,0x00,0x03,0x00,0x82,0x51,0x0b,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x20,0x8d,
- 0x02,0x10,0x28,0x00,0x03,0x00,0x82,0x51,0x0b,0x50,0x0e,0x92,0x64,0xf5,0x22,0xaf,0xc3,0x1e,0x20,0x8d,
- 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x15,0x06,0xad,0x48,0xe8,0x22,0x00,0xa8,0x82,0xe0,0x8e,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xf2,0xc0,0xe0,0x45,0xf2,0xe0,0xfe,0x4c,0x0f,0xbb,0x6c,0x99,0x12,0x20,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xf2,0xc0,0xf0,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xf2,0xf8,0xad,0x40,0xea,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xfd,0xc0,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xca,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xfe,0xa8,0x60,0x1e,0x7d,0x01,0xbe,0x24,0x11,0xff,0xfe,0x89,0x27,0xf3,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x01,0x1c,0x50,0x01,0x11,0x18,0xd2,0x67,0xe5,0xff,0xfe,0xe9,0xe6,0x73,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x01,0x1c,0x50,0x01,0x21,0x99,0xd2,0x67,0xe5,0xff,0xfe,0xe9,0xe6,0x73,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0x06,0x20,0x03,0x01,0x05,0x06,0x7c,0x16,0xff,0xfe,0x51,0x58,0xbf,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0x6e,0xa0,0x00,0x00,0x01,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x09,0x74,0x2a,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x0d,0x7f,0x1d,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x06,0x49,0xc8,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x0b,0x38,0x8a,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x01,0x50,0x01,0x1d,0x10,0x93,0xc9,0xe3,0x1e,0xf4,0x0b,0xc4,0x25,0x0d,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x17,0x02,0x4f,0x4d,0x95,0xe1,0x30,0x7f,0x97,0x90,0xf2,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x18,0x07,0xd1,0xa2,0x36,0xbc,0xff,0xfe,0x58,0xb6,0xec,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x74,0x4b,0x8b,0xf6,0x73,0xdb,0x63,0x6f,0x6f,0x23,0x10,0x20,0x8d,
0x02,0x10,0x28,0x03,0x51,0x80,0x41,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x28,0x03,0x98,0x00,0x94,0x47,0x84,0xbb,0xca,0xb8,0xd2,0xf5,0x38,0x8c,0x9a,0x57,0x20,0x8d,
+ 0x02,0x10,0x28,0x03,0x98,0x00,0x94,0x47,0x84,0xbb,0xb8,0x7f,0x1d,0xf2,0xff,0x01,0x1c,0x28,0x20,0x8d,
+ 0x02,0x10,0x28,0x03,0x98,0x00,0xa0,0x07,0x83,0x91,0x1f,0xd7,0xc2,0x63,0xa5,0x5b,0xb9,0xfb,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x01,0x4c,0x65,0xd7,0x8e,0xa5,0x60,0x60,0x21,0x02,0x6b,0xa6,0x56,0x14,0x20,0x8d,
0x02,0x10,0x28,0x04,0x01,0x4d,0x7e,0x33,0x83,0xb0,0x6e,0x41,0x1c,0xcc,0xcf,0x20,0xaf,0xf9,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x22,0x9c,0x82,0x00,0x18,0xd6,0x01,0x4a,0xd8,0xc8,0xb4,0xdd,0x3f,0x25,0x20,0x8d,
0x02,0x10,0x28,0x04,0x04,0x31,0xe0,0x38,0xcd,0x01,0xaa,0xa1,0x59,0xff,0xfe,0x0d,0x44,0xb8,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x0d,0x57,0x45,0x0d,0x0f,0x00,0xa4,0x22,0x98,0x28,0xb0,0x0e,0x91,0xe9,0x20,0x8d,
- 0x02,0x10,0x28,0x06,0x02,0xf0,0x50,0x20,0xd2,0x87,0x4d,0xcd,0x62,0x04,0x90,0x9b,0x41,0x25,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x41,0xe0,0x28,0x59,0x00,0x0a,0xea,0x42,0x36,0x2d,0x76,0x1e,0xb9,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x45,0xcb,0x22,0xef,0x00,0xf8,0x9c,0xd0,0x38,0x2a,0x36,0xa3,0xfa,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x57,0x4b,0x3d,0x7d,0x00,0x75,0x2d,0x1d,0x78,0x6b,0x32,0xf7,0x1c,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x57,0x59,0x49,0x18,0x00,0x02,0xa0,0x98,0xff,0xfe,0x79,0x33,0x9b,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0f,0xec,0xd2,0xd8,0x61,0x00,0xfa,0x63,0x2e,0xcd,0x48,0xa0,0x2f,0x34,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x10,0x3e,0x00,0x1b,0x48,0x35,0xa7,0x87,0x2e,0xa5,0x90,0x25,0xaa,0xa7,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x02,0x67,0x14,0x8a,0x1d,0x10,0xdc,0x4b,0x36,0x94,0x42,0x3b,0xb6,0xb4,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x02,0xf0,0x80,0xe1,0xe1,0x7b,0x35,0x29,0x08,0xaa,0x09,0x0c,0x50,0x9a,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x02,0xf0,0xa4,0x81,0xc5,0x85,0x06,0x03,0x47,0x8e,0x57,0xf9,0x40,0x9e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x11,0x69,0x01,0x14,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x11,0x90,0xc0,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x13,0x37,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x11,0xc0,0x00,0x60,0x02,0x94,0xc4,0x8f,0xbe,0xff,0xfe,0x15,0xa9,0x7f,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x12,0x98,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x42,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x12,0xe0,0x01,0x01,0x00,0x99,0x02,0x0c,0x29,0xff,0xfe,0x29,0xd0,0x3f,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x13,0x98,0x00,0x04,0x2a,0x03,0x3e,0xec,0xef,0xff,0xfe,0x05,0xd9,0x3e,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x13,0x98,0x00,0x04,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x03,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x13,0xa0,0x30,0x15,0x00,0x01,0x00,0x85,0x00,0x14,0x00,0x79,0x00,0x26,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x17,0x68,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x6a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x1a,0x08,0xff,0xff,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x1f,0x40,0x50,0x01,0x01,0x08,0x5d,0x17,0x77,0x03,0xb0,0xf5,0x41,0x33,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x1f,0x40,0x50,0x01,0x03,0x86,0xde,0xad,0xbe,0xef,0xb1,0xac,0xc0,0xfe,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x23,0xc5,0xfe,0x80,0x73,0x01,0xd6,0xae,0x52,0xff,0xfe,0xd5,0x56,0xa5,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x23,0xc6,0x5c,0x8a,0x5c,0x00,0xc0,0x5a,0x4d,0xff,0xfe,0x65,0x9d,0x69,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x60,0x20,0x45,0x03,0x37,0x00,0x50,0x54,0x00,0xff,0xfe,0x90,0x64,0x0e,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x89,0x20,0x00,0x50,0x54,0x00,0xff,0xfe,0xfc,0x5e,0xd8,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x8a,0x60,0xe0,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x4d,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x59,0x80,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x35,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0x49,0x14,0x57,0x00,0xdb,0x31,0xca,0x50,0x07,0x97,0xc4,0x68,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0x50,0x9e,0xa4,0x00,0x02,0x11,0x32,0xff,0xfe,0x5c,0x36,0x9c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x06,0x0e,0x00,0x07,0x9e,0x9a,0xd6,0x91,0x81,0xeb,0xb8,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x89,0x20,0x00,0x00,0x42,0xc0,0xff,0xfe,0xa8,0xb2,0x09,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x4e,0xb7,0xc0,0x00,0x00,0x00,0x00,0x20,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x8a,0x60,0xe0,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xa0,0x40,0x01,0x99,0x84,0xfa,0x1a,0xc0,0x4d,0xff,0xfe,0x41,0x3e,0x93,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xbb,0xa0,0x12,0x04,0x37,0x00,0x02,0x1e,0x06,0xff,0xfe,0x4a,0x53,0x78,0x20,0x8d,
0x02,0x10,0x2a,0x00,0xbb,0xe0,0x00,0x00,0x22,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x46,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xd5,0x20,0x00,0x09,0x93,0x00,0x42,0x0b,0x54,0x4e,0x80,0x19,0x6d,0x3a,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xfd,0x40,0x00,0x0c,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xd4,0xe0,0x00,0xff,0xfc,0x02,0x9e,0x6b,0x00,0xff,0xfe,0x17,0x61,0x15,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xd8,0x80,0x00,0x05,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x29,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x0e,0xe2,0x4d,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x0e,0xe2,0x4d,0x00,0x06,0xb0,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x02,0x38,0x42,0x5f,0x46,0x00,0xbb,0xb8,0x16,0xd6,0xe9,0x07,0xcb,0x6f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x02,0x39,0x02,0x65,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x02,0x61,0x02,0x18,0x3f,0x00,0x8d,0x0f,0x21,0x05,0xc6,0x57,0x4a,0xe7,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x4b,0x00,0x80,0x7c,0x31,0x00,0x0a,0x36,0xc9,0xff,0xfe,0x7e,0xde,0x5f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x4b,0x00,0xb9,0x06,0xf1,0x00,0xd8,0x12,0x4f,0x64,0xa9,0x31,0x19,0xb7,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x4b,0x00,0xb9,0x06,0xf1,0x00,0xde,0xa6,0x32,0xff,0xfe,0xd5,0xf1,0x42,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x4b,0x00,0xbf,0x1b,0x72,0x00,0xd8,0x26,0x7d,0x6f,0x0b,0x13,0x27,0x6c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x71,0x16,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x71,0x1f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x00,0x72,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x02,0x42,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x42,0x20,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x61,0x42,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x72,0x4c,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0xa9,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0xaf,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x2b,0x02,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x5a,0x44,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x42,0x42,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x52,0x1c,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x71,0x5c,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0xaa,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x4a,0x51,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x5a,0x16,0xcb,0x87,0x6a,0xbc,0xe7,0xb3,0xc8,0x11,0x8a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x5a,0x25,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x01,0xf0,0x85,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x01,0xf0,0x91,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x01,0xf0,0xec,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x00,0xf0,0xcc,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x00,0xf0,0xe4,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x05,0xa8,0x03,0x03,0x13,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x05,0xa8,0x03,0x08,0x43,0x33,0x40,0x74,0x6a,0xff,0xfe,0x9c,0xf5,0xd2,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x07,0xa7,0x00,0x02,0x28,0x04,0xae,0x1f,0x6b,0xff,0xfe,0x9d,0x6c,0x94,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x07,0xc8,0xaa,0xac,0x00,0x89,0x50,0x54,0x00,0xff,0xfe,0xb7,0xf5,0xcb,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x07,0xc8,0xaa,0xc2,0x01,0x80,0x50,0x54,0x00,0xff,0xfe,0x56,0x8d,0x10,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0x07,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0xcb,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0xff,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x28,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x6a,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0xcb,0x00,0x07,0x90,0xf5,0x00,0x11,0x0b,0xb4,0x46,0x22,0x60,0x7d,0x2c,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0xcb,0x10,0x03,0x36,0xcb,0x00,0x61,0xac,0xd1,0x5d,0x4a,0xc0,0x2c,0xbd,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0xcb,0x10,0x03,0x36,0xcb,0x00,0xd2,0x37,0x45,0xff,0xfe,0xc5,0x2c,0xd0,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0xcb,0x15,0x80,0x4c,0x80,0x00,0x02,0x1e,0x06,0xff,0xfe,0x51,0x2c,0x32,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x01,0x85,0x55,0xf0,0xa0,0xba,0x9e,0xaf,0x98,0x53,0x92,0xb7,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0x01,0x70,0x10,0xb8,0x7d,0xe1,0x4b,0xce,0xa9,0xb9,0x98,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x00,0x13,0x9e,0x0a,0x00,0x14,0x2d,0xfe,0xc1,0xd0,0xdf,0xda,0x18,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x00,0x14,0x28,0xea,0x00,0x8a,0x4c,0x1b,0x72,0xf9,0x59,0x0c,0xa4,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x10,0x02,0x49,0x73,0x00,0x00,0x0b,0x00,0x0c,0x00,0x0b,0x00,0x0c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x01,0xc1,0xa3,0xe0,0x44,0x3b,0xbc,0xab,0x77,0x78,0xb0,0x3b,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x02,0x52,0x6b,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0xb3,0x14,0x20,0x7c,0xa0,0x3a,0x9a,0x5c,0xc3,0xb6,0x44,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0x05,0x93,0x90,0xbf,0x35,0x4d,0x41,0x8a,0x2a,0x05,0x70,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x05,0x7b,0x00,0xa0,0x70,0x39,0x12,0xe3,0x65,0x47,0x28,0x49,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x08,0x3d,0xdd,0x30,0x24,0x6a,0x4a,0xf7,0x53,0xf4,0x8d,0x65,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x0e,0x0a,0x09,0xe9,0xc2,0x40,0x8e,0x3a,0xaf,0x64,0x04,0xf0,0x8f,0x79,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0b,0x0f,0x37,0xe0,0xa1,0x3f,0x0e,0x65,0xac,0x42,0x8e,0x36,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0xb5,0x7f,0x50,0xc2,0x57,0xa5,0x5b,0x48,0x46,0x97,0xe1,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0b,0xf6,0x8d,0x70,0x02,0x0c,0x29,0xff,0xfe,0x30,0x4f,0xd2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0xb7,0x7d,0xb0,0x02,0x4e,0x01,0xff,0xfe,0xaa,0xe1,0x83,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0d,0xb3,0x66,0xa0,0x92,0xe1,0x04,0xc4,0x8c,0xe9,0x2b,0x5d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0xdf,0xb9,0xa0,0xb6,0x2e,0x99,0xff,0xfe,0xce,0x13,0x95,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0e,0x6e,0x6b,0xb0,0x02,0xe0,0x4c,0xff,0xfe,0x68,0x02,0x32,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x0e,0x11,0x10,0x0c,0x00,0x70,0x39,0xf3,0xe3,0xc9,0x83,0x2f,0x03,0x7a,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x34,0xec,0x1d,0x71,0x00,0x8a,0xae,0xdd,0xff,0xfe,0x02,0x41,0x59,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x12,0x10,0x7c,0x92,0x51,0x00,0x02,0x11,0x32,0xff,0xfe,0xae,0x15,0x2d,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x12,0x10,0x86,0xbf,0xf1,0x00,0xa9,0xac,0xd0,0x41,0x1f,0x8e,0x69,0x25,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x1c,0x04,0xd9,0x00,0x86,0xe5,0x21,0x35,0x4f,0x88,0x08,0x2e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x20,0x0a,0x3c,0x00,0xb5,0x59,0x6c,0x65,0x10,0xcb,0x37,0x65,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x3c,0x3a,0x56,0x00,0x61,0xe6,0xa8,0x11,0xef,0x0b,0xf9,0xc2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x48,0x57,0xed,0x00,0x4c,0x86,0x3d,0x1c,0xdb,0x1a,0x46,0x0d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x4a,0xba,0xe8,0x00,0x21,0xec,0x03,0x46,0xa2,0x9f,0x90,0xbe,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x60,0xe0,0x08,0x00,0x8d,0x6e,0x13,0x4d,0xa0,0xca,0xef,0x24,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x78,0x23,0xde,0x00,0x02,0x11,0x32,0xff,0xfe,0xae,0x15,0x2d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x84,0xea,0xf6,0x00,0x50,0x3e,0x6f,0x19,0xc2,0xc1,0x9c,0xa6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x13,0xb8,0xf0,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0x20,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0x42,0x0b,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0x42,0x0b,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0x62,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x1c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0x67,0x5e,0x00,0x00,0xe6,0x5f,0x01,0xff,0xfe,0x09,0x35,0x91,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0xb5,0xcf,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x17,0x48,0xf7,0xdf,0x95,0xb1,0x96,0xc6,0x91,0xff,0xfe,0x1d,0xe0,0xb6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x21,0xb4,0x20,0x89,0x91,0x00,0x10,0x6b,0x0c,0x6b,0xc3,0x28,0xbe,0x4e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x21,0xb4,0xc8,0x20,0xc3,0x00,0x31,0x26,0xc9,0x60,0xf3,0x56,0xaa,0xb5,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x22,0xa0,0xbb,0xb3,0xdc,0x10,0x50,0xe1,0x57,0xff,0xfe,0x70,0x94,0x92,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x24,0x7a,0x02,0x15,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x2c,0x60,0xf1,0x03,0x07,0xc0,0x1a,0x31,0xbf,0xff,0xfe,0xcc,0x5d,0x91,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x24,0x7a,0x02,0x15,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x24,0x7a,0x02,0x2d,0xc0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x24,0x7a,0x02,0x43,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x27,0x80,0x90,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x27,0x80,0x90,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x29,0xb8,0xdc,0x01,0x37,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x4d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x2f,0x05,0x63,0x07,0x01,0x00,0x00,0xfd,0xac,0x4b,0x7f,0x1a,0x1d,0x95,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x31,0x02,0x4d,0x5c,0xf0,0x00,0xde,0xa6,0x32,0xff,0xfe,0xbb,0xb9,0xcb,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x31,0x02,0xbc,0x00,0x10,0xe9,0x0c,0xa5,0x9d,0xff,0xfe,0xa9,0x1c,0xbb,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x31,0x02,0xc3,0x24,0x10,0x49,0x0c,0xa5,0x9d,0xff,0xfe,0xa9,0x1c,0xbb,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x03,0x90,0x90,0x00,0x00,0x00,0xaa,0xa1,0x59,0xff,0xfe,0x43,0xb5,0x7b,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x6d,0x40,0x30,0x55,0xb2,0x01,0xde,0xa6,0x32,0xff,0xfe,0x44,0x4b,0x25,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x6e,0xa0,0xd1,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x21,0xe2,0x57,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x07,0x68,0xf9,0x2b,0xdb,0x46,0x5e,0x46,0x77,0x2b,0x07,0x1d,0x29,0xb7,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x28,0x00,0x45,0x01,0x30,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0x50,0xd1,0xe7,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0x59,0x28,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xb0,0xdf,0x8f,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xb9,0x45,0x35,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xc3,0xb5,0xf5,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xd4,0x18,0x69,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xd4,0x18,0x6d,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x80,0x70,0xf1,0x81,0xf6,0x00,0x0b,0xcb,0x02,0xd1,0xd7,0x90,0x78,0xff,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x80,0x71,0x63,0x80,0xc5,0x00,0x72,0x85,0xc2,0xff,0xfe,0xb5,0xa3,0x9c,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x80,0x84,0x20,0x21,0x73,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xe6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x71,0x63,0x80,0xc5,0x00,0xd2,0x50,0x99,0xff,0xfe,0x14,0xaf,0xb2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x84,0x20,0x21,0x73,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xe6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x81,0x08,0x28,0xc0,0x5d,0x60,0xda,0x3a,0xdd,0xff,0xfe,0x45,0x4c,0xb5,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x81,0x08,0x8a,0xc0,0x05,0xdb,0xd2,0x50,0x99,0xff,0xfe,0x9e,0x79,0x2a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x81,0x0b,0x18,0x1f,0xfa,0x8e,0x1c,0xc7,0xc5,0x28,0x4a,0x59,0x63,0x34,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x83,0x08,0x81,0x88,0x51,0x00,0x6d,0x8b,0x45,0x31,0x43,0x31,0xee,0xe2,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x83,0x88,0xe3,0x02,0x79,0x80,0x6f,0x85,0xa0,0xb3,0x4b,0x4d,0x8b,0x0f,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x83,0x88,0xe5,0xc3,0x4a,0x80,0x02,0x01,0x2e,0xff,0xfe,0x82,0xb3,0xcc,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa3,0x1a,0xe0,0x3d,0x94,0x00,0x3f,0x18,0x27,0x29,0x0c,0x86,0xd7,0x54,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x09,0x08,0xc2,0x00,0x6d,0x00,0xca,0xad,0x5e,0x32,0x35,0xe7,0x31,0x57,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x57,0x1a,0x1b,0xff,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x33,0x20,0x8d,
0x02,0x10,0x2a,0x02,0xa4,0x5a,0x94,0xcd,0xf0,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x2a,0x02,0xa4,0x65,0x80,0xf4,0x00,0x01,0xf3,0x69,0x4e,0xf5,0xaa,0x12,0x75,0x66,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x66,0x4d,0x4f,0x00,0x01,0x84,0x71,0xfe,0x5d,0x0c,0xff,0xd5,0x24,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x68,0x61,0xf8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x69,0x2d,0x51,0x00,0x01,0x92,0x1b,0x0e,0xff,0xfe,0x8c,0x79,0x75,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x69,0x3e,0xda,0x00,0x01,0x7e,0x83,0x34,0xff,0xfe,0xb6,0x13,0xf3,0x20,0x8d,
0x02,0x10,0x2a,0x02,0xab,0x88,0x02,0x0b,0xce,0x00,0x02,0x23,0x24,0xff,0xfe,0x56,0x62,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x16,0x23,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x58,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x73,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x73,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x80,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x34,0x73,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x30,0x06,0x31,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0a,0xb8,0x02,0x01,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x26,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0a,0xb8,0x02,0x01,0x04,0x03,0xb8,0x7a,0x46,0xa1,0xae,0xce,0x21,0xed,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0a,0xf8,0xfa,0xb0,0x08,0x08,0x00,0x85,0x02,0x34,0x01,0x45,0x01,0x32,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0b,0x48,0x02,0x07,0x00,0x02,0x83,0x33,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0b,0x48,0x02,0x07,0x00,0x02,0x83,0x33,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x31,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x61,0x31,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x70,0x37,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x72,0x28,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x79,0x66,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x81,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x88,0x93,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x30,0x13,0x36,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x43,0x55,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x07,0x30,0x02,0x74,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xcb,0x43,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x78,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0e,0x5e,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0e,0x98,0x00,0x20,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x28,0x00,0x68,0x74,0x11,0x53,0xff,0xfe,0x4c,0x02,0x1d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x02,0x01,0xe3,0xc8,0xb7,0xee,0xff,0xfe,0xb0,0xd2,0x6c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x5d,0x0b,0xd4,0xa8,0xbf,0x78,0xff,0xfe,0x98,0x7e,0xa4,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x5d,0x0e,0xa7,0x94,0x4c,0x6b,0xff,0xfe,0xad,0xb1,0xf1,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x5f,0x0c,0xfc,0x14,0xc3,0x0e,0xff,0xfe,0xb5,0x1c,0x1a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x63,0x0d,0xc7,0xd4,0x18,0x2d,0xff,0xfe,0xf3,0x94,0xd9,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x09,0x07,0xd9,0xc8,0x8f,0x1d,0xff,0xfe,0x4e,0x04,0x4d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x60,0x00,0x08,0x70,0x00,0x00,0x00,0x46,0x00,0x23,0x00,0x87,0x02,0x18,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x03,0x68,0xd0,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x06,0xaa,0x70,0x01,0x20,0x8d,
0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x07,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x10,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x11,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x0f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x14,0x20,0x8d,
0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x16,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x1d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x1b,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x1c,0x20,0x8d,
0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x20,0x20,0x8d,
0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x22,0x20,0x8d,
0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x23,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x9a,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x9d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x9c,0x20,0x8d,
0x02,0x10,0x2a,0x03,0x0e,0xc0,0x00,0x00,0x09,0x28,0x00,0x00,0x00,0x00,0x07,0x01,0x07,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0xee,0x41,0x00,0x86,0x50,0xb6,0xfa,0x75,0xa4,0xff,0xfe,0x3c,0x24,0x3f,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x12,0x04,0x2a,0x57,0x03,0x4d,0xc5,0x81,0x16,0x78,0x7c,0xe0,0x16,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x14,0x0a,0x55,0x40,0x01,0xf6,0xab,0xdd,0x5e,0x40,0x39,0xb4,0x6c,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x18,0x0a,0x75,0x6c,0x00,0xc0,0x5b,0x4d,0x0a,0x36,0x58,0x10,0x30,0x20,0x8d,
- 0x02,0x10,0x2a,0x07,0x9a,0x07,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x07,0xd8,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0e,0x20,0x8d,
- 0x02,0x10,0x2a,0x0a,0xef,0x40,0x0e,0x44,0x9b,0x01,0x27,0x46,0xca,0x1e,0x67,0x88,0x35,0x1c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0x35,0x43,0x10,0x00,0x23,0x10,0xe8,0x78,0x79,0xff,0xfe,0x3c,0x17,0x29,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x02,0x22,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x02,0x49,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x03,0xc4,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x04,0x16,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0x35,0x80,0xd1,0x01,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0x4c,0xc0,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0x6d,0x40,0xb9,0x4e,0xd1,0x00,0x02,0x30,0x48,0xff,0xfe,0xdf,0x14,0x32,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x1e,0x01,0xb1,0x6c,0x03,0x53,0x69,0xfd,0x23,0xe6,0x2f,0xa2,0x57,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xf4,0x80,0x2c,0x00,0x10,0x0c,0x54,0x00,0x04,0xff,0xfe,0xd7,0xde,0xad,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xf4,0x80,0x30,0x00,0x2b,0x4e,0x54,0x00,0x04,0xff,0xfe,0xd7,0x42,0x06,0x20,0x8d,
+ 0x02,0x10,0x2a,0x06,0xdd,0x00,0x00,0x10,0x00,0x00,0x02,0x25,0x90,0xff,0xfe,0x33,0x56,0xe8,0x20,0x8d,
+ 0x02,0x10,0x2a,0x06,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x06,0xe8,0x81,0x34,0x08,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0x30,0x16,0xd5,0xff,0xfe,0x5e,0x11,0x14,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0x60,0xd1,0x0e,0xff,0xfe,0x09,0x38,0x86,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0xb0,0xa5,0x23,0xff,0xfe,0x34,0xd2,0x92,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0xc4,0x3e,0x80,0xff,0xfe,0x3c,0xe0,0xcd,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0xf4,0xd3,0x0a,0xff,0xfe,0xbe,0xad,0x99,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0xb2,0x42,0x10,0x00,0x13,0x00,0xf2,0x50,0x8f,0x0a,0xcd,0xba,0x4d,0x76,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0xd8,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x7e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x09,0x26,0x81,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0x31,0xc0,0x01,0x00,0x00,0x00,0x88,0x8f,0x90,0xff,0xfe,0x2c,0x76,0x1b,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0x45,0x80,0x10,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0x4c,0xc0,0x01,0x00,0x03,0x7b,0xc4,0x4a,0x2f,0xff,0xfe,0x10,0x2d,0x3c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0x4c,0xc0,0x00,0x01,0x03,0x40,0x14,0x60,0xfd,0xff,0xfe,0xb2,0x29,0x94,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0b,0x48,0x80,0x00,0x00,0x00,0x00,0x26,0x6e,0x96,0xff,0xfe,0xdb,0x7c,0xdc,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0b,0xf3,0x00,0x00,0x02,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x0b,0xf4,0xc0,0x00,0xc1,0x92,0x0e,0xb2,0x5a,0xda,0xff,0xfe,0x87,0x77,0xb4,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0c,0xb6,0x41,0x06,0xf0,0x01,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0e,0x8f,0x02,0x21,0xd1,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0e,0xcb,0x00,0x70,0x0b,0x00,0x00,0xcb,0x0f,0x0c,0xba,0x41,0xb2,0x28,0xb3,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0e,0xe7,0x01,0x10,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0f,0xb7,0x80,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0f,0xdf,0x00,0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x62,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0f,0xe5,0x86,0x00,0x0f,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0x37,0x81,0x2c,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0x37,0x81,0x3a,0x73,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0x37,0x81,0x3a,0x73,0x00,0x25,0xa1,0x77,0xad,0x25,0xb1,0x4a,0x17,0x6a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0x37,0x81,0x3f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0x37,0x81,0x08,0x4b,0x00,0x01,0x80,0x02,0x99,0xd3,0x19,0x1f,0xc7,0x38,0x20,0x8d,
0x02,0x10,0x2a,0x10,0xc9,0x41,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0xa3,0x02,0x00,0x01,0xa1,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0xca,0x20,0x8d,
- 0x02,0x10,0x2c,0x0f,0xf4,0xa8,0x00,0x0b,0xb1,0x08,0x80,0x7d,0xb2,0xd6,0x91,0x46,0x38,0xbe,0x20,0x8d,
- 0x02,0x10,0x2c,0x0f,0xf4,0xa8,0x00,0x0b,0xb1,0x08,0xc4,0x58,0x5c,0x61,0xdc,0xca,0xcb,0x10,0x20,0x8d,
- 0x05,0x20,0x46,0x3e,0x67,0x73,0x9d,0xe3,0xc3,0xc7,0xeb,0x2c,0x6a,0xad,0x13,0x49,0x1e,0xaf,0x9d,0x0a,0xf7,0x79,0xbb,0x58,0x05,0xe7,0xd1,0x69,0x52,0x46,0x5c,0xb3,0x03,0xca,0x00,0x00,
- 0x05,0x20,0x4e,0xb5,0xd6,0xc5,0x8d,0x1d,0xaa,0x84,0x1d,0xe4,0xfa,0x03,0xe6,0x33,0xa7,0xfe,0xb6,0x23,0x7b,0x56,0x88,0x7f,0x56,0xd9,0xc5,0x73,0xeb,0xcf,0xea,0x84,0xde,0x6c,0x00,0x00,
- 0x05,0x20,0x4e,0x99,0xdd,0x79,0x70,0x95,0x13,0x59,0xf8,0x3e,0xba,0xf8,0x87,0xe4,0x29,0x55,0x55,0x42,0x0a,0x38,0x26,0xea,0xa3,0x1a,0xce,0xf2,0x40,0x3a,0xe6,0x14,0xf9,0x7f,0x00,0x00,
- 0x05,0x20,0x4e,0x9f,0x82,0x37,0x07,0x73,0xdf,0x24,0x92,0xe4,0x6e,0x5b,0x7a,0x9a,0x11,0x14,0xb8,0x1a,0x57,0x8d,0x94,0x85,0x37,0x58,0xcf,0x37,0x85,0x91,0xb9,0xdb,0x6e,0x11,0x00,0x00,
- 0x05,0x20,0x4e,0xe9,0x2b,0xba,0xb7,0xfd,0x14,0xbf,0x73,0xb4,0xff,0xd3,0x41,0xe9,0x8f,0x64,0x55,0xf8,0xe0,0xfd,0xc0,0x2e,0xd7,0x7a,0x22,0x25,0x3f,0xf3,0xc1,0x77,0x55,0x26,0x00,0x00,
- 0x05,0x20,0x4f,0x34,0x39,0x35,0x2b,0x37,0x2b,0x5d,0xee,0x72,0x39,0xa5,0xd4,0xe0,0xe0,0x67,0x9e,0xb2,0xee,0x54,0x4e,0xa4,0xdd,0x2b,0xc4,0xb7,0x26,0xc1,0x67,0x65,0x78,0x21,0x00,0x00,
- 0x05,0x20,0x4f,0x26,0x98,0x96,0xed,0xb0,0x98,0x13,0xa9,0x17,0x64,0x16,0xd7,0x4c,0xc8,0x69,0xcb,0x73,0x14,0x75,0x48,0x0f,0x1f,0x61,0xbf,0x4f,0xe2,0xa0,0x8e,0x0d,0x31,0xf8,0x00,0x00,
- 0x05,0x20,0x48,0x76,0x8a,0x23,0xe6,0x8b,0x56,0x91,0xa5,0x92,0xcf,0xe0,0x1a,0x4a,0x71,0x5f,0x6a,0xdd,0xa1,0xfb,0xa3,0xda,0xac,0x84,0x04,0x30,0x10,0xa5,0xc5,0x02,0xf8,0x8e,0x00,0x00,
- 0x05,0x20,0x48,0x59,0x09,0x98,0xe7,0x07,0xcf,0x21,0x58,0x36,0x7a,0x3e,0xf9,0x68,0x6d,0x31,0xe1,0xa0,0xd6,0xe9,0x69,0x48,0x1e,0x99,0x6d,0x33,0x6a,0x64,0xb0,0x80,0x12,0x81,0x00,0x00,
- 0x05,0x20,0x48,0xf9,0xb7,0x8b,0x4b,0xfe,0xc8,0xaf,0x1d,0x5a,0x9b,0xfc,0x74,0x60,0x03,0x07,0xc8,0x3f,0xd6,0x47,0x83,0xb4,0x5a,0xdc,0x26,0x06,0x86,0x0c,0x2c,0x46,0x39,0x71,0x00,0x00,
- 0x05,0x20,0x48,0xfd,0xbb,0x1c,0x81,0x1f,0x71,0x45,0xcb,0xf1,0xdf,0x18,0x8d,0xad,0xad,0xa5,0x0f,0x0b,0xde,0x3c,0x5b,0x65,0xef,0xea,0x79,0x5a,0x23,0x4e,0x55,0x5f,0x3d,0xa3,0x00,0x00,
- 0x05,0x20,0x49,0x3c,0x9a,0x79,0x07,0xc0,0x6e,0xce,0xd9,0x56,0xe8,0xc0,0x48,0x24,0x93,0xff,0x17,0x21,0x55,0x1c,0x5c,0xbb,0x66,0xf6,0xc5,0xfa,0x90,0x01,0x64,0xa6,0x30,0x0b,0x00,0x00,
- 0x05,0x20,0x49,0x10,0x39,0x4d,0x76,0x1a,0xe7,0xed,0xad,0x34,0xf8,0x9a,0x9d,0x30,0xfc,0x2b,0x8b,0x89,0x25,0xa2,0xd5,0x85,0x54,0x2d,0xe7,0xc3,0x5f,0x11,0xfd,0x36,0xf7,0x18,0x00,0x00,
- 0x05,0x20,0x49,0x1d,0x7e,0xb6,0x34,0xa3,0x9c,0xf2,0x0e,0x45,0x7d,0x1c,0x8f,0x2a,0xc4,0xb3,0x0e,0x10,0xc9,0xa7,0x2f,0xd4,0x80,0xea,0x1e,0x70,0x0b,0x51,0x1e,0xf5,0x63,0x5b,0x00,0x00,
- 0x05,0x20,0x49,0x2f,0xbc,0x2a,0xda,0x6b,0x2d,0xf7,0x58,0xe6,0x0c,0xd0,0xee,0x95,0x75,0xfd,0x25,0xed,0x70,0x37,0xb3,0xf9,0xe6,0xc7,0xf1,0x3b,0x26,0x4a,0x26,0x2c,0x9d,0x6b,0x00,0x00,
- 0x05,0x20,0x49,0x46,0x7f,0x75,0x1c,0x69,0xde,0x6e,0x38,0x2d,0x71,0x38,0x08,0x23,0x75,0xcd,0x42,0x8f,0x17,0x19,0x4a,0x74,0x42,0x7e,0x5b,0x83,0x34,0x60,0x89,0xab,0x5a,0xab,0x00,0x00,
- 0x05,0x20,0x49,0xf5,0x0b,0xa9,0x30,0x69,0x93,0xa6,0x76,0x6d,0xd1,0x04,0x04,0x0c,0xb0,0x00,0xb8,0x0b,0x19,0xac,0x51,0xa4,0x04,0xb6,0x6e,0x84,0xbb,0x08,0x61,0x33,0x7f,0x71,0x00,0x00,
- 0x05,0x20,0x49,0xfe,0x4a,0xf0,0x1d,0xc9,0x72,0xc2,0x60,0x8a,0x43,0x4f,0x30,0xc0,0xa8,0xf0,0xbf,0x73,0xd4,0x5c,0x64,0x86,0xfc,0x23,0xdf,0x4e,0xe5,0x75,0xfa,0x3c,0xe5,0x15,0x00,0x00,
- 0x05,0x20,0x4a,0x02,0x0b,0x7f,0x0d,0x0b,0x6f,0x42,0x42,0x58,0xfa,0xbe,0x9c,0x55,0xc9,0xf2,0xc7,0x90,0xd0,0x4a,0x7b,0xcb,0x7e,0xd9,0xd9,0x9f,0xd8,0x59,0xa0,0xf8,0xed,0x45,0x00,0x00,
- 0x05,0x20,0x4a,0x04,0x2e,0xaa,0xd8,0xe4,0xeb,0xc4,0xe9,0xad,0xf1,0x8a,0x14,0x4b,0xe4,0xf0,0xef,0x8d,0x28,0x75,0x24,0xf7,0x97,0xdc,0x61,0xc3,0xff,0xc3,0xf4,0xcf,0x6d,0xe9,0x00,0x00,
- 0x05,0x20,0x4a,0x18,0x3c,0x0c,0x59,0x9f,0x89,0xa5,0x88,0x84,0xcb,0x9e,0xd5,0xf0,0xa6,0xcf,0xe1,0xa4,0x92,0x10,0x3a,0xe0,0x0b,0xc4,0xc4,0x6e,0xf6,0xea,0x5d,0x5d,0xfd,0xd1,0x00,0x00,
- 0x05,0x20,0x4a,0x40,0xd3,0x2f,0xc7,0xe3,0xf1,0xa7,0x8f,0x46,0xb0,0x18,0x78,0x2e,0x58,0x66,0x28,0xe1,0x31,0xe8,0x73,0x48,0x86,0xe4,0xbd,0x08,0x7b,0x0a,0xd4,0x69,0xce,0x60,0x00,0x00,
- 0x05,0x20,0x4a,0xbb,0xec,0xec,0xa4,0x0b,0xc4,0xef,0x44,0x2a,0x7e,0x73,0x5d,0xa6,0x59,0x2f,0x1f,0x7e,0xd3,0x33,0x63,0xaf,0x95,0x3e,0x52,0xfb,0x2e,0xdc,0xc1,0x6f,0x90,0xd6,0x00,0x00,
- 0x05,0x20,0x4a,0x8b,0x40,0x25,0xdc,0x06,0x2a,0xed,0x44,0x35,0xec,0x06,0x9e,0x73,0x70,0xf0,0x07,0x06,0x35,0xd1,0x60,0x4f,0x22,0xe8,0xbf,0x8a,0xdf,0xd9,0xeb,0x97,0x73,0x06,0x00,0x00,
- 0x05,0x20,0x4a,0xaa,0x4c,0x6a,0xa5,0x1c,0xdd,0xaa,0x0a,0x83,0x47,0x12,0xb3,0x48,0x2f,0x62,0xd7,0x2d,0xd2,0xcc,0x5a,0x92,0xe6,0x94,0xea,0xee,0x18,0x86,0xaa,0xd9,0xb2,0x35,0x00,0x00,
- 0x05,0x20,0x4a,0xf9,0x58,0xf5,0x40,0x17,0xda,0x9c,0x2e,0x68,0xab,0x7f,0x49,0xf4,0x05,0xc4,0x3a,0x87,0xe4,0x5d,0xb3,0xae,0xbe,0x77,0x5b,0x23,0x1c,0x3b,0xa2,0xe2,0x46,0xf3,0x00,0x00,
- 0x05,0x20,0x4b,0x08,0x12,0xae,0x87,0x8a,0xfc,0x01,0xf5,0xf3,0xe2,0x1e,0x4a,0x97,0x66,0xd8,0x39,0x38,0x8a,0x9f,0x05,0xc0,0xb7,0xd0,0x2f,0x52,0x23,0xec,0xae,0xce,0xab,0x3b,0x00,0x00,
- 0x05,0x20,0x4b,0x47,0x1e,0xa3,0x90,0x3d,0xe5,0xe0,0x03,0x41,0x85,0x68,0x58,0x9a,0x73,0x87,0x88,0xd0,0x57,0x06,0x3a,0x3b,0xc1,0xc0,0xb4,0x55,0x35,0x06,0xca,0x63,0x80,0x3a,0x00,0x00,
- 0x05,0x20,0x4b,0x9e,0x8b,0x6a,0x74,0x7f,0x4f,0xdb,0x9f,0x47,0xb1,0x0b,0xc7,0x15,0x66,0x92,0x81,0x60,0xbc,0xac,0x95,0xa8,0x1d,0x21,0xd2,0x64,0x1c,0x22,0x25,0x09,0x1f,0x0a,0x00,0x00,
- 0x05,0x20,0x4c,0x49,0x19,0xed,0xda,0x89,0xc2,0xa7,0xc2,0x98,0x0d,0x8d,0xf9,0xc3,0x81,0x1d,0x57,0x72,0x1f,0xcb,0x6a,0xc5,0x1e,0x8c,0x64,0xba,0xa8,0x6a,0x55,0x1a,0x5e,0x9f,0x00,0x00,
- 0x05,0x20,0x4c,0x5c,0x1a,0x10,0x46,0x65,0x29,0x06,0x3c,0x72,0x0d,0xec,0x18,0x11,0x63,0x9e,0xbf,0xbe,0x88,0xc2,0x23,0x1a,0x67,0x02,0x4d,0x08,0x54,0x3c,0xea,0x85,0x1a,0xd9,0x00,0x00,
- 0x05,0x20,0x4c,0x6a,0x6d,0x6a,0xf5,0x0b,0x13,0x88,0xaa,0x06,0xfb,0x23,0xed,0x6b,0x27,0x68,0xc1,0xb4,0x26,0x74,0x07,0xba,0x28,0x34,0xd6,0x8d,0x48,0xdf,0xc8,0xbd,0xc8,0xff,0x00,0x00,
- 0x05,0x20,0x4c,0x8d,0xc1,0xca,0xf5,0x32,0x45,0x0c,0xec,0x5a,0x81,0xa7,0x64,0x71,0x0f,0xda,0xf8,0xde,0x1d,0x77,0x70,0xc3,0x53,0x51,0x56,0x02,0x1f,0x81,0x59,0xda,0xf6,0x68,0x00,0x00,
- 0x05,0x20,0x4c,0xf7,0xda,0x58,0x2b,0xed,0xaf,0xf7,0xb9,0xb8,0xbb,0x98,0xa9,0x45,0x29,0x97,0xf3,0x8e,0xe3,0x0c,0xac,0xe8,0x3d,0xb5,0x8e,0x34,0xfe,0x24,0x7e,0xf7,0x5b,0x35,0x00,0x00,
- 0x05,0x20,0x4d,0x40,0xe3,0xef,0x62,0x78,0xb2,0xff,0x6b,0xcb,0x1d,0xa3,0xc0,0x64,0xfc,0x38,0x7a,0x24,0xb2,0xeb,0x0e,0x76,0x38,0x6c,0x57,0x44,0x86,0xbc,0xb7,0xf9,0xd7,0x49,0x00,0x00,
- 0x05,0x20,0x4d,0x56,0x9f,0xc3,0x17,0x13,0x1c,0xb2,0xff,0xd6,0x69,0x31,0x56,0x0e,0xf1,0x7a,0x09,0x99,0x5d,0x48,0x43,0x00,0xfb,0x5c,0x23,0x0a,0x2d,0xa7,0x9e,0xab,0xc2,0x42,0x00,0x00,
- 0x05,0x20,0x4d,0xa0,0xba,0xc1,0x85,0xab,0x86,0xd8,0xc9,0x63,0x26,0x90,0x38,0x4f,0x5d,0x85,0xd1,0x8a,0x9a,0x03,0x5c,0x75,0x0e,0x51,0xc3,0xec,0xbc,0xb5,0x31,0x64,0x63,0xf0,0x00,0x00,
- 0x05,0x20,0x4d,0xd2,0x2f,0xb8,0x9a,0xe5,0x6e,0x32,0x3d,0x45,0xaa,0xf7,0xee,0xc0,0xb6,0x8d,0xc4,0x01,0xe8,0xbb,0x4f,0x36,0x56,0x96,0x82,0x3c,0xeb,0x08,0x2a,0x03,0xd4,0x73,0x00,0x00,
- 0x05,0x20,0x57,0x18,0x23,0xf7,0x6c,0xfe,0xb3,0x5f,0xa4,0x63,0x06,0xde,0xe0,0x6b,0x2d,0xf8,0x51,0xb4,0x80,0x50,0xb1,0x43,0xce,0xbc,0x84,0x02,0xee,0x13,0xe2,0x43,0x76,0x45,0x00,0x00,
- 0x05,0x20,0x57,0x1e,0x99,0xf9,0x9a,0xe8,0xc5,0x76,0xbb,0x74,0x19,0x15,0xe8,0x82,0x4e,0x76,0x7b,0x99,0xc1,0xb8,0xb0,0x36,0x5d,0x3a,0xcf,0xa8,0x93,0x9a,0xa2,0x46,0xfb,0x4c,0x00,0x00,
- 0x05,0x20,0x57,0x41,0x19,0x7c,0xf2,0x89,0x68,0x10,0x0e,0x2e,0x27,0x4f,0xf7,0x61,0xe9,0x6c,0x2c,0x8f,0x57,0x55,0xbd,0xf1,0xe8,0xb1,0xb2,0xfe,0x68,0x12,0xfb,0xc0,0x45,0x43,0x00,0x00,
- 0x05,0x20,0x57,0x88,0x49,0x1e,0x4a,0xe5,0x4b,0xbe,0x07,0xa6,0x2b,0x62,0x0c,0xf1,0xfd,0x80,0x7d,0x21,0x57,0x8a,0xb7,0x88,0x85,0xcc,0x81,0x22,0xfa,0x4b,0xdb,0xca,0x23,0xdf,0x00,0x00,
- 0x05,0x20,0x57,0x8d,0x3f,0x72,0xe1,0xc7,0x50,0x66,0x2d,0xbd,0x39,0x45,0x4c,0xc9,0xf3,0xd4,0xda,0x34,0x33,0x31,0x1d,0x53,0xee,0xe1,0xdf,0xf1,0xf5,0xa3,0x77,0x07,0x5d,0x52,0x00,0x00,
- 0x05,0x20,0x57,0xd4,0x26,0xc6,0x04,0xde,0x03,0x0a,0x6a,0xdb,0x28,0x16,0x8f,0xe4,0x97,0x9f,0x9a,0x0f,0xbb,0xae,0xf7,0x63,0x7f,0x17,0xae,0x86,0x41,0xa5,0xb9,0xb2,0x8e,0x3c,0x00,0x00,
- 0x05,0x20,0x50,0x41,0x61,0x20,0x98,0x22,0xed,0x64,0x4e,0x29,0x75,0xbb,0xbf,0xe5,0xec,0x1a,0x9a,0x2b,0x22,0x1c,0xd4,0x4e,0x93,0x03,0x16,0xeb,0xbf,0x4e,0xfb,0x4c,0x56,0xb6,0x00,0x00,
- 0x05,0x20,0x50,0xa0,0xa7,0x4c,0xef,0x59,0x18,0x05,0x21,0xe5,0x79,0x00,0x9b,0xb2,0x9c,0xbc,0xa5,0x97,0x82,0xef,0x7c,0x4d,0x3a,0x57,0xb3,0x31,0x46,0x08,0x11,0x26,0xd4,0xa1,0x00,0x00,
- 0x05,0x20,0x50,0xe2,0x20,0xc7,0xd6,0x36,0x82,0x9f,0x39,0x0f,0x90,0x49,0x0c,0x78,0x2f,0xdd,0x7e,0x38,0x3e,0x67,0xf0,0x8e,0x4a,0xa3,0x12,0x65,0x5d,0xc0,0x8e,0x60,0xf9,0x46,0x00,0x00,
- 0x05,0x20,0x51,0x0e,0xe9,0x30,0xca,0xff,0x8b,0x76,0xa7,0x16,0x82,0x53,0xe6,0xc2,0x5c,0x71,0xcd,0xc3,0xca,0x93,0x5a,0x47,0x94,0xbb,0x92,0x95,0x8f,0x75,0xa7,0xab,0xec,0xc4,0x00,0x00,
- 0x05,0x20,0x51,0xef,0x1a,0x38,0x0e,0x67,0xd3,0x47,0x09,0x4a,0x76,0xa6,0x1b,0xc1,0xdb,0x0b,0x62,0x96,0x3a,0x09,0x38,0xdc,0x01,0xe3,0x78,0xc4,0x79,0x00,0x0b,0x3c,0x93,0x99,0x00,0x00,
- 0x05,0x20,0x52,0x40,0x0d,0xe5,0x6f,0xe4,0x90,0xf2,0xdd,0x0a,0x51,0x26,0x6a,0xae,0xfc,0x75,0xe1,0xd7,0x2b,0xbf,0x41,0x6e,0x46,0x85,0x04,0xb3,0x25,0x12,0x5b,0xcb,0x15,0xbf,0x00,0x00,
- 0x05,0x20,0x52,0x6b,0x1c,0x98,0x4a,0x04,0x83,0xdf,0xe2,0x07,0x5d,0x2a,0x90,0xae,0xfa,0x69,0xaf,0x29,0xd1,0x85,0x37,0xa9,0x42,0xe7,0xac,0x17,0xf3,0x82,0x4d,0x49,0x5c,0x7e,0x00,0x00,
- 0x05,0x20,0x52,0x90,0x79,0x1f,0x45,0x05,0xb4,0x6b,0xa1,0x7e,0x44,0xf8,0x65,0xb9,0x7c,0xa6,0xfe,0x21,0x46,0x94,0xcc,0xa9,0x2c,0x21,0x50,0xa6,0x58,0xa2,0x95,0x3b,0xb3,0x7d,0x00,0x00,
- 0x05,0x20,0x53,0x36,0x1e,0xa7,0xc2,0x84,0x45,0x02,0x58,0x6f,0xa5,0x48,0x80,0xbe,0x76,0xe9,0x8d,0x4b,0x2a,0x76,0x03,0x77,0xe4,0xad,0xd6,0xe5,0xf0,0xa7,0x9b,0x43,0x34,0x7c,0x00,0x00,
- 0x05,0x20,0x53,0xde,0x27,0x47,0xbc,0x52,0x8c,0x4f,0x08,0xd0,0xe7,0xdb,0x92,0x55,0x65,0x89,0xc3,0x74,0x34,0xc2,0x49,0x58,0xad,0x11,0x8a,0x88,0xc0,0x44,0xbd,0x17,0x54,0x07,0x00,0x00,
- 0x05,0x20,0x54,0x94,0x81,0xae,0x6c,0x0a,0x0c,0xfd,0x12,0x6f,0xe3,0xc6,0xbf,0x7d,0x44,0xd4,0x32,0x94,0xdb,0xde,0xb4,0x00,0x88,0xe6,0x3c,0xb3,0x74,0x07,0xc3,0x8e,0xf8,0x54,0x00,0x00,
- 0x05,0x20,0x54,0xaf,0x74,0x35,0x24,0xdf,0x7f,0x91,0x4d,0x4e,0x0d,0x9b,0x79,0x63,0x9c,0x18,0xd1,0x58,0x7f,0x0f,0xd3,0x76,0xde,0x99,0xcf,0x57,0x1c,0xa4,0x47,0x55,0x31,0xc0,0x00,0x00,
- 0x05,0x20,0x54,0xe8,0x0d,0xa7,0x9b,0x42,0x6e,0x73,0x9c,0xa4,0x5a,0x64,0xfd,0xe9,0x43,0x45,0x10,0x2e,0xb5,0x6d,0x2b,0x55,0x7d,0x90,0x0b,0xc7,0xdc,0x9a,0x83,0x95,0xb2,0x9d,0x00,0x00,
- 0x05,0x20,0x55,0x33,0x4f,0xec,0xd9,0xaa,0xda,0xe3,0x70,0x43,0x98,0xd5,0xf2,0x0c,0x34,0x95,0xe3,0xc7,0xa0,0xca,0x6d,0x6c,0x6d,0x05,0x2e,0xf2,0xf9,0xea,0x1a,0x46,0x64,0x67,0x00,0x00,
- 0x05,0x20,0x55,0xb7,0x5f,0x1a,0x1d,0x91,0x18,0x69,0xf0,0xc6,0xf2,0x27,0x46,0x6e,0x13,0x06,0x16,0x06,0xe1,0xc5,0xfd,0x9b,0xe0,0xb4,0x2d,0x30,0xc8,0x1c,0x72,0xe8,0xbd,0x1c,0x00,0x00,
- 0x05,0x20,0x5e,0xfd,0xc6,0xd0,0x76,0x72,0x7d,0xb2,0x93,0xad,0x92,0x58,0xd4,0x22,0x8d,0xf6,0xc9,0xbc,0x08,0x70,0x8a,0x70,0xa6,0x84,0xa8,0xbd,0xe7,0x12,0x76,0x4f,0xbf,0xcc,0x00,0x00,
- 0x05,0x20,0x5e,0xc0,0x23,0xf6,0xc1,0x1d,0xf6,0xde,0xb6,0x1d,0xdc,0xab,0xe9,0x80,0xc8,0x4c,0x43,0x22,0x6d,0xb6,0x06,0x8c,0xa8,0x67,0xae,0x4f,0xc0,0x82,0xe0,0x08,0xcb,0xc5,0x00,0x00,
- 0x05,0x20,0x5f,0x4a,0x89,0x83,0x91,0xfb,0x50,0x88,0xec,0xf7,0x65,0x3e,0xcc,0x8a,0xd1,0x41,0xae,0x86,0xaa,0x2d,0xe3,0xa0,0x42,0x30,0x23,0x51,0x80,0xef,0xab,0x58,0xcc,0xce,0x00,0x00,
- 0x05,0x20,0x5f,0x5c,0x15,0x2b,0xf9,0xcb,0x9f,0xb6,0xe6,0x6d,0x9f,0x90,0x9a,0x1b,0x3c,0x72,0xa1,0x2c,0x1c,0xe1,0xeb,0xbc,0x65,0x06,0x0e,0x9c,0xcd,0x0c,0xe7,0x22,0x35,0x56,0x00,0x00,
- 0x05,0x20,0x58,0x11,0xbe,0xef,0x99,0xf6,0x65,0xa9,0xd1,0x59,0x45,0xc6,0x03,0x44,0x48,0x26,0x68,0xcd,0x05,0x58,0xa0,0x24,0xad,0x4a,0x37,0x4c,0x5b,0xef,0xe2,0x9c,0x17,0x7e,0x00,0x00,
- 0x05,0x20,0x58,0x50,0x5d,0xb0,0xc6,0xd0,0x74,0x88,0xf4,0x6a,0xcf,0xe9,0xe4,0x02,0x63,0x8d,0x11,0xa3,0xe8,0x1e,0xe5,0x56,0xc2,0x94,0x45,0x34,0x1a,0xf4,0xd2,0xb6,0xc8,0x2e,0x00,0x00,
- 0x05,0x20,0x59,0x29,0xbf,0x85,0xf3,0xa5,0x29,0xdd,0xff,0xec,0x47,0xc4,0x1e,0xcf,0x55,0x95,0x38,0x72,0x48,0x2b,0xc5,0xd7,0xdc,0xbe,0x6d,0x6a,0xb9,0x57,0x0c,0xee,0xad,0x88,0x00,0x00,
- 0x05,0x20,0x59,0x69,0x5c,0xe7,0x22,0x25,0x10,0xae,0xd3,0xaf,0x68,0xf4,0x8f,0x7c,0x0c,0x21,0x88,0xbe,0xd0,0x1a,0x8c,0x5a,0xd1,0x5d,0x58,0xc0,0xbe,0x13,0xcc,0x90,0xfe,0xc0,0x00,0x00,
- 0x05,0x20,0x59,0x9e,0xe4,0xbd,0xc8,0xbf,0xf2,0x3f,0x0c,0xef,0x77,0x4e,0x38,0xb6,0xcc,0xe5,0x09,0x84,0xd5,0x1f,0x98,0x5d,0x3e,0x42,0x50,0xc0,0x55,0xba,0x3e,0x8e,0x13,0x5e,0x00,0x00,
- 0x05,0x20,0x59,0xff,0x04,0xb9,0x81,0x13,0x10,0x45,0x56,0xbe,0x6a,0x33,0xd2,0x15,0x71,0xef,0x44,0xd1,0xed,0xd7,0xbf,0xdb,0x4a,0x4b,0xd5,0x61,0x0f,0x02,0xb8,0x71,0xf7,0xf2,0x00,0x00,
- 0x05,0x20,0x59,0xe8,0xfa,0x6d,0xd6,0x3d,0x05,0xf8,0x5a,0xb8,0x28,0x32,0x65,0x04,0x4c,0x8f,0xe4,0x97,0xf6,0x10,0xbb,0xe5,0xfd,0xea,0xb8,0xee,0xab,0xef,0x96,0x4d,0xe9,0xa9,0x00,0x00,
- 0x05,0x20,0x5a,0x39,0x5a,0x3a,0xa0,0x2d,0xd3,0x12,0xf7,0x8a,0xa9,0x4d,0xb6,0x26,0x26,0xd3,0x08,0x19,0x78,0x83,0x7a,0xfb,0x88,0xc7,0x43,0x71,0xc6,0x3a,0x99,0x97,0x4e,0x2b,0x00,0x00,
- 0x05,0x20,0x5a,0x29,0xfe,0x8a,0xaa,0x9d,0x78,0x81,0x04,0x53,0x37,0xf5,0x6f,0xb6,0xe1,0x57,0x08,0x80,0xcf,0xf6,0x03,0x11,0x92,0x8d,0x08,0xe3,0x99,0x9f,0x98,0x4a,0x27,0x6b,0x00,0x00,
- 0x05,0x20,0x5b,0x16,0x5d,0xe1,0x38,0x37,0x06,0x98,0x87,0xf6,0x9e,0x59,0x10,0xf0,0xa1,0x53,0xa3,0x00,0x83,0xea,0xe2,0xea,0xaf,0x82,0xfc,0x73,0x01,0x8e,0x30,0x38,0x9d,0x1e,0x00,0x00,
- 0x05,0x20,0x5b,0xc0,0xbf,0x7e,0xc7,0x8b,0x90,0xfd,0x8b,0x58,0x4f,0x0b,0x70,0x83,0x09,0xe7,0x87,0xb9,0xc7,0xae,0x96,0x20,0xe3,0x78,0x8b,0xeb,0x7c,0x29,0xaa,0x63,0x68,0x15,0x00,0x00,
- 0x05,0x20,0x5b,0xc8,0xa9,0xb9,0xb1,0xd5,0x30,0x87,0x1e,0x99,0x46,0xfb,0x23,0xcd,0x3b,0x70,0x01,0xff,0xc5,0x4b,0x64,0x24,0x8a,0xd3,0x03,0xba,0x85,0x75,0x10,0x1a,0x1d,0xa9,0x00,0x00,
- 0x05,0x20,0x5b,0xca,0x5c,0x11,0x32,0x55,0xac,0x07,0xe8,0xce,0xfb,0x98,0xc6,0x47,0x04,0xbe,0x81,0x49,0xad,0x4c,0x13,0x5a,0xf5,0x6a,0x6c,0xf0,0x11,0x3b,0x88,0x0b,0xb4,0x4e,0x00,0x00,
- 0x05,0x20,0x5b,0xe0,0xa3,0x04,0x8a,0xd8,0x91,0xbb,0x72,0x0e,0x0b,0xc9,0x02,0x3d,0x2e,0x8e,0xc3,0x45,0x67,0xbd,0xec,0x72,0xb6,0x18,0xe2,0x57,0x1d,0xfb,0x58,0x3f,0x02,0x72,0x00,0x00,
- 0x05,0x20,0x5b,0xe2,0x66,0x28,0x5c,0xec,0xc9,0xf9,0x2a,0xff,0x89,0x4a,0xfc,0xff,0x42,0x07,0x45,0xbc,0x8c,0xdb,0x98,0x02,0x85,0x48,0x61,0x70,0x1d,0xdb,0x72,0xc2,0x25,0x3a,0x00,0x00,
- 0x05,0x20,0x5c,0x1b,0xbd,0x28,0xc8,0x17,0x04,0x86,0x8b,0x10,0x5e,0x02,0xfb,0x07,0x16,0x14,0x5d,0x61,0x5d,0x92,0x11,0x44,0xce,0x32,0x13,0xe1,0x4c,0xfd,0x72,0x12,0xde,0x37,0x00,0x00,
- 0x05,0x20,0x5c,0x40,0x7f,0x80,0x43,0x91,0x9c,0xfc,0x04,0xdc,0xdc,0x8e,0x01,0xda,0xc8,0xaf,0x90,0x62,0x64,0x16,0xf7,0x11,0xe4,0x87,0xac,0xa4,0x06,0x6f,0x8d,0x87,0x4e,0xd6,0x00,0x00,
- 0x05,0x20,0x5c,0xbb,0xa4,0xff,0x86,0xb4,0xe5,0x18,0x1d,0x66,0x80,0x80,0x8d,0x09,0x2b,0xd4,0x44,0x8a,0x95,0x01,0xfa,0x72,0xea,0x8b,0x9c,0xef,0x0f,0xe9,0xc3,0x68,0xf2,0xbf,0x00,0x00,
- 0x05,0x20,0x5c,0xba,0xe9,0xbf,0xac,0xc0,0x59,0x78,0x48,0x04,0x02,0x07,0xfb,0x2d,0xd1,0x46,0xa8,0xa4,0x10,0x87,0x8f,0xb9,0xc0,0x0d,0x25,0xb0,0xef,0x4b,0xfd,0x37,0x5d,0x4c,0x00,0x00,
- 0x05,0x20,0x5c,0xe6,0x36,0x85,0x74,0xae,0x03,0x90,0xa6,0x1d,0xd4,0xfb,0x50,0x8d,0x4a,0xdb,0xeb,0x91,0x7b,0x38,0x46,0x9c,0x94,0x7f,0x09,0x1b,0xc4,0x69,0x9b,0x3f,0xde,0x83,0x00,0x00,
- 0x05,0x20,0x5d,0x1a,0xab,0x05,0x64,0xb2,0xe7,0x58,0x72,0x4f,0x9f,0xd3,0xda,0x69,0xa5,0x7c,0x30,0xd1,0xd4,0xc4,0x7a,0xfe,0x41,0xa9,0x11,0xa6,0xf5,0xa6,0x32,0x6f,0xc6,0x97,0x00,0x00,
- 0x05,0x20,0x5d,0x46,0x18,0x02,0xa6,0x1b,0x99,0xd3,0xf4,0x64,0x6d,0x94,0xc1,0xda,0x4b,0x2e,0x6e,0x25,0x17,0xc4,0x18,0xec,0x55,0x91,0x61,0x71,0xbf,0x33,0x3b,0x4c,0xfd,0x24,0x00,0x00,
- 0x05,0x20,0x5d,0x93,0x10,0x3d,0x45,0x25,0xd3,0x84,0xc0,0xba,0x8c,0x47,0x1e,0x18,0xe7,0xbb,0x17,0x1d,0xa4,0x78,0x34,0x9c,0xd2,0x4c,0xd3,0x39,0x0c,0xba,0xb2,0x34,0xed,0xfd,0x00,0x00,
- 0x05,0x20,0x5e,0x0d,0xaf,0x49,0x2a,0x15,0xfa,0x82,0x0f,0xa0,0xe0,0x3e,0x91,0xdd,0x85,0x23,0xd6,0x51,0x36,0x97,0xd9,0x69,0x7e,0xc6,0x57,0xca,0x99,0xd6,0x18,0x21,0x92,0xd7,0x00,0x00,
- 0x05,0x20,0x5e,0x20,0xcc,0x1a,0x22,0xf1,0xa8,0x9b,0x83,0x97,0x5b,0x6d,0x05,0x53,0x75,0x99,0x54,0x18,0xcb,0x23,0x42,0x23,0x20,0x19,0xbe,0xb8,0xf5,0x8b,0x71,0x55,0x70,0xe3,0x00,0x00,
- 0x05,0x20,0x5e,0x69,0x4f,0x31,0x33,0xa7,0xea,0x3e,0xf4,0x7a,0x0a,0x1e,0x74,0x09,0x07,0xa1,0x50,0xf7,0x03,0xf5,0xc6,0x19,0xeb,0x95,0xaa,0x63,0x17,0x10,0x6e,0x68,0xca,0x10,0x00,0x00,
- 0x05,0x20,0x66,0x95,0xf0,0x25,0x09,0xd5,0xaa,0x62,0xbe,0x41,0x36,0xf5,0x9a,0x3a,0x21,0x92,0x67,0xfd,0x23,0x04,0xdb,0xb3,0x9f,0x0c,0x38,0xbc,0xd3,0xdf,0x96,0xff,0xbc,0xa1,0x00,0x00,
- 0x05,0x20,0x66,0xce,0xb6,0x27,0x46,0xce,0x84,0xee,0x9a,0x9c,0x94,0xb7,0x64,0xf0,0x3f,0x20,0x48,0x6d,0x5c,0x2a,0x8c,0x7d,0xd7,0x1a,0xf5,0x3b,0x7f,0xea,0x5d,0xa0,0xec,0x18,0x00,0x00,
- 0x05,0x20,0x67,0x1d,0xa5,0x34,0x71,0xff,0x44,0xbb,0x91,0x96,0x0c,0x3a,0xcf,0x55,0xae,0x57,0xc8,0x88,0x48,0xe5,0xe6,0xac,0x94,0xd4,0x06,0xf8,0xe7,0x6b,0xcc,0x05,0xb9,0xe2,0x00,0x00,
- 0x05,0x20,0x67,0x82,0xfc,0x36,0xea,0xae,0x95,0x3b,0x5d,0x46,0xf3,0xf4,0x6c,0x50,0x69,0x29,0xc7,0x47,0x87,0xca,0xa6,0x40,0x12,0x40,0x6d,0x12,0x94,0x35,0x17,0x8a,0xba,0x56,0x00,0x00,
- 0x05,0x20,0x61,0x3d,0x7d,0x3f,0x8c,0xf2,0x6d,0xb1,0x5d,0x1a,0xba,0xf8,0x0d,0xfe,0x9c,0x74,0x72,0xca,0xee,0xe3,0x73,0xe3,0xd9,0xea,0xa6,0xb2,0x58,0x0a,0x22,0x90,0x8b,0x33,0x00,0x00,
- 0x05,0x20,0x61,0x7d,0x36,0x2c,0x86,0x7f,0xe8,0x60,0x7b,0xc2,0x18,0x08,0xbe,0xef,0xfe,0xa0,0x33,0xc8,0x0f,0x76,0x00,0xa8,0x7e,0x73,0x15,0x23,0xc1,0xb5,0x06,0x9c,0x2a,0xb6,0x00,0x00,
- 0x05,0x20,0x61,0xcd,0x72,0x0b,0xbf,0x97,0x8f,0xf2,0x22,0xe6,0x23,0x24,0x63,0xac,0x54,0x3b,0x0c,0x7f,0xb3,0xef,0xfb,0xcf,0x01,0xf5,0x59,0x63,0x39,0x67,0x56,0x2f,0xd3,0xe1,0x00,0x00,
- 0x05,0x20,0x62,0x5f,0x45,0x80,0x05,0x1e,0x28,0x06,0xba,0x92,0x59,0x5e,0x91,0x4a,0xb4,0x62,0x38,0x41,0xcc,0x4a,0x2d,0x36,0x52,0xb7,0x68,0x78,0x02,0xab,0xa7,0x92,0x6e,0xfb,0x00,0x00,
- 0x05,0x20,0x62,0xc0,0xa3,0xcb,0x88,0xb8,0xa1,0x6a,0xab,0x95,0x77,0x04,0x4d,0xad,0xc0,0xef,0x2c,0xc1,0xac,0xa8,0x69,0x95,0xfd,0xa5,0xce,0x54,0x54,0x18,0x83,0xcf,0x7c,0x39,0x00,0x00,
- 0x05,0x20,0x63,0x55,0x06,0xee,0x3c,0x4b,0x0d,0xea,0xc5,0x8b,0x7c,0x40,0x12,0x35,0xa3,0xc1,0x67,0xac,0xe9,0x36,0xf1,0xb8,0xd9,0x35,0xcb,0x9f,0x37,0xc1,0x39,0x0a,0x5b,0x31,0x00,0x00,
- 0x05,0x20,0x63,0x62,0x11,0x6e,0x08,0xe6,0x68,0xad,0x4f,0x26,0x3b,0x31,0xde,0xa9,0xeb,0x05,0x9a,0x24,0x1f,0xc9,0x53,0x27,0xfe,0xc0,0x59,0x2d,0x35,0xf2,0x36,0x9b,0x30,0x88,0x00,0x00,
- 0x05,0x20,0x63,0x63,0x12,0x14,0x81,0x86,0xf1,0x78,0xe8,0x15,0x7c,0x5f,0xb0,0x63,0xf6,0xe6,0xa5,0x7d,0x7d,0x09,0xaf,0xa5,0x34,0xad,0x39,0x7d,0x9c,0x76,0x95,0xaa,0x36,0xbc,0x00,0x00,
- 0x05,0x20,0x63,0xb5,0xf9,0xfa,0xd8,0x67,0xbd,0xe0,0xee,0xc5,0x05,0x0e,0xd1,0xc1,0xc2,0x09,0x26,0x39,0x4a,0x57,0x54,0x88,0xff,0x5f,0x83,0x13,0xe8,0x7e,0x8e,0xe4,0xff,0x9c,0x00,0x00,
- 0x05,0x20,0x63,0xbc,0xc7,0xea,0x78,0x63,0x01,0xd5,0xea,0x56,0x70,0x7c,0xa8,0x67,0x21,0xd7,0x44,0x26,0x18,0x42,0x2a,0x7a,0xf4,0x0b,0xce,0x62,0x54,0xa9,0xd7,0x96,0xa9,0x35,0x00,0x00,
- 0x05,0x20,0x63,0xd1,0xf0,0xa2,0xa1,0x8e,0x9f,0x8b,0x48,0xc0,0x94,0x97,0x6e,0xd8,0x9f,0xf7,0x99,0xfe,0xfd,0xd2,0xd7,0xbd,0xf3,0xec,0xf0,0x69,0xc4,0x59,0x82,0x59,0x1d,0x76,0x00,0x00,
- 0x05,0x20,0x63,0xe0,0x1d,0xa4,0x6c,0x1a,0x02,0x08,0xc4,0xab,0xc2,0x10,0xae,0xd9,0x3b,0x22,0x91,0x3b,0xbc,0x9a,0x74,0x10,0x4c,0xcd,0x60,0xbe,0xe8,0xe6,0x5e,0x4f,0x34,0xab,0x00,0x00,
- 0x05,0x20,0x64,0x1c,0x2a,0x1e,0xfb,0x85,0x85,0x62,0xd2,0x88,0x6f,0x35,0x8a,0x1e,0x70,0x33,0x3f,0xe1,0xc5,0x6c,0x2d,0x72,0x85,0x17,0xf4,0x8b,0xa7,0xfe,0xc2,0xdb,0xc2,0x9e,0x00,0x00,
- 0x05,0x20,0x64,0x42,0x7b,0x79,0xd6,0xff,0xc2,0x98,0x30,0x3e,0xfc,0x69,0x10,0xa8,0x4b,0xe5,0xe5,0xa7,0x09,0x3c,0x7c,0xd1,0xe3,0xb7,0x3c,0xb0,0xa4,0x6f,0x04,0x74,0xb4,0xf0,0x00,0x00,
- 0x05,0x20,0x64,0x70,0xf4,0xc7,0x45,0x01,0x92,0x73,0x7b,0x3c,0x45,0xe3,0xfd,0x97,0xad,0x7a,0x89,0x87,0x5e,0x49,0x03,0x04,0x3a,0xf6,0x82,0xf3,0x93,0xd7,0x23,0x58,0x5c,0xab,0x00,0x00,
- 0x05,0x20,0x64,0x92,0xbe,0x03,0xec,0x1b,0xff,0x7d,0x04,0x4b,0x5b,0x03,0x7a,0x44,0xe5,0x64,0xef,0x57,0x2f,0x0a,0x73,0x73,0xce,0xbe,0x4c,0x3f,0xd3,0xe7,0xbe,0x65,0xc6,0x3a,0x00,0x00,
- 0x05,0x20,0x64,0xd7,0x96,0xde,0x18,0x07,0x5a,0x1a,0x61,0xd1,0xc0,0x73,0x45,0xf0,0x4f,0x1a,0xe2,0xda,0xae,0x27,0x02,0xef,0xa2,0x38,0xd6,0x48,0x89,0xd4,0xef,0x49,0x97,0x6c,0x00,0x00,
- 0x05,0x20,0x65,0x7e,0x1e,0x70,0x74,0x05,0xe0,0xfc,0x84,0x79,0x9b,0x62,0x3a,0xb5,0x3e,0xc3,0xe4,0xff,0xe0,0xf2,0xe6,0x76,0x31,0x6a,0x1e,0xe2,0x5d,0x5f,0x3e,0x28,0x9b,0x12,0x00,0x00,
- 0x05,0x20,0x65,0x65,0xd0,0x6e,0x5e,0x89,0x8a,0x1a,0xd4,0xd0,0xe7,0x2d,0x9c,0x0f,0xbf,0xa9,0x7a,0xf8,0xed,0x22,0x99,0xc5,0xd8,0x0d,0xdf,0xed,0xcc,0x9e,0x49,0x72,0x67,0xe7,0x00,0x00,
- 0x05,0x20,0x65,0x85,0x07,0x13,0x4b,0xa7,0xe9,0xe7,0x1a,0xce,0xff,0xd5,0x1e,0xca,0x3c,0xb5,0xfc,0xfb,0xb5,0xd3,0x50,0xc8,0x25,0x6f,0x18,0x49,0x4f,0xca,0x29,0x78,0x9a,0x74,0x00,0x00,
- 0x05,0x20,0x65,0x89,0x53,0xf6,0x3d,0x1a,0xb2,0x31,0xad,0xda,0x72,0xfc,0x17,0x25,0xe3,0x1c,0xb6,0xa6,0xbb,0x97,0x83,0xb1,0xe7,0xfa,0x8b,0x40,0xf6,0xf0,0x01,0x86,0x8c,0xd6,0x00,0x00,
- 0x05,0x20,0x65,0xb0,0x9c,0x8e,0x26,0x9e,0x1e,0x1b,0x27,0x14,0x5d,0xb8,0x82,0x92,0x64,0x4e,0x7d,0x7a,0x4a,0x12,0x9d,0x73,0x85,0xe6,0x72,0x79,0xde,0x6d,0x47,0x59,0x2f,0xe8,0x00,0x00,
- 0x05,0x20,0x66,0x3d,0xe9,0xd2,0xb9,0x2e,0x31,0xe5,0x28,0x23,0x24,0x2a,0x62,0xbd,0x5b,0xbd,0x1d,0x72,0x46,0x82,0xbc,0xff,0xb9,0xdb,0xd6,0xbd,0x76,0x80,0x37,0x4f,0xd4,0x9b,0x00,0x00,
- 0x05,0x20,0x6e,0xcb,0xc6,0x98,0x32,0xd2,0x0d,0x57,0xed,0x3a,0xfd,0x64,0x8f,0xcc,0xe6,0xa4,0x2e,0xec,0x54,0x25,0x23,0x41,0x03,0x9b,0x0f,0xa4,0x07,0x9e,0xa1,0xd5,0x22,0xb4,0x00,0x00,
- 0x05,0x20,0x6e,0xca,0x0d,0x62,0x85,0xda,0x36,0xe7,0x8d,0x53,0x45,0xb1,0x7c,0x9c,0x2f,0xa0,0xc5,0x49,0xff,0x75,0x02,0xee,0x38,0xae,0x24,0xd5,0xe5,0xa7,0x38,0x8f,0x18,0xc0,0x00,0x00,
- 0x05,0x20,0x6f,0x3e,0x4e,0x19,0x45,0xed,0xe8,0x91,0x01,0x8d,0x90,0x22,0x5a,0x63,0xfc,0xdf,0x4e,0x59,0x1a,0x5c,0xc9,0xda,0x31,0x5c,0x16,0xd1,0x2a,0x02,0xb7,0xd1,0xd4,0x58,0x00,0x00,
- 0x05,0x20,0x6f,0x1b,0xf0,0xa2,0xa9,0x0e,0x98,0x52,0x99,0x6b,0xd5,0x16,0xfb,0x60,0x3c,0x66,0x9c,0xe6,0x57,0xb1,0x75,0xe6,0x34,0xf8,0x2c,0x58,0x78,0x23,0x3c,0xbb,0xb0,0xd2,0x00,0x00,
- 0x05,0x20,0x6f,0x33,0x6a,0x48,0x96,0xe8,0x9c,0x80,0xd2,0x3c,0x7e,0x8d,0xcd,0xf9,0x53,0x16,0xc5,0x87,0x1b,0x3b,0x92,0x97,0x99,0xd3,0xd1,0xa5,0x16,0x03,0x6d,0x24,0xf2,0x26,0x00,0x00,
- 0x05,0x20,0x6f,0xf0,0xa5,0x6c,0x57,0x14,0x32,0x27,0x11,0x0f,0x77,0xcc,0x7c,0x87,0xda,0x53,0xb8,0x3f,0x06,0xf9,0x29,0x88,0xdc,0xdd,0x12,0x9d,0x4d,0xe2,0xd0,0x4b,0x20,0x6a,0x00,0x00,
- 0x05,0x20,0x68,0x32,0x09,0x45,0x10,0x70,0x3d,0x07,0x5c,0x6b,0x36,0x53,0x69,0x18,0xd4,0x0d,0xd7,0xe4,0x71,0xa6,0x27,0x61,0xf7,0x33,0xed,0x42,0x41,0x04,0x6b,0x94,0x59,0xa8,0x00,0x00,
- 0x05,0x20,0x68,0x86,0x94,0xcc,0xe2,0x57,0xab,0xe7,0x9f,0x3c,0x58,0x06,0x3c,0x0b,0xe0,0xf8,0xb2,0xea,0x27,0x12,0xef,0x58,0x45,0x94,0x4e,0x7c,0xea,0xbd,0x1f,0x88,0xcc,0x17,0x00,0x00,
- 0x05,0x20,0x68,0xe6,0xe4,0x77,0x65,0xcf,0xc9,0xe6,0x2f,0xd5,0xf2,0x5b,0xbd,0xfb,0xfd,0x6d,0x84,0x8b,0x7d,0x94,0xeb,0x24,0xdf,0x80,0xb9,0x09,0xc8,0x17,0xc6,0x92,0x81,0xbe,0x00,0x00,
- 0x05,0x20,0x68,0xe8,0xd6,0xc9,0x38,0x7f,0x97,0xcb,0x6d,0x24,0x0b,0xad,0xcc,0x9a,0x45,0x88,0xe5,0x8d,0x2e,0x20,0x7a,0x4d,0x25,0x87,0x73,0xaf,0xc6,0x6f,0x3b,0x0f,0x28,0x6d,0x00,0x00,
- 0x05,0x20,0x68,0xef,0xad,0xde,0x15,0x9f,0x20,0x4c,0x93,0x28,0x3f,0x2c,0xb4,0xfd,0x90,0x9d,0x85,0xc6,0xe4,0x35,0x61,0xa4,0x48,0x78,0xa2,0xf1,0x34,0x31,0xe2,0xd1,0x62,0xad,0x00,0x00,
- 0x05,0x20,0x69,0x12,0xc4,0x3d,0xe4,0x73,0xf0,0xef,0xf6,0xc3,0xd9,0x93,0x13,0x88,0x1b,0x2c,0x7a,0xc7,0x68,0xdb,0xfb,0xad,0x9b,0x0c,0x99,0xbb,0x0d,0xfa,0x1e,0xfe,0xc1,0xae,0x00,0x00,
- 0x05,0x20,0x69,0x64,0x8d,0x94,0x8d,0xcc,0x72,0xe1,0x09,0x3f,0x0b,0xf3,0x4a,0xa4,0x37,0x6a,0x13,0xf1,0xb3,0x34,0x7c,0x4d,0xf4,0x03,0x86,0x25,0x1d,0x19,0xba,0x14,0x48,0x3f,0x00,0x00,
- 0x05,0x20,0x69,0x9b,0xd2,0x2d,0xb5,0x0b,0x35,0xbe,0x63,0x14,0x6f,0x54,0x14,0xe2,0x3f,0xf3,0xb1,0xd6,0x9e,0x35,0xc0,0x94,0xdd,0xec,0x50,0x10,0x6f,0xae,0x9e,0xdc,0x59,0x5d,0x00,0x00,
- 0x05,0x20,0x69,0xde,0x1a,0xea,0x20,0xac,0xfd,0x3e,0x94,0xf7,0xc5,0x68,0x78,0xdf,0x0c,0x06,0xff,0x67,0x9f,0xc3,0xcd,0x32,0xf1,0x8d,0x76,0xdd,0x1c,0x8a,0xe5,0x7e,0x9d,0xf8,0x00,0x00,
- 0x05,0x20,0x6a,0x38,0xd9,0x6d,0xd4,0xfd,0x7d,0x93,0xf6,0x11,0x05,0xaa,0xab,0x35,0x92,0x3b,0x63,0x91,0x60,0x5d,0xcb,0x92,0xab,0x7b,0x9f,0x8c,0x5a,0x87,0xad,0x94,0x8c,0x42,0x00,0x00,
- 0x05,0x20,0x6a,0x0d,0x12,0x85,0xd4,0xde,0x67,0xeb,0x5c,0x86,0x6f,0x50,0xce,0x0b,0x0c,0x43,0x52,0x24,0xb0,0x32,0x84,0x5d,0x1f,0xb6,0x62,0x8f,0x51,0xfc,0x57,0xc2,0x3d,0xab,0x00,0x00,
- 0x05,0x20,0x6a,0x13,0xf7,0xe4,0x3e,0x61,0xe3,0x10,0x74,0xcb,0x0e,0xc7,0x83,0x1d,0x33,0xef,0x64,0xd3,0x5a,0x28,0x56,0x46,0xb0,0x19,0x8f,0x91,0x7e,0x96,0xe9,0xcd,0xab,0x80,0x00,0x00,
- 0x05,0x20,0x6a,0x24,0x3e,0x58,0x12,0xe1,0x99,0xb7,0xaa,0xb4,0xb2,0x4f,0xb9,0x04,0x0e,0x76,0xfa,0x99,0xdd,0xcf,0xf6,0x34,0x3f,0xd0,0xdc,0x43,0x97,0xc1,0x14,0xaa,0x8a,0xbb,0x00,0x00,
- 0x05,0x20,0x6a,0x31,0x9f,0xd7,0xa5,0x19,0xe1,0x09,0xae,0x3c,0xc6,0xe6,0x23,0x0d,0xc4,0xa6,0xd9,0x86,0xce,0x81,0xe4,0xe3,0x9a,0x99,0x17,0x59,0x92,0x16,0x3a,0xc2,0x11,0x92,0x00,0x00,
- 0x05,0x20,0x6a,0xdd,0x0e,0xe9,0xae,0xad,0x1f,0xb1,0x02,0xc2,0x15,0x40,0x05,0x30,0x34,0x1b,0x9c,0x09,0xd9,0x56,0xf8,0xe0,0xb9,0xb6,0x3e,0x86,0xd3,0xc8,0x63,0xf1,0xf3,0x90,0x00,0x00,
- 0x05,0x20,0x6b,0x7e,0xfe,0x63,0xef,0xa3,0x76,0xcd,0xce,0xe0,0x80,0x54,0x47,0xcd,0x57,0xc2,0xb3,0x68,0x97,0xfd,0x8d,0x35,0x94,0x30,0x03,0x69,0x2c,0x9f,0x9b,0x71,0xe5,0x1a,0x00,0x00,
- 0x05,0x20,0x6b,0x93,0xf5,0x93,0xea,0x52,0x7b,0xca,0x31,0xde,0x60,0xcb,0x30,0x1a,0xb5,0x56,0xf5,0xf1,0x51,0x11,0xfc,0x3f,0xd0,0xb6,0xb4,0x79,0xe3,0x70,0x7d,0x49,0xa2,0x5a,0x00,0x00,
- 0x05,0x20,0x6b,0xc4,0xc2,0x1d,0x47,0x3f,0x33,0xab,0x4d,0x5b,0x2f,0x79,0xaf,0x23,0x31,0xc4,0xeb,0x0a,0xe0,0xbe,0x00,0x3e,0x7c,0x5f,0xc7,0x2f,0x92,0x30,0xde,0xa4,0x82,0x18,0x00,0x00,
- 0x05,0x20,0x6c,0x62,0x6e,0x3f,0xf3,0xcc,0xd6,0xbc,0xcc,0xeb,0x54,0x32,0xe6,0x41,0x1b,0x19,0x12,0x51,0x01,0x5f,0x9f,0xb6,0xdf,0xe7,0x34,0x73,0x27,0xd0,0x4f,0x39,0xeb,0x38,0x00,0x00,
- 0x05,0x20,0x6c,0xf7,0x89,0x02,0x5c,0xb3,0xd2,0x65,0x16,0x7d,0x7b,0x8f,0x12,0xca,0x6c,0xd5,0x4c,0x9f,0xcf,0x55,0xbe,0xf9,0x4d,0xea,0xae,0xc7,0xe3,0x07,0x37,0xe3,0x58,0x4c,0x00,0x00,
- 0x05,0x20,0x6d,0x34,0x07,0x7f,0x59,0xb0,0x31,0xa7,0xb9,0xaa,0x3c,0x4b,0xbd,0x6a,0xd8,0x2c,0x62,0xde,0x30,0x6c,0xc3,0xfe,0xde,0xc3,0xb7,0xcb,0x12,0x71,0x18,0x9d,0x70,0xd8,0x00,0x00,
- 0x05,0x20,0x6d,0x0a,0xb4,0x22,0xdb,0xa0,0x2b,0xb9,0xe4,0x60,0x5a,0x27,0xad,0x73,0x07,0x09,0x5e,0x24,0xcc,0xc5,0x8b,0x3a,0x81,0x7d,0xc1,0xf2,0xf6,0xc6,0x48,0x18,0xf0,0x9e,0x00,0x00,
- 0x05,0x20,0x6d,0x18,0x85,0x9f,0xe7,0x39,0xcb,0xe4,0x37,0x2a,0xcd,0x81,0x8d,0x9f,0x28,0x2f,0x14,0x88,0xba,0x12,0x9d,0xe0,0x1c,0xfc,0xf9,0xab,0xb1,0xa1,0x4c,0xcf,0x04,0x06,0x00,0x00,
- 0x05,0x20,0x6d,0x2c,0xf3,0xce,0x94,0x19,0x63,0x2b,0x20,0x72,0xd6,0xa0,0x98,0x7b,0x79,0x35,0xcf,0xdb,0x53,0xe4,0x88,0x0a,0xbd,0xf9,0x38,0x6a,0x29,0x73,0xe7,0xfd,0x42,0xb1,0x00,0x00,
- 0x05,0x20,0x6d,0x59,0x4a,0x01,0x27,0x05,0xbf,0xc3,0x77,0xdd,0x5e,0xc1,0xf1,0xbc,0x99,0x97,0x22,0xac,0xb3,0x5a,0xa0,0x7a,0x93,0x9f,0xcc,0x1d,0x73,0x4e,0x6d,0x3c,0x07,0x87,0x00,0x00,
- 0x05,0x20,0x6e,0x78,0xb8,0x7d,0xec,0x95,0x9a,0x60,0x12,0xb5,0xd5,0x21,0x80,0x21,0xb0,0xcd,0x26,0x5b,0xad,0x40,0xad,0xcc,0x32,0x6a,0xda,0x92,0xdd,0xa7,0xf8,0x9a,0x50,0x8b,0x00,0x00,
- 0x05,0x20,0x77,0x50,0x97,0xe5,0xd1,0xd9,0x1b,0xdb,0xb5,0xa3,0x66,0xdb,0x39,0xa3,0xee,0xe1,0x6f,0x5a,0xeb,0x93,0xdd,0x48,0x7e,0x1b,0xec,0x01,0xd5,0xf7,0x18,0x92,0x0f,0xbe,0x00,0x00,
- 0x05,0x20,0x77,0x83,0xfe,0x7e,0x0a,0x79,0xa9,0xe3,0x56,0x44,0x67,0xd6,0x4c,0x2e,0xac,0xbc,0x80,0x08,0x07,0x1e,0xfb,0xe9,0xde,0x95,0x90,0x6f,0x74,0x33,0x03,0x34,0xa8,0x6e,0x00,0x00,
- 0x05,0x20,0x77,0xa7,0xc2,0xc7,0xa0,0xc1,0x40,0x3c,0xa0,0x94,0x9c,0xa6,0x6b,0x09,0x6b,0xad,0xae,0x4a,0x65,0x2b,0xbb,0x33,0x26,0x3d,0x3b,0x3b,0xd5,0x52,0x14,0xf9,0x28,0x08,0x00,0x00,
- 0x05,0x20,0x77,0xaa,0x1a,0x3c,0x6d,0x78,0xfa,0x1b,0x54,0x57,0xfa,0x2a,0x02,0x08,0xd8,0x77,0xef,0xda,0x8e,0x9d,0x23,0x39,0x50,0x78,0x4c,0xbf,0x51,0x61,0x17,0xb3,0xc0,0x04,0x00,0x00,
- 0x05,0x20,0x70,0x09,0x00,0xa8,0xcf,0x22,0xb9,0x06,0xb3,0x6d,0x5e,0x3f,0xeb,0xea,0x65,0x88,0x07,0xa9,0xd1,0xba,0xb9,0x0a,0xb4,0x13,0x3f,0x06,0xe9,0x71,0x8c,0x90,0xe2,0x38,0x00,0x00,
- 0x05,0x20,0x70,0x4b,0xd5,0x15,0x5d,0x6f,0x1a,0xd9,0x5b,0xe4,0xcf,0x97,0x2f,0x08,0xf0,0xa7,0x17,0x9e,0x59,0x62,0x57,0xe9,0x3b,0x55,0x89,0x6a,0xd0,0xde,0x37,0x25,0x6c,0x9f,0x00,0x00,
- 0x05,0x20,0x71,0x30,0x3a,0xa9,0x2e,0x24,0x31,0xbe,0x7f,0x76,0xba,0x94,0x16,0x38,0x5e,0xce,0x7a,0xcf,0x64,0x4c,0x2f,0x9d,0x5d,0x1c,0xaa,0x12,0x3b,0xc2,0x16,0x48,0x9e,0x28,0x00,0x00,
- 0x05,0x20,0x71,0x74,0x6c,0x6a,0xa1,0x59,0xe7,0xdf,0xcd,0xbe,0xc1,0x45,0x99,0x2d,0xac,0x7e,0xaf,0x80,0x8d,0x00,0xce,0x66,0x0e,0x6f,0x1a,0xe5,0xbf,0xe9,0xaf,0xd3,0xa6,0xae,0x00,0x00,
- 0x05,0x20,0x71,0x8c,0xdf,0x40,0x2f,0x60,0x40,0x6d,0x6b,0x86,0xa3,0x00,0x6c,0x99,0xae,0xee,0xd8,0x67,0x64,0x3e,0xec,0xdf,0x99,0xf5,0x64,0xca,0x42,0x50,0x85,0x10,0x56,0x39,0x00,0x00,
- 0x05,0x20,0x71,0x9a,0xde,0x32,0xd6,0x9b,0x26,0x90,0xc5,0xb0,0xd2,0xa9,0x1f,0xc9,0xe2,0x2b,0x8e,0x8a,0xdd,0x71,0xae,0x77,0x22,0x81,0x93,0xdc,0xf9,0xe7,0xab,0x44,0xd2,0x03,0x00,0x00,
- 0x05,0x20,0x71,0xa0,0x31,0x43,0x48,0x34,0x96,0x7d,0xb7,0xa9,0x6e,0xe9,0x3c,0xea,0xaf,0x25,0x67,0x3a,0x2f,0x7e,0xf0,0x67,0xad,0x73,0xd5,0x42,0xca,0xd7,0x5a,0x98,0xab,0xaa,0x00,0x00,
- 0x05,0x20,0x72,0x92,0x06,0x4b,0x03,0xe5,0xa9,0x3a,0x9c,0xa7,0x91,0x4a,0x44,0xd9,0x5e,0x43,0xa3,0x4e,0x31,0x95,0xb0,0x0c,0x59,0x49,0xd8,0xe9,0xc4,0xe1,0x1b,0x46,0x4f,0xfc,0x00,0x00,
- 0x05,0x20,0x73,0x37,0xab,0x1c,0xf6,0xa8,0xa4,0x18,0x97,0x86,0xf5,0x0f,0xd3,0xd1,0xf2,0x5f,0xbe,0xe0,0x3c,0x42,0x75,0x22,0xab,0xe2,0x3f,0xa1,0x7b,0x9b,0x02,0x17,0x9d,0xc3,0x00,0x00,
- 0x05,0x20,0x73,0x18,0xac,0x7e,0x04,0x9d,0x0f,0xce,0x9f,0x8b,0x56,0xe2,0x04,0x2d,0x1a,0xf9,0x5a,0x13,0xc8,0xd7,0xae,0xf3,0x41,0x21,0xae,0x06,0x18,0xdc,0x31,0xdd,0xfe,0xfb,0x00,0x00,
- 0x05,0x20,0x73,0x1a,0x61,0x24,0xb6,0x9a,0x31,0x0b,0x04,0xb0,0x81,0x8d,0x90,0xaa,0x73,0x81,0x99,0xb0,0xaf,0x16,0xa7,0x36,0xa7,0xcd,0xda,0x7e,0x34,0x4e,0x19,0xff,0x29,0xe2,0x00,0x00,
- 0x05,0x20,0x73,0xda,0xfa,0xe7,0xec,0xc9,0x6d,0xe6,0xe1,0xe6,0x63,0x5b,0xdc,0x9a,0x6b,0xcd,0xff,0x7a,0x0b,0x96,0xfd,0x41,0x3e,0x86,0x51,0xe3,0x07,0x37,0xff,0xea,0xcf,0xc9,0x00,0x00,
- 0x05,0x20,0x74,0x22,0xbe,0xff,0x6d,0xb7,0x99,0x8d,0x3b,0xac,0xa3,0xfd,0x48,0x79,0xec,0xea,0x18,0xcb,0x6c,0xcd,0xaa,0x00,0x74,0x1b,0xa2,0x11,0x0c,0x49,0x72,0xc5,0x6e,0x0f,0x00,0x00,
- 0x05,0x20,0x74,0x6b,0x23,0xc7,0x10,0x86,0xb8,0xbd,0x70,0x9c,0x1d,0x5c,0x25,0x5f,0x44,0x52,0x78,0x7a,0x73,0x4e,0x9c,0x2f,0x2a,0xe2,0xb8,0xfc,0xd9,0xf3,0x9c,0x69,0x96,0x7e,0x00,0x00,
- 0x05,0x20,0x75,0x14,0x45,0x8e,0x06,0x75,0x41,0x53,0xed,0xaf,0x30,0x74,0x1c,0x7e,0xde,0x3d,0x0d,0xdf,0xf6,0x80,0x26,0xb9,0x9f,0x52,0x05,0x1a,0xfc,0x55,0x9f,0xec,0x07,0xa3,0x00,0x00,
- 0x05,0x20,0x75,0x5a,0xad,0xd8,0xa1,0x8a,0xab,0x5a,0x4c,0x9e,0xaa,0x9b,0xd3,0x2c,0xe3,0x9a,0xef,0x1f,0x37,0x15,0x20,0x50,0x55,0xd6,0x3d,0x5f,0xad,0x2f,0x49,0xd1,0x78,0x35,0x00,0x00,
- 0x05,0x20,0x75,0x89,0x75,0xd0,0x89,0x0e,0xc9,0x2c,0xdf,0x8f,0xd8,0x7d,0x9a,0x5f,0x06,0x34,0xaf,0x79,0xaa,0xe5,0x35,0xdd,0x85,0xa8,0x06,0x29,0x05,0x2d,0x84,0xc5,0x6b,0xd2,0x00,0x00,
- 0x05,0x20,0x76,0x74,0x80,0x6c,0xab,0x7b,0x36,0x3a,0x6a,0x78,0xa4,0xa8,0xb8,0xb7,0xe7,0xf9,0x34,0x47,0x6d,0x34,0xca,0xa2,0xc6,0xef,0x81,0xab,0x62,0xb1,0x46,0x86,0xaf,0xd0,0x00,0x00,
- 0x05,0x20,0x76,0x5a,0xf7,0x9c,0x68,0x91,0x6a,0xb1,0x24,0xca,0xab,0x71,0xe6,0x03,0xda,0xb6,0x3d,0xbf,0xb4,0xfc,0xac,0xdf,0x7b,0x5b,0x9f,0x41,0x5e,0xc5,0xc1,0x49,0xae,0xc2,0x00,0x00,
- 0x05,0x20,0x7e,0xc1,0x4d,0x5b,0xa9,0x6a,0xa1,0x43,0x5d,0xaa,0xa2,0x93,0xc8,0xd2,0x55,0xc3,0x6b,0x9d,0xba,0xe0,0xb0,0xcb,0xc0,0x27,0x24,0xc5,0xea,0x5a,0xe3,0x27,0x61,0x27,0x00,0x00,
- 0x05,0x20,0x7f,0x27,0x28,0x5a,0xa3,0x78,0x11,0x3a,0xac,0xc0,0xa2,0x4b,0x1d,0x33,0x50,0x0c,0x77,0xe8,0x22,0xd4,0x90,0x25,0xdc,0xa9,0x14,0x9f,0xed,0xab,0x24,0x4f,0xdc,0xa0,0x00,0x00,
- 0x05,0x20,0x7f,0x9d,0xb9,0xe5,0x6b,0x95,0x99,0xa4,0xf2,0xc0,0x3e,0xfa,0xd4,0x47,0x1c,0x98,0x87,0x4f,0x2e,0x1d,0x0f,0xbe,0x43,0x92,0xa2,0xbf,0x3b,0x20,0x13,0xef,0x0f,0x86,0x00,0x00,
- 0x05,0x20,0x7f,0xd0,0x52,0x21,0x3b,0xa9,0xc7,0x2d,0x8d,0x08,0x3d,0xfb,0x04,0x32,0x82,0xc6,0x4c,0x25,0x75,0xcc,0x2a,0xa1,0x71,0x71,0xea,0x08,0x53,0x32,0xd3,0x87,0x7f,0xad,0x00,0x00,
- 0x05,0x20,0x78,0x40,0x6f,0xfa,0xfd,0xc6,0x1d,0xd1,0xee,0xd8,0x7d,0x66,0xe3,0xdd,0x86,0x0c,0xc7,0x14,0xa4,0x3b,0xea,0xd2,0xd8,0x72,0xdd,0x2b,0xdc,0x6a,0x62,0x7d,0x62,0x7d,0x00,0x00,
- 0x05,0x20,0x78,0x4b,0x38,0xcc,0x73,0x38,0x53,0xd8,0x08,0x82,0x88,0x06,0x46,0xec,0xe3,0xad,0x9c,0xc8,0x44,0xd2,0x21,0x05,0xe4,0x07,0xa7,0xd7,0x1b,0xac,0x89,0x15,0x1c,0x00,0x00,0x00,
- 0x05,0x20,0x78,0xb8,0x3e,0xd7,0xfc,0x9c,0x79,0x5c,0xf7,0x8f,0x0c,0x7b,0xf2,0x24,0xc0,0xff,0xba,0x47,0xfa,0xb6,0x57,0x54,0xeb,0xf7,0xa6,0x2b,0x82,0x8e,0xf7,0xfa,0x03,0xe6,0x00,0x00,
- 0x05,0x20,0x78,0x85,0xe1,0x36,0x38,0xe3,0x01,0x45,0xff,0x2b,0x08,0xf7,0xa5,0x1c,0x0b,0x00,0x2a,0xa1,0x06,0xdd,0x38,0xd3,0x45,0x73,0x29,0xb3,0xdd,0x20,0x3a,0x29,0x40,0x84,0x00,0x00,
- 0x05,0x20,0x78,0x86,0xb8,0x5b,0x40,0xb3,0xde,0xe3,0x85,0x14,0x20,0xf9,0x12,0x94,0xd2,0xf3,0x76,0xba,0xee,0x67,0x3b,0x9b,0xb8,0xfb,0xe9,0x65,0xf5,0xee,0xea,0x17,0xd2,0x8f,0x00,0x00,
- 0x05,0x20,0x79,0x26,0x45,0x49,0xc5,0x35,0x8c,0xd1,0xc8,0x67,0xf3,0xaa,0x7d,0x60,0x6a,0x89,0x9f,0x88,0x1a,0x73,0x44,0xf9,0x49,0x52,0x52,0xe0,0x72,0xa9,0x54,0x70,0x50,0x48,0x00,0x00,
- 0x05,0x20,0x79,0xc8,0xd1,0xe3,0x13,0x8c,0x07,0x1d,0x54,0xb2,0xb6,0xd4,0x85,0xfb,0x14,0x47,0x6a,0x1d,0x3f,0x95,0xed,0xe8,0x31,0x93,0x26,0xef,0xed,0x21,0xdb,0xb4,0xc4,0x29,0x00,0x00,
- 0x05,0x20,0x7a,0xce,0xec,0xf7,0x77,0x3b,0xd6,0xcc,0x50,0x89,0x6c,0x8d,0xd0,0xa8,0xa4,0xd7,0x1d,0x6d,0xbc,0x2b,0x1e,0x24,0xe7,0x56,0x94,0x7d,0x3d,0x0b,0x07,0x6d,0x9c,0xc4,0x00,0x00,
- 0x05,0x20,0x7b,0x38,0xda,0x2a,0x39,0x68,0xc7,0xa5,0xd4,0x7b,0x91,0xd1,0x57,0xa6,0x22,0x0a,0x56,0xe6,0xcd,0x97,0x38,0x0d,0xab,0xe4,0x65,0xef,0xf5,0x26,0xd8,0x31,0xdb,0xfc,0x00,0x00,
- 0x05,0x20,0x7b,0x7a,0x2b,0xef,0x4b,0x4c,0x6b,0x94,0xfa,0xff,0x3b,0xcd,0x82,0x97,0x71,0x59,0x66,0x4b,0xce,0x0f,0x7f,0x32,0xdd,0xb5,0x45,0xa1,0x63,0x17,0xb5,0xf4,0x43,0x33,0x00,0x00,
- 0x05,0x20,0x7b,0x4f,0x27,0xd3,0x71,0x5b,0x85,0x91,0x87,0x32,0xc4,0x81,0xa4,0x16,0x72,0x33,0x91,0x8d,0xe4,0xc2,0x1e,0xb4,0x97,0x0d,0x8a,0xfe,0x46,0x90,0x34,0xe8,0x23,0x16,0x00,0x00,
- 0x05,0x20,0x7b,0xc9,0xa4,0x96,0x41,0xd5,0xe2,0xc3,0x5a,0x86,0x0c,0x3e,0x03,0x63,0x9c,0xa0,0x83,0xec,0x43,0x90,0x0d,0x0a,0x02,0xea,0x47,0xff,0x83,0xc5,0x59,0xe0,0xe2,0x45,0x00,0x00,
- 0x05,0x20,0x7b,0xc9,0x9e,0xef,0x11,0x97,0x96,0x06,0xe2,0xb8,0xbd,0x2e,0x15,0xc2,0xe8,0xa5,0x4e,0xd8,0x56,0xb3,0x01,0x59,0x60,0x20,0x7a,0x51,0x9f,0xa1,0xdf,0x55,0xea,0x01,0x00,0x00,
- 0x05,0x20,0x7c,0x1b,0x0b,0x5d,0x7f,0x4c,0xa2,0xe5,0x7e,0xa6,0x79,0x85,0x55,0xde,0xcb,0x51,0xbd,0x81,0x2a,0xfb,0xdb,0x76,0x6e,0x5c,0xbd,0x5d,0x68,0xd9,0xd9,0xbe,0xd8,0x7c,0x00,0x00,
- 0x05,0x20,0x7c,0x51,0xbf,0xfa,0x3e,0xa5,0x2c,0x66,0x85,0xa4,0xaa,0x91,0xf1,0x6f,0xdb,0x3f,0x23,0x82,0xd9,0x39,0x07,0xde,0x20,0x96,0x56,0x84,0x2e,0xaf,0x1d,0xb1,0x51,0xd2,0x00,0x00,
- 0x05,0x20,0x7c,0x85,0x6e,0xe3,0x20,0x4f,0x53,0x2d,0x15,0xbf,0x36,0x63,0x97,0x27,0xd3,0x23,0x9a,0xb9,0x38,0xeb,0x0b,0x6a,0x31,0x3b,0xdd,0xa0,0x46,0x42,0xbd,0xaf,0xb1,0xde,0x00,0x00,
- 0x05,0x20,0x7c,0xf6,0xc8,0x32,0xaa,0xaf,0xc0,0xb2,0x24,0x1f,0xa8,0x27,0x35,0xe2,0x54,0xf5,0xfe,0x64,0xb4,0x36,0x85,0x6d,0x3a,0x72,0x4a,0xc8,0x03,0x55,0x27,0x33,0x2a,0x35,0x00,0x00,
- 0x05,0x20,0x7d,0x3c,0x4d,0x07,0xa1,0xcf,0xfb,0x06,0xb1,0xfa,0x8b,0xaf,0xae,0xe8,0x0a,0x92,0xd6,0xd4,0x4e,0xba,0x34,0x5a,0xdf,0xc0,0xb8,0xca,0x54,0x54,0x3b,0xf6,0xe9,0xfc,0x00,0x00,
- 0x05,0x20,0x7d,0x1b,0x25,0xbc,0xf3,0xf3,0xf1,0x26,0xae,0x64,0x3c,0xf5,0xc8,0x9a,0xb1,0x53,0x32,0x31,0xf3,0x7f,0x5b,0x5e,0x55,0xb9,0x36,0x02,0x97,0xd1,0xe3,0xcc,0x09,0x18,0x00,0x00,
- 0x05,0x20,0x7d,0x7c,0x6f,0xd1,0x0d,0xf7,0x77,0x12,0x44,0x68,0x45,0x46,0x69,0xb9,0x11,0x4d,0x5c,0xa4,0xba,0xc8,0xe0,0x76,0x5b,0x02,0x72,0xc8,0xd7,0x32,0x61,0xd2,0xda,0x34,0x00,0x00,
- 0x05,0x20,0x7d,0x61,0x8a,0xb7,0x4b,0x7d,0x5c,0x4c,0x1c,0xc2,0x35,0x1a,0xe8,0x4c,0x93,0x54,0x54,0xff,0xf9,0x04,0x36,0x1c,0x84,0x68,0x05,0xe0,0xa2,0xd5,0xcd,0xde,0x30,0x75,0x00,0x00,
- 0x05,0x20,0x7d,0xb9,0xaf,0x77,0xca,0xd5,0x43,0x6b,0xb2,0xb1,0x16,0xa0,0x19,0x67,0x69,0x92,0xea,0x2b,0x80,0xeb,0x6f,0xe2,0x43,0xc8,0x28,0x07,0x52,0x34,0x3b,0x4a,0x69,0xf7,0x00,0x00,
- 0x05,0x20,0x7d,0xc3,0x83,0xd7,0xda,0x98,0x87,0x08,0x3d,0x7e,0x78,0x5f,0xb7,0x1b,0xe0,0x4e,0x72,0x26,0x86,0xe8,0x65,0x7a,0xac,0x4f,0x67,0x40,0xf6,0x34,0x8f,0x74,0xb2,0x87,0x00,0x00,
- 0x05,0x20,0x7e,0x0b,0xa1,0x49,0x17,0x4d,0x0d,0x67,0xf8,0x03,0xd8,0x55,0x1c,0x6a,0x8b,0x56,0x53,0xf4,0x34,0x5f,0xe7,0xc7,0x26,0x3d,0x5f,0x41,0x03,0x44,0x0d,0x5c,0x5e,0xe2,0x00,0x00,
- 0x05,0x20,0x7e,0x1c,0xb2,0x70,0xd2,0x5c,0x58,0x46,0x94,0x4c,0x1f,0x10,0xb8,0x63,0x35,0x95,0x31,0x14,0xe0,0xa5,0x48,0x6d,0xf0,0x34,0xc4,0x6c,0xe0,0x95,0x29,0x69,0x44,0xe1,0x00,0x00,
- 0x05,0x20,0x86,0xe8,0x4a,0x24,0x7b,0xde,0x95,0xd8,0x26,0xe3,0x82,0x93,0x34,0xac,0xca,0x66,0xd5,0x3a,0x8f,0x1f,0x04,0xe5,0xc1,0x69,0xc6,0x15,0x5c,0xa7,0x1b,0x96,0x66,0xeb,0x00,0x00,
- 0x05,0x20,0x87,0x1d,0xf0,0x97,0x7f,0x27,0x80,0x5b,0xfc,0x95,0xb0,0xf0,0xea,0xca,0x0f,0x9a,0x6c,0xef,0x4c,0x7b,0x17,0xa1,0x34,0x9f,0x91,0x98,0xda,0x67,0xee,0x71,0xb2,0x36,0x00,0x00,
- 0x05,0x20,0x87,0x7a,0x6e,0x9b,0xd2,0xe7,0xce,0x8f,0xbc,0x54,0x73,0x28,0x6d,0xd6,0x22,0x1f,0xbf,0x54,0xa3,0xf4,0x96,0x8d,0x06,0x14,0x9f,0x83,0x74,0xd5,0x43,0xb5,0xcf,0x74,0x00,0x00,
- 0x05,0x20,0x87,0x97,0x99,0x13,0x34,0xe2,0x07,0x77,0x8e,0xd1,0x77,0x2f,0xe9,0x56,0xd9,0xfa,0x7c,0x7f,0x1a,0x4e,0xf1,0x1a,0x81,0x8a,0xf5,0xfa,0x4e,0x2d,0x18,0x24,0x7d,0x33,0x00,0x00,
- 0x05,0x20,0x87,0x9d,0xb2,0x41,0xb8,0x37,0x39,0x4c,0xa7,0x30,0x25,0x07,0x20,0x35,0x46,0x1b,0xa9,0x85,0xc8,0xea,0x38,0xce,0xbf,0x87,0x81,0x85,0xd4,0x16,0x0d,0xac,0xe2,0x01,0x00,0x00,
- 0x05,0x20,0x87,0xfc,0x6e,0x2d,0x4e,0x90,0x75,0x2b,0x91,0xa7,0xe7,0xc9,0x49,0xc0,0xd6,0xb6,0x53,0x87,0x9f,0xba,0x8a,0x22,0x2f,0x6f,0xb6,0x55,0x9b,0x79,0x11,0x31,0xc8,0xc6,0x00,0x00,
- 0x05,0x20,0x87,0xdb,0x31,0xdb,0x1e,0xbd,0x09,0x8a,0x98,0xe1,0x48,0x18,0x58,0x9f,0xda,0x04,0x27,0x4a,0x6d,0x0a,0xb1,0xbd,0xad,0x11,0x9c,0xe3,0xc1,0xb1,0x65,0xcc,0x88,0xd3,0x00,0x00,
- 0x05,0x20,0x80,0x3f,0xf5,0xe7,0xe3,0x5f,0xb9,0x0b,0x4d,0x3c,0x2d,0xee,0xbc,0xf9,0xd3,0x55,0x2b,0x5e,0x68,0x62,0x41,0x8c,0xd6,0x5f,0xda,0x23,0x83,0x2d,0x5e,0x08,0xdd,0x57,0x00,0x00,
- 0x05,0x20,0x80,0x21,0x5b,0xb3,0x15,0x86,0x99,0xcb,0x39,0x81,0x64,0xc1,0x9d,0xba,0x91,0xdc,0x18,0xff,0x90,0x93,0xdc,0x16,0x4e,0x95,0x6d,0x8c,0xb6,0x0e,0xd8,0xc5,0x3d,0xc2,0x00,0x00,
- 0x05,0x20,0x80,0x2c,0x41,0xf5,0xd4,0xed,0x43,0xcd,0x50,0xc8,0xe6,0x8c,0xeb,0xc7,0x52,0xf0,0xa1,0x97,0xe0,0xfb,0x97,0x41,0x35,0x1e,0xa5,0xae,0x0f,0x81,0x78,0x0d,0xbe,0x00,0x00,0x00,
- 0x05,0x20,0x80,0xc6,0x6f,0xb3,0x18,0x5a,0x1a,0xde,0x4e,0xde,0x50,0xd2,0xc6,0x3f,0xc5,0x96,0x09,0x35,0x3a,0x4d,0x88,0x5f,0xa3,0x49,0x37,0xff,0xe6,0xc5,0x43,0x10,0xaf,0xa8,0x00,0x00,
- 0x05,0x20,0x81,0x17,0x20,0x48,0x84,0xab,0x59,0x9d,0x51,0xaf,0x75,0x4f,0xc6,0x85,0xe9,0x7c,0x8e,0x93,0x73,0xa8,0xa0,0xd0,0x02,0xf7,0x21,0x69,0x88,0x05,0xda,0xd4,0xb9,0x34,0x00,0x00,
- 0x05,0x20,0x81,0x43,0x43,0x1c,0xb1,0xe9,0xce,0x67,0x39,0x80,0x96,0x2a,0x8b,0x2b,0x79,0x43,0x75,0xca,0x12,0x2f,0x5f,0xa9,0x1c,0xf6,0x4c,0xcd,0xc5,0xa1,0xa2,0xbd,0x45,0xee,0x00,0x00,
- 0x05,0x20,0x81,0x57,0xb4,0x73,0xa8,0x79,0xa8,0x67,0x7e,0x84,0x95,0xb1,0xbc,0x35,0xa1,0x01,0x27,0xff,0xdc,0x16,0x43,0xd7,0x56,0x33,0x6a,0x7f,0x0a,0x9f,0xea,0x15,0xc8,0xbc,0x00,0x00,
- 0x05,0x20,0x81,0xe8,0xae,0xe6,0x1d,0xaf,0xcf,0xd7,0xfd,0xde,0xd1,0xa5,0x73,0x4e,0x10,0x77,0xea,0x0e,0x23,0xff,0x77,0x6a,0x44,0x7a,0xd3,0x9d,0xe0,0x23,0x02,0xdc,0xf9,0xfe,0x00,0x00,
- 0x05,0x20,0x82,0x2b,0x48,0x2a,0x31,0xdb,0xeb,0xb8,0xd1,0x7c,0xb1,0xaf,0xc7,0x73,0x2e,0x6f,0x6c,0x43,0x20,0x73,0xe8,0x29,0x85,0xd7,0x61,0x39,0x02,0x5a,0x27,0xce,0x80,0x29,0x00,0x00,
- 0x05,0x20,0x82,0x46,0x59,0x84,0xe2,0x01,0x8e,0x39,0x2f,0x37,0x4c,0x2f,0xb6,0xb0,0x8c,0xe6,0x7a,0xfe,0xa6,0x7f,0x27,0xdd,0x4e,0x84,0x79,0xea,0xd6,0xd8,0x2e,0xf2,0x39,0x3a,0x00,0x00,
- 0x05,0x20,0x82,0xb6,0x88,0x6e,0xd1,0xf1,0x19,0x39,0x8d,0x0b,0xa8,0xe0,0x1a,0xfa,0xad,0x82,0x64,0x7a,0x67,0x3e,0x66,0x17,0x6c,0x15,0xdb,0xcf,0xaa,0xf4,0xe2,0xd5,0x69,0x44,0x00,0x00,
- 0x05,0x20,0x82,0x9c,0x7c,0xba,0xe8,0x31,0x0b,0xcd,0xc5,0xdf,0x61,0x74,0x11,0xff,0xc4,0xc3,0x49,0x4a,0x27,0x55,0x2e,0x22,0x46,0x50,0xb5,0xa1,0x65,0x25,0x48,0x35,0x4e,0xd3,0x00,0x00,
- 0x05,0x20,0x82,0xa5,0x33,0xa3,0x30,0x99,0x46,0x94,0xdc,0x51,0x01,0xe1,0x75,0x2f,0x61,0x25,0x7f,0xd5,0x6b,0x81,0x58,0x0d,0x15,0x3a,0x59,0xb9,0x1b,0xce,0xe4,0x8b,0x42,0x5e,0x00,0x00,
- 0x05,0x20,0x82,0xce,0xa5,0xd7,0x70,0xdc,0x63,0x2c,0x86,0x2a,0xbd,0xbf,0xde,0xad,0xe3,0x0d,0x23,0x7b,0x09,0x3d,0x1a,0xaf,0x64,0x08,0x12,0xe7,0x8a,0xbc,0xcd,0x6a,0x18,0x92,0x00,0x00,
- 0x05,0x20,0x83,0x26,0x6e,0xd1,0x59,0xb9,0x19,0x25,0x4e,0x57,0xb6,0x83,0x1b,0x31,0xc7,0x21,0xf0,0x43,0xd9,0x6b,0x22,0xb1,0xb5,0x53,0x24,0x86,0x71,0xc5,0x90,0x62,0x75,0x36,0x00,0x00,
- 0x05,0x20,0x83,0x46,0x68,0x1d,0x3b,0x13,0xc3,0x78,0xaa,0x74,0xf4,0x7f,0x89,0x01,0xce,0x10,0xa1,0x9a,0xc8,0x8b,0xab,0x75,0x37,0x9e,0x9b,0x7a,0xef,0xac,0xf5,0xd4,0x70,0x8d,0x00,0x00,
- 0x05,0x20,0x83,0x60,0xe4,0xae,0x67,0xc3,0x3f,0x9e,0x1a,0xc8,0xc8,0x82,0xb3,0xbc,0x7a,0x99,0xf1,0xfa,0xf0,0x1e,0x41,0x58,0x4e,0xfc,0x39,0xc2,0xf6,0xdb,0xe5,0x49,0xf2,0x04,0x00,0x00,
- 0x05,0x20,0x83,0xa3,0x91,0xa4,0x44,0x96,0x4b,0xcd,0xe9,0xc1,0xb8,0x3f,0xb9,0xb6,0xc7,0x80,0x7e,0xb9,0xde,0x37,0x59,0x54,0xa8,0x32,0xda,0x2a,0xd8,0x54,0x9d,0xd8,0xae,0xfc,0x00,0x00,
- 0x05,0x20,0x83,0xfa,0xf7,0x99,0xd9,0xc8,0x55,0x44,0x34,0xc6,0xd6,0xb2,0x60,0x30,0xbc,0x76,0x5e,0x4d,0x37,0xa7,0x4a,0xe9,0xc4,0x6b,0xb1,0xf3,0xd3,0x0b,0x69,0xa6,0x89,0xdd,0x00,0x00,
- 0x05,0x20,0x83,0xc6,0x30,0x55,0xa5,0x5c,0x7b,0x31,0xb0,0x98,0x79,0x29,0xd5,0xc5,0x29,0xb4,0x8d,0x31,0x9f,0x3f,0x3d,0xba,0x46,0x5d,0x18,0x4a,0x84,0xff,0xb3,0xf7,0xc4,0x84,0x00,0x00,
- 0x05,0x20,0x83,0xdd,0xba,0x77,0xdd,0x8b,0x0c,0x44,0x3a,0x34,0x96,0x40,0x30,0x8b,0x95,0x63,0xcc,0x9c,0x38,0xff,0x83,0xa3,0x5e,0x2f,0x04,0x2a,0xfe,0x62,0x12,0xd8,0xc6,0x7e,0x00,0x00,
- 0x05,0x20,0x84,0x10,0x05,0x5b,0x5c,0x70,0x4b,0x6c,0xef,0xfd,0x31,0x43,0xe6,0x53,0x20,0xcf,0xe7,0x1f,0x01,0xa8,0xdb,0x87,0xe5,0x91,0xce,0xbf,0xd3,0x6c,0xc5,0x19,0xc5,0xd5,0x00,0x00,
- 0x05,0x20,0x84,0x19,0x7a,0xd1,0x36,0x47,0x15,0x33,0x27,0x42,0xa4,0x19,0x6e,0x29,0x14,0x4a,0x8b,0xfa,0x2a,0x2a,0x71,0x3b,0x1c,0x63,0x81,0x48,0x7f,0x3c,0x2c,0x8f,0x5c,0x92,0x00,0x00,
- 0x05,0x20,0x84,0x5f,0x9f,0x7e,0x22,0xb4,0x42,0xf1,0x38,0x4a,0x40,0xfa,0xc5,0xeb,0x83,0x98,0xce,0x73,0x91,0x53,0xc6,0xee,0x3f,0x78,0x8a,0x56,0x01,0x37,0x95,0x23,0xd5,0x94,0x00,0x00,
- 0x05,0x20,0x85,0x32,0xa8,0x9b,0x21,0xeb,0xd8,0xde,0x73,0xdd,0xf7,0x3e,0xa2,0x75,0x72,0x28,0x64,0x48,0x35,0xd1,0x8f,0x96,0x9a,0x96,0x57,0x10,0x0c,0x9f,0xc7,0x2b,0xf9,0xc5,0x00,0x00,
- 0x05,0x20,0x85,0x7a,0x4e,0x25,0x62,0x63,0x14,0x35,0xb0,0xfd,0x93,0xd5,0x5a,0xea,0xc6,0x4e,0xf9,0xba,0xb3,0x98,0x74,0xf1,0xa3,0xb8,0xb4,0xca,0x38,0xb7,0x45,0xad,0xd9,0xf3,0x00,0x00,
- 0x05,0x20,0x85,0x8f,0x55,0xbe,0x27,0x56,0xdb,0x39,0x5a,0x3d,0xbb,0x66,0xd1,0x68,0xe7,0x33,0x2a,0x3d,0x84,0x26,0xc9,0x94,0x17,0x30,0x28,0x40,0x4f,0x19,0x27,0xea,0xf1,0xb1,0x00,0x00,
- 0x05,0x20,0x86,0x14,0x0a,0xbd,0x21,0x20,0xa5,0x20,0x3c,0x9f,0xfb,0x23,0x74,0xde,0xd7,0x11,0x25,0xa3,0x05,0x23,0xf1,0xb2,0x4b,0x0f,0xd9,0xc4,0xb7,0xaa,0x1d,0x8d,0x6d,0xb6,0x00,0x00,
- 0x05,0x20,0x86,0x21,0x66,0xf6,0xf2,0xd7,0x0f,0xee,0xc5,0x63,0x8a,0xc9,0xd6,0x4b,0x00,0x8b,0x20,0xe2,0xed,0x61,0xde,0xe9,0x9f,0xca,0x93,0x05,0x2c,0x33,0x76,0x08,0xa1,0xdd,0x00,0x00,
- 0x05,0x20,0x8e,0x9f,0xd5,0x42,0x3f,0xba,0x5d,0xc6,0x8b,0x3f,0x5f,0x88,0xa1,0xdf,0x46,0x27,0xa5,0x4d,0x27,0x5a,0x4e,0xa6,0x39,0x3a,0xf4,0xe2,0x6d,0xba,0x7b,0xf9,0xfb,0xdc,0x00,0x00,
- 0x05,0x20,0x8f,0x28,0xa1,0xa7,0xe2,0xd2,0xbb,0xdf,0xab,0xf0,0x1f,0xa4,0x80,0x50,0xe7,0x85,0x05,0x23,0xdb,0x1a,0x8c,0x54,0xcf,0x7a,0x76,0xce,0x0f,0xc4,0xa2,0x82,0x43,0x01,0x00,0x00,
- 0x05,0x20,0x8f,0x47,0xd4,0x9a,0x42,0xac,0xbc,0x8b,0xf6,0xbe,0xe7,0x9c,0x7b,0x03,0xdc,0xad,0x27,0x4f,0xd1,0x85,0x22,0x9b,0x11,0x68,0xf1,0x26,0x46,0x99,0xae,0x3c,0x5b,0x3c,0x00,0x00,
- 0x05,0x20,0x8f,0x87,0xc6,0x38,0x11,0x7e,0xb5,0x66,0xb6,0x4d,0x64,0xaf,0x09,0xee,0x5b,0xd1,0xb3,0x89,0x08,0x02,0x10,0x04,0xa1,0x03,0x35,0x43,0x22,0x47,0xfe,0x40,0xd7,0x98,0x00,0x00,
- 0x05,0x20,0x8f,0x8e,0x3d,0xa9,0xb0,0x46,0x9f,0xe5,0x02,0xdf,0x3e,0x03,0x11,0x17,0x50,0xea,0xc4,0x08,0xd1,0x62,0x16,0x65,0xb9,0x18,0x54,0xcf,0x30,0x2d,0x48,0x09,0xd9,0xb0,0x00,0x00,
- 0x05,0x20,0x8f,0xc3,0x43,0x7a,0xc1,0x39,0x2b,0x08,0x2c,0x20,0xab,0xa8,0x9d,0x98,0xcf,0x07,0xc9,0xdf,0xc8,0x23,0xdb,0x91,0x55,0x66,0x04,0xc0,0x0d,0x19,0xde,0x47,0x62,0x5e,0x00,0x00,
- 0x05,0x20,0x88,0x3f,0x99,0xc3,0xee,0x87,0xd2,0x27,0x65,0xf4,0x47,0xc5,0xcc,0xd7,0xfe,0x31,0xff,0x14,0xd8,0xf0,0xe9,0x54,0xfb,0xbf,0xe3,0xad,0xbf,0x14,0x4d,0x02,0x57,0xbd,0x00,0x00,
- 0x05,0x20,0x88,0x7f,0x3c,0x24,0x7e,0x32,0x3e,0x4a,0xb2,0x7d,0x66,0x6b,0x30,0xba,0x20,0x64,0x10,0xfe,0x6e,0x47,0xfe,0xb2,0x9b,0xb6,0xc7,0x4f,0x55,0xfd,0x64,0xa8,0xd9,0xbc,0x00,0x00,
- 0x05,0x20,0x88,0x7f,0x7d,0x79,0x6c,0x23,0xca,0x11,0x0f,0xf6,0x9d,0xe9,0xcd,0x3c,0xbc,0x98,0xee,0x12,0x75,0xfd,0xcc,0x8b,0xb1,0x5a,0x94,0x50,0xf8,0x59,0x73,0x27,0xbc,0xc2,0x00,0x00,
- 0x05,0x20,0x88,0xf4,0x2b,0x6d,0x14,0x55,0x26,0x7d,0x2e,0xc4,0xe7,0x21,0xf2,0xa1,0xe0,0xb4,0x5a,0x4d,0x21,0xde,0xc6,0xcb,0x8c,0x57,0xb7,0x25,0xbd,0x51,0xec,0xee,0x96,0xa0,0x00,0x00,
- 0x05,0x20,0x89,0x0a,0xee,0x57,0xfa,0xfa,0x58,0x52,0xfb,0x0b,0x8b,0xc2,0xaa,0x8f,0xa4,0x62,0xcb,0x1d,0x1c,0x0c,0x01,0x0f,0xfc,0x9d,0xde,0x75,0x40,0xbe,0x8d,0x8d,0xb2,0xe6,0x00,0x00,
- 0x05,0x20,0x89,0x0b,0x19,0xe0,0x61,0x1c,0x97,0x91,0x18,0x52,0x63,0x1e,0x7d,0xf3,0x7d,0x82,0x0d,0x80,0x24,0xfc,0x86,0x9b,0x55,0xff,0xbe,0x2f,0x70,0xe4,0xba,0x8b,0x6f,0x31,0x00,0x00,
- 0x05,0x20,0x89,0x4d,0x24,0x9f,0x15,0x80,0x68,0xd2,0x17,0xa1,0xec,0x74,0x46,0x26,0x8e,0xbd,0xf4,0x8f,0xc4,0x52,0x5f,0xcc,0x09,0x9f,0x1a,0x6f,0x0d,0x64,0xe3,0x00,0x9f,0x83,0x00,0x00,
- 0x05,0x20,0x89,0xbd,0xff,0xd5,0xe5,0xce,0x0f,0x21,0x2b,0x39,0x15,0x5d,0x8a,0xc0,0x61,0xb4,0xc6,0xa8,0x20,0xdf,0x5d,0xeb,0xca,0x35,0x97,0x16,0x7d,0xba,0xce,0x3e,0x99,0xb2,0x00,0x00,
- 0x05,0x20,0x89,0x83,0x0d,0xfa,0x58,0x48,0x06,0xcd,0x12,0xfa,0x31,0x66,0x2f,0x5f,0x33,0x45,0x44,0xa8,0xc3,0x22,0x4c,0xb2,0xb0,0x6d,0x20,0x15,0x8a,0xee,0x9e,0x14,0x9e,0x60,0x00,0x00,
- 0x05,0x20,0x8a,0x33,0x44,0x61,0xe9,0x29,0xe8,0xa9,0xec,0x30,0x69,0x26,0xf7,0xb8,0x14,0x75,0x68,0x08,0x43,0xa4,0xf2,0x72,0x61,0xfe,0x66,0xc6,0xb9,0x98,0xd8,0x1a,0xc0,0xef,0x00,0x00,
- 0x05,0x20,0x8a,0x8e,0x1d,0xf3,0xdb,0x0c,0xea,0x57,0x66,0xd3,0x06,0xfe,0x89,0xad,0x53,0xdf,0xd1,0x86,0x89,0xea,0xc8,0x15,0xab,0x9d,0xc4,0xe2,0x8d,0xf9,0xc0,0x05,0x84,0x50,0x00,0x00,
- 0x05,0x20,0x8a,0xf8,0x1d,0xc7,0xa7,0xed,0xdc,0x37,0x7d,0x48,0xb7,0x1b,0x85,0x0f,0x91,0x3b,0x85,0xc4,0xef,0xea,0xba,0x33,0x9c,0x07,0xd4,0x51,0x84,0xe6,0x60,0x5a,0x84,0x70,0x00,0x00,
- 0x05,0x20,0x8b,0x64,0x93,0x22,0x20,0x7f,0x56,0x53,0xdd,0xe1,0xd5,0xc5,0x9a,0x02,0xc6,0x76,0x66,0x1e,0x3e,0x66,0x1d,0xa7,0xd8,0x88,0x3a,0x0e,0x7f,0xaa,0x9e,0x60,0x46,0x93,0x00,0x00,
- 0x05,0x20,0x8c,0x59,0xa7,0x91,0x92,0xe6,0xba,0x1a,0x1d,0xcd,0x7c,0xdf,0xf5,0x86,0x61,0x7c,0x59,0x6b,0x24,0xe1,0x2c,0xc9,0x8e,0x51,0x35,0x56,0xba,0xd1,0x2e,0xff,0x89,0x23,0x00,0x00,
- 0x05,0x20,0x8d,0x53,0x9b,0x81,0x5b,0x4d,0x6d,0x69,0xa3,0xea,0x59,0x43,0xee,0x5a,0x32,0x62,0xca,0x29,0x78,0x44,0x44,0x0f,0x90,0x85,0x89,0xc3,0x5c,0xa6,0xf6,0x79,0xd9,0x0d,0x00,0x00,
- 0x05,0x20,0x8d,0x8c,0x5d,0x59,0x3a,0xbf,0xbd,0x79,0xb5,0x37,0xd8,0xcc,0x6b,0x9d,0x54,0xc7,0x8d,0x54,0x1e,0xb4,0x8f,0x35,0x30,0xa9,0xc4,0x4f,0x82,0x3f,0xa2,0x8a,0x74,0x11,0x00,0x00,
- 0x05,0x20,0x8d,0xc1,0x31,0x70,0x3f,0x70,0x4c,0xe9,0x57,0x2d,0x7c,0x22,0xcc,0x45,0x7e,0x9e,0x35,0x84,0x5c,0xe8,0xfc,0x5e,0x13,0xf3,0xb2,0x73,0xe1,0x6c,0x99,0x78,0x43,0x0c,0x00,0x00,
- 0x05,0x20,0x8e,0x36,0x8a,0x00,0x01,0x2f,0x48,0xaf,0xed,0xd3,0x2d,0x44,0x7b,0x46,0x11,0xc1,0x33,0xb6,0xc8,0xd0,0xef,0xc2,0xf6,0x65,0x58,0xcd,0x19,0x03,0x94,0x27,0x34,0xc1,0x00,0x00,
- 0x05,0x20,0x8e,0x1f,0x2c,0x41,0xc3,0xd6,0x21,0xbc,0x80,0xc2,0xad,0x45,0xaf,0x73,0x75,0xc0,0xe7,0x5e,0x65,0x9a,0x25,0xbb,0x1d,0xdb,0xaa,0x4e,0x71,0x0d,0x49,0xb5,0xcd,0x74,0x00,0x00,
- 0x05,0x20,0x96,0xfa,0x75,0xb5,0x94,0x62,0x8c,0x39,0x55,0x3a,0x31,0x1e,0xdb,0x45,0xdc,0xb3,0xb4,0x7f,0xce,0x5f,0x18,0xd2,0x73,0xa0,0xf0,0x31,0xb1,0x66,0xfe,0x02,0xc3,0x34,0x00,0x00,
- 0x05,0x20,0x96,0xe2,0x12,0x75,0xbf,0x5e,0x31,0xe9,0x30,0x91,0x7a,0x8d,0x1e,0x20,0x53,0xc8,0x6a,0xa1,0x22,0x9f,0x35,0xf0,0x9f,0x66,0x16,0xdd,0xf1,0x6f,0x6a,0x2c,0x45,0x4e,0x00,0x00,
- 0x05,0x20,0x97,0x37,0x6e,0x4e,0x4c,0xcb,0x06,0x3a,0xd3,0x42,0xbd,0x0c,0x7d,0x2e,0xfc,0x77,0x59,0x47,0xee,0x2a,0xaa,0x4e,0xce,0x77,0xb4,0xd4,0x20,0xf3,0x70,0x30,0x59,0xf1,0x00,0x00,
- 0x05,0x20,0x97,0x20,0xb5,0xe3,0x88,0xb6,0x49,0x52,0x25,0x5c,0x25,0xfb,0x92,0xc0,0xe1,0xe4,0xfd,0xef,0x3b,0xfb,0x65,0x46,0xcc,0x70,0xcf,0xa7,0x3f,0x37,0x87,0xff,0xeb,0x52,0x00,0x00,
- 0x05,0x20,0x97,0x57,0x2e,0x6a,0xb9,0x28,0x21,0x93,0x45,0x31,0xf0,0xaa,0x65,0x30,0xc8,0x29,0x11,0xa8,0xce,0xa9,0xfd,0x32,0x05,0xa5,0x4f,0x93,0x27,0xed,0x26,0xd3,0x65,0x6f,0x00,0x00,
- 0x05,0x20,0x97,0xa8,0xc2,0xe6,0xc4,0xd7,0xef,0xf0,0x67,0x58,0x4c,0x8d,0x02,0xcd,0x39,0x05,0x9c,0x9e,0xae,0x22,0x89,0xae,0xb1,0xa8,0xb6,0x2c,0x35,0x0b,0x38,0x2c,0x5e,0x98,0x00,0x00,
- 0x05,0x20,0x97,0xab,0x21,0x87,0x1a,0x5a,0x00,0x03,0xb7,0x45,0x3f,0xe1,0x58,0x90,0xf0,0x2d,0x25,0xf3,0x03,0x3b,0x7e,0xe9,0xb8,0xbd,0x33,0x2a,0x4e,0xce,0x00,0xf5,0xcf,0x3d,0x00,0x00,
- 0x05,0x20,0x90,0x36,0xad,0x5d,0x0f,0x0d,0x2c,0xcf,0x68,0x21,0xeb,0x74,0xcb,0x02,0x18,0xc2,0x45,0x5b,0xe4,0x3d,0xda,0x99,0x94,0x35,0xce,0x49,0x9a,0x97,0xb6,0x14,0x8e,0x49,0x00,0x00,
- 0x05,0x20,0x90,0x06,0xd5,0xe4,0xd4,0x00,0x38,0xaf,0x2a,0xaf,0x42,0xb1,0xaf,0xa3,0x2f,0xdf,0x89,0x1d,0xa3,0xa7,0xff,0x17,0xce,0xe9,0xee,0xa8,0x5a,0x04,0xc2,0x8b,0x5b,0xc4,0x00,0x00,
- 0x05,0x20,0x90,0x13,0xda,0x08,0xe9,0xf8,0xf2,0xcb,0xa6,0xbb,0x50,0xf2,0x05,0x9a,0x61,0x86,0x6d,0xeb,0x53,0x96,0xcd,0xee,0x34,0x38,0x22,0xd6,0xd9,0xce,0xe8,0x87,0x56,0xf3,0x00,0x00,
- 0x05,0x20,0x90,0x40,0xb7,0xe8,0x6e,0xbe,0x08,0x39,0xc7,0xba,0x52,0x7b,0xfa,0x83,0x51,0x60,0x51,0xd6,0xbe,0x4f,0xaf,0x07,0x15,0x72,0xb7,0x6d,0x12,0x03,0x7f,0x46,0x9b,0xd1,0x00,0x00,
- 0x05,0x20,0x90,0xee,0x5c,0x84,0xd6,0xbb,0xcb,0xe3,0x85,0x0a,0xfa,0xb8,0x18,0x33,0xdb,0xb3,0x39,0x75,0x8f,0xf0,0x33,0xb6,0x74,0xac,0xea,0x6b,0x48,0x7c,0xdf,0x18,0x25,0x3a,0x00,0x00,
- 0x05,0x20,0x91,0xfa,0x7b,0x5b,0x9a,0xad,0x97,0x25,0xf7,0xe2,0x1c,0x5c,0xf0,0x12,0x0c,0x65,0x9d,0x94,0x35,0xb1,0xd4,0xcd,0xeb,0x43,0x8f,0x89,0xbb,0x68,0xaa,0x92,0xad,0xd2,0x00,0x00,
- 0x05,0x20,0x91,0xde,0x3d,0x89,0x05,0x12,0x5c,0x40,0xdb,0xcf,0x92,0x93,0xc7,0x95,0x91,0x67,0xd7,0x62,0x0a,0x38,0x32,0x5a,0x92,0x77,0xa7,0x23,0xa2,0x79,0x5d,0x9a,0x5b,0x63,0x00,0x00,
- 0x05,0x20,0x92,0x3b,0x7d,0x95,0xcd,0xd9,0x2d,0xee,0x70,0xb1,0x42,0x06,0x2e,0xbb,0x72,0xc4,0x4b,0xda,0xf9,0x4a,0xe3,0xef,0x74,0xd4,0xe8,0x09,0x2b,0xb7,0x0e,0xea,0xfb,0x71,0x00,0x00,
- 0x05,0x20,0x92,0x14,0xa6,0x46,0xf5,0xf5,0x81,0x3d,0x7b,0xb1,0x78,0x31,0xa9,0xab,0xe9,0xc5,0xb1,0x55,0xe5,0x44,0x53,0xdc,0xb6,0x5b,0x0f,0xd1,0x17,0xd3,0x7d,0x08,0x3c,0xab,0x00,0x00,
- 0x05,0x20,0x92,0x5f,0x0c,0x17,0x71,0x87,0xdc,0x91,0x01,0x6b,0x1a,0xf0,0x1a,0xe3,0x07,0xea,0xe0,0x88,0x75,0x3b,0x00,0xc9,0xdb,0x7a,0x77,0x26,0xf9,0xfd,0xe0,0x27,0x56,0xe4,0x00,0x00,
- 0x05,0x20,0x92,0xbe,0x04,0x55,0x44,0x1f,0x7d,0xb3,0x78,0xda,0x8a,0x35,0x20,0x18,0xcd,0x47,0xd3,0x0c,0xdd,0x94,0x15,0x20,0x0f,0x5d,0x54,0x18,0x8c,0x9a,0xbc,0x29,0x96,0x06,0x00,0x00,
- 0x05,0x20,0x92,0xc2,0x19,0x22,0x1a,0x7b,0x1d,0x48,0x1e,0x7b,0x3e,0x5a,0x02,0xb5,0xd6,0x87,0xe5,0x7c,0xad,0x03,0x65,0x8c,0x72,0x88,0xff,0x42,0x21,0xee,0x47,0x23,0x3d,0xa2,0x00,0x00,
- 0x05,0x20,0x92,0xc9,0xb1,0x04,0x23,0x73,0x3d,0x15,0x34,0x5b,0x1c,0x61,0x30,0x58,0x53,0x7e,0x3d,0xbe,0xa0,0x40,0xe8,0xfa,0x62,0x45,0x29,0x18,0x0e,0x5c,0x31,0x4e,0x57,0x18,0x00,0x00,
- 0x05,0x20,0x92,0xda,0xca,0x4c,0x9d,0x77,0x8f,0xad,0xac,0x68,0x66,0xf9,0x68,0xbb,0x99,0x3f,0x20,0x0d,0x3c,0x47,0x6c,0x94,0xc1,0xbc,0x8a,0xd3,0x72,0x2f,0xd3,0xae,0xcf,0xd3,0x00,0x00,
- 0x05,0x20,0x93,0x4a,0x86,0xc8,0x2b,0x3f,0x13,0xcb,0x4a,0xba,0x6f,0x54,0xc5,0x16,0xe1,0xac,0x32,0x22,0x23,0x51,0xc1,0x71,0x4e,0x1c,0x90,0xc7,0xa9,0xfd,0xb1,0xd2,0x23,0xfd,0x00,0x00,
- 0x05,0x20,0x93,0x65,0x6d,0x92,0xc5,0xfd,0x93,0x3b,0x49,0xe8,0xa2,0x77,0xb3,0xee,0xb3,0xbb,0x70,0x15,0xae,0x91,0xc8,0xac,0xcf,0xd3,0xda,0x45,0x26,0x5e,0xbc,0xee,0x44,0xd5,0x00,0x00,
- 0x05,0x20,0x93,0x9c,0xef,0x81,0x2e,0xff,0x00,0x97,0x79,0x9a,0xc3,0x98,0x21,0x79,0x22,0x71,0x46,0x65,0x0d,0xd8,0x48,0x83,0x17,0xaf,0x6d,0xc5,0x6b,0x49,0x47,0xc5,0xb7,0xe6,0x00,0x00,
- 0x05,0x20,0x93,0xa2,0xe0,0xdb,0x5a,0x89,0x23,0x13,0xbe,0xfd,0x9f,0xbe,0x97,0x62,0x00,0x46,0xdd,0x4f,0x5e,0x55,0x85,0xc3,0xfb,0x0d,0xcc,0x9b,0x6c,0xd8,0x66,0x6c,0xe4,0x8c,0x00,0x00,
- 0x05,0x20,0x93,0xa6,0xfa,0x8a,0x10,0xce,0x59,0x3c,0x79,0x6b,0x43,0x2c,0xba,0xa9,0xb0,0x90,0xc5,0x87,0xb7,0x96,0x93,0x6c,0xaf,0x7f,0xea,0x23,0xf2,0xcc,0x7f,0xd6,0xd1,0xa0,0x00,0x00,
- 0x05,0x20,0x93,0xc2,0x1d,0xf1,0x72,0x5a,0xb5,0x35,0x8e,0xd9,0x8f,0x30,0x34,0x68,0x54,0x5a,0xbf,0x2b,0x99,0x7b,0x43,0x03,0xa3,0x1b,0xfc,0xf5,0xc3,0x78,0x40,0x49,0xfd,0x73,0x00,0x00,
- 0x05,0x20,0x93,0xe8,0x00,0x6b,0x1e,0x84,0x81,0x8b,0x61,0xea,0x5e,0x7e,0x89,0x88,0x3d,0x52,0xc9,0x27,0x18,0x85,0xd5,0xfd,0xe6,0x70,0xab,0xb4,0xb5,0x1e,0xff,0x90,0x48,0xba,0x00,0x00,
- 0x05,0x20,0x94,0x12,0x98,0x62,0x27,0x3f,0x3a,0x97,0x98,0xaf,0xf7,0x90,0x34,0x22,0x26,0x3f,0x44,0xaf,0x97,0x92,0xff,0x88,0x4d,0x2f,0xa1,0x5a,0x38,0xe0,0xc9,0xd3,0xa7,0xf3,0x00,0x00,
- 0x05,0x20,0x94,0x12,0xe8,0xca,0x00,0x60,0x70,0x82,0x36,0x8c,0x37,0x60,0xfb,0x6c,0xae,0x2c,0xd4,0xfe,0x72,0xaf,0x90,0xf8,0xbb,0x29,0x66,0x0a,0xf8,0xb0,0x1b,0x8c,0x67,0x8d,0x00,0x00,
- 0x05,0x20,0x94,0x23,0xef,0x14,0x87,0xd1,0xb6,0x5f,0x05,0x4d,0x9e,0xa6,0xd5,0xcd,0x8d,0x3c,0x06,0xac,0xba,0x1b,0x49,0xc6,0x00,0x4c,0xb4,0x94,0x8f,0x1a,0xfa,0xba,0xc9,0xd8,0x00,0x00,
- 0x05,0x20,0x94,0xd7,0x30,0x49,0x85,0xe0,0x7b,0xc9,0x46,0x29,0x0e,0xd8,0x5f,0x9d,0x33,0x4d,0x59,0x5a,0xb2,0x5a,0xf0,0x67,0x70,0x28,0x42,0x1c,0xd6,0xb3,0x45,0x9a,0x86,0x4d,0x00,0x00,
- 0x05,0x20,0x95,0x3e,0x3e,0x05,0x14,0x8a,0x0e,0xac,0x47,0x70,0x21,0x01,0xf6,0x01,0x4a,0xbe,0x50,0xab,0xc7,0xb9,0x47,0x32,0xda,0xc7,0x07,0xd8,0x52,0x49,0x3d,0xef,0x29,0xef,0x00,0x00,
- 0x05,0x20,0x95,0x99,0x30,0x3a,0x4f,0xa8,0x28,0xff,0xb0,0x9b,0x1d,0x72,0xbb,0x76,0xee,0x23,0x8e,0x74,0xf3,0x2d,0xec,0x3c,0x03,0x22,0xa8,0x2f,0xd5,0x79,0xc8,0x96,0x24,0x51,0x00,0x00,
- 0x05,0x20,0x96,0x0f,0x72,0x1e,0xab,0xf4,0x68,0x15,0xdb,0xca,0xee,0x24,0xcc,0x8a,0x50,0x8e,0x47,0x26,0x8f,0xe4,0x84,0x43,0x60,0x2c,0xaa,0xa9,0xcc,0x51,0x09,0xf4,0xd3,0xa5,0x00,0x00,
- 0x05,0x20,0x96,0x14,0x9b,0x6d,0x2d,0x0f,0xdb,0xe0,0xbb,0xbf,0xe5,0x9a,0xf4,0x02,0xe7,0x7e,0x9a,0xce,0x18,0x5e,0x38,0xb8,0x93,0xf2,0xbe,0x9c,0x64,0x17,0x85,0xd8,0x93,0x9c,0x00,0x00,
- 0x05,0x20,0x96,0x21,0x7c,0x2f,0xdf,0x0f,0x0e,0x37,0x76,0x9b,0x4c,0xd4,0xac,0xc8,0x01,0x10,0xab,0x34,0x80,0x91,0x7d,0x24,0x77,0x57,0xed,0x88,0xb4,0x5e,0x6a,0xfe,0xf9,0x52,0x00,0x00,
- 0x05,0x20,0x9e,0x89,0xce,0xa6,0x5c,0x1b,0x78,0x22,0xcb,0x18,0x25,0x59,0xaf,0x67,0xab,0x9d,0x59,0x4f,0x2c,0xb3,0xbe,0x50,0x94,0x70,0xac,0xdd,0x79,0x5d,0x4f,0x78,0x50,0x1c,0x00,0x00,
- 0x05,0x20,0x9e,0xf5,0x01,0x0b,0x53,0x0a,0x4d,0x0b,0xc7,0x03,0x8e,0xa7,0x73,0x33,0x80,0x39,0xce,0x02,0x6f,0x2a,0x53,0x92,0xc3,0x50,0x87,0xb7,0x4d,0x20,0xce,0x23,0xad,0xe4,0x00,0x00,
- 0x05,0x20,0x9f,0x37,0x08,0x66,0x97,0xfa,0x15,0xf5,0x29,0x1a,0x8d,0xe6,0x85,0xac,0x46,0x0d,0xe3,0x96,0xd0,0xe9,0x00,0xbf,0x69,0xc0,0xfd,0xd4,0xa0,0xea,0xab,0xa0,0xc6,0xef,0x00,0x00,
- 0x05,0x20,0x9f,0x1a,0xe9,0xad,0x03,0xe0,0x48,0x9b,0x67,0x53,0xcd,0x04,0xfa,0x90,0x6d,0x51,0x29,0x25,0x11,0xaf,0x6d,0x3b,0x28,0x08,0x23,0x39,0xf6,0xb8,0x3a,0x88,0x34,0x2e,0x00,0x00,
- 0x05,0x20,0x9f,0x44,0x3f,0xc3,0x7e,0x6b,0xbc,0x37,0x5c,0x74,0xa5,0x55,0xd7,0xc8,0x77,0xe7,0xf2,0xbf,0xba,0x92,0x68,0x94,0x93,0x5b,0xe2,0xf6,0x63,0xb7,0x6d,0x44,0xf9,0x4a,0x00,0x00,
- 0x05,0x20,0x9f,0xcc,0x16,0x10,0xb2,0x7b,0x70,0xd0,0x13,0x2c,0xad,0xf9,0xce,0x95,0x20,0x7b,0xf5,0xc7,0xa5,0x25,0xfd,0xaf,0xb2,0x55,0xf6,0x5b,0x1c,0xbc,0xe2,0x9b,0xb2,0x3b,0x00,0x00,
- 0x05,0x20,0x98,0x1a,0xc3,0xd5,0x4e,0xc0,0xf7,0xd5,0x17,0xc0,0xd3,0x4e,0x9e,0xc5,0x81,0xb3,0xe7,0xb9,0x1c,0x5e,0x99,0xf0,0xf9,0x2c,0x9c,0xeb,0x31,0xdf,0x76,0xce,0x62,0x70,0x00,0x00,
- 0x05,0x20,0x98,0x60,0x43,0xb1,0x9b,0x6d,0x28,0x5d,0x49,0xf6,0x92,0x5c,0x18,0x8b,0x87,0x37,0xa9,0x74,0xa3,0x8c,0x19,0x16,0x8a,0x9f,0x16,0xcf,0x03,0xf2,0xf5,0x75,0xf4,0x54,0x00,0x00,
- 0x05,0x20,0x98,0x62,0x91,0x66,0xcb,0xff,0xab,0xf7,0x07,0xc7,0x73,0x77,0xec,0xf8,0xbb,0xeb,0xa6,0xfa,0xf4,0xdc,0xf7,0xe1,0xbd,0xbc,0xd9,0xc6,0x00,0xa7,0xf7,0x5d,0xb5,0x8b,0x00,0x00,
- 0x05,0x20,0x98,0xaf,0xb2,0xce,0x43,0x5e,0xfd,0x45,0x62,0x54,0xa1,0x2d,0x81,0x81,0xe3,0xcd,0x29,0xc0,0x2c,0x96,0xc1,0xb5,0xa9,0x42,0x84,0x46,0xac,0x30,0x70,0x1f,0xe4,0xc2,0x00,0x00,
- 0x05,0x20,0x99,0x26,0xe8,0x24,0x06,0x91,0x7e,0x57,0x91,0x20,0x4a,0x2c,0xce,0x45,0xd2,0x84,0x85,0x8e,0x9e,0x90,0x0e,0x7a,0x71,0x40,0xc5,0xa1,0xc1,0xd9,0x8c,0xad,0x5c,0x5b,0x00,0x00,
- 0x05,0x20,0x99,0x79,0x37,0x64,0xfd,0xa3,0x64,0x6c,0x65,0xe3,0x93,0x22,0x31,0x3c,0x26,0x22,0xad,0xa0,0x1a,0x9f,0x9b,0xfa,0x9a,0xe0,0x4b,0xc8,0xa5,0xd5,0x26,0x83,0xb5,0x9e,0x00,0x00,
- 0x05,0x20,0x99,0x69,0x59,0xa3,0xf8,0x73,0x5b,0xd7,0xa5,0xf3,0xce,0x6a,0xf9,0x1c,0xfa,0xdd,0xf9,0x18,0x26,0xac,0xd5,0x24,0xe5,0xc4,0x2d,0x5d,0x39,0xa5,0x81,0x3c,0x61,0xf1,0x00,0x00,
- 0x05,0x20,0x99,0xbc,0x67,0x1f,0x65,0x5e,0x58,0x22,0x47,0xb5,0x71,0x67,0xa6,0x97,0x73,0xa0,0xd9,0xf4,0x2b,0x04,0xce,0xf7,0xcc,0xc7,0x1e,0xf5,0x61,0x76,0x0b,0x88,0x22,0x2e,0x00,0x00,
- 0x05,0x20,0x99,0xa7,0xf8,0x8c,0xf8,0xb4,0xd7,0x67,0x07,0x9f,0x2a,0xdf,0xe1,0x0a,0x1f,0x7c,0x62,0x13,0xf1,0x0f,0x6d,0x99,0xbb,0xcb,0x34,0xc2,0xa1,0xf0,0x93,0x4f,0x54,0xb1,0x00,0x00,
- 0x05,0x20,0x99,0xf6,0x34,0xf6,0x50,0xb7,0xfa,0xb3,0x03,0x73,0x69,0x4a,0x19,0x62,0xc0,0x4d,0xc0,0x5a,0xfc,0x55,0x58,0x7f,0x22,0x0f,0xd6,0xfc,0x37,0x6d,0xca,0xf4,0x83,0xbc,0x00,0x00,
- 0x05,0x20,0x9a,0x75,0x47,0xb0,0x4a,0xe7,0xd0,0xa9,0x94,0xfc,0xab,0x44,0xcc,0x01,0x2d,0x50,0x41,0x38,0x19,0x70,0xce,0x38,0x27,0x40,0x85,0xfd,0x90,0xe7,0x47,0x87,0x0c,0x93,0x00,0x00,
- 0x05,0x20,0x9a,0xbd,0xbb,0x87,0x34,0x37,0xc6,0x42,0xf8,0x92,0x45,0x5c,0x5b,0x43,0x47,0xd0,0xbb,0xb0,0x47,0x6e,0x9f,0xcf,0x22,0x64,0x70,0xd8,0x19,0x78,0x40,0x0e,0xc4,0x7a,0x00,0x00,
- 0x05,0x20,0x9a,0xb3,0x4c,0x48,0x1c,0x5a,0x80,0x3e,0xec,0x58,0xb0,0x67,0xe9,0x19,0xe2,0x68,0xeb,0x5a,0x8d,0x49,0x20,0x26,0xf5,0x5b,0x05,0xb1,0x1d,0x1b,0xfe,0x25,0x26,0xc2,0x00,0x00,
- 0x05,0x20,0x9a,0xf7,0x75,0x29,0xb4,0xa2,0xab,0x84,0x37,0x07,0xac,0xff,0x20,0x67,0x73,0xae,0x75,0xc7,0xcc,0xd8,0x84,0xf3,0x8d,0xa0,0xd8,0x36,0x0a,0x07,0x88,0xba,0x76,0xd7,0x00,0x00,
- 0x05,0x20,0x9a,0xfd,0xe0,0xa8,0xae,0x85,0x3c,0x40,0x30,0x80,0x84,0xd7,0x68,0xd4,0xb3,0x9e,0x05,0xeb,0xa7,0x72,0xef,0xf2,0x0d,0x9c,0x7f,0x73,0x1a,0x56,0xa4,0xdb,0x47,0x38,0x00,0x00,
- 0x05,0x20,0x9a,0xcb,0x39,0xa8,0x32,0x3c,0x44,0x8b,0xd3,0xc8,0xf4,0xb0,0xd9,0xaf,0xb7,0x4c,0x9c,0x7f,0x32,0x66,0x2b,0xd1,0x7e,0xf1,0x4d,0x01,0xf0,0x4a,0x1d,0x69,0xa7,0x0c,0x00,0x00,
- 0x05,0x20,0x9b,0x18,0x96,0x0a,0x36,0x21,0x92,0xa2,0x74,0xb9,0xae,0x8e,0x70,0x6a,0xca,0x44,0xbe,0xbf,0x5c,0x60,0x07,0xca,0xa8,0x6b,0x86,0x27,0x62,0x1a,0xc1,0xf6,0xbe,0x5e,0x00,0x00,
- 0x05,0x20,0x9b,0x82,0x32,0x5b,0xdd,0xef,0x05,0xff,0x24,0xf1,0xa2,0xc4,0x3d,0x4a,0x46,0xa9,0x0b,0xf1,0xc7,0x08,0x6a,0x35,0x74,0xdc,0x8c,0xd6,0x69,0x23,0x93,0x7f,0xc0,0xa8,0x00,0x00,
- 0x05,0x20,0x9c,0x68,0x2a,0xac,0x16,0x7d,0x0b,0x19,0x65,0x58,0xe6,0x72,0x73,0xde,0x63,0x1b,0x4e,0x87,0x71,0x8d,0x80,0x2d,0x91,0x73,0xed,0xfa,0x90,0xaf,0x23,0x9c,0xe3,0x35,0x00,0x00,
- 0x05,0x20,0x9c,0x8b,0x1f,0x66,0xa2,0x34,0x99,0x6d,0x11,0x40,0xbc,0x21,0x35,0x0e,0x2d,0x0a,0x03,0xda,0x21,0xdf,0x59,0x99,0x19,0xb2,0x42,0x8d,0x6c,0x4d,0x0f,0x9e,0x37,0xd3,0x00,0x00,
- 0x05,0x20,0x9c,0xa2,0xb0,0xdc,0x18,0x3a,0x0f,0x43,0x47,0xfa,0xde,0x7d,0x15,0x60,0x05,0x32,0xda,0x71,0x63,0x28,0xd6,0x4e,0xe4,0xe6,0x58,0x28,0xd3,0x28,0x29,0x43,0xee,0xc3,0x00,0x00,
- 0x05,0x20,0x9d,0x77,0x7e,0x28,0x63,0x0d,0x3f,0xdd,0xcd,0xab,0x31,0xcc,0x7d,0xce,0xee,0x33,0xf5,0xe9,0xaf,0x03,0x9f,0x3f,0x15,0xf6,0x42,0xbf,0xc8,0xeb,0x99,0xae,0x11,0x78,0x00,0x00,
- 0x05,0x20,0x9d,0x43,0x49,0xc6,0xbf,0xdd,0xcf,0x68,0x06,0x6e,0x93,0x02,0xfd,0x88,0x92,0x1e,0x05,0xd0,0x86,0x72,0x58,0x31,0xc3,0x26,0x45,0xfc,0x72,0x3b,0xf3,0x33,0x36,0x41,0x00,0x00,
- 0x05,0x20,0x9d,0x5d,0x3a,0xf5,0xfb,0x23,0x2f,0x76,0xcd,0x1a,0x0b,0x6b,0x41,0x04,0xb8,0xe4,0xdd,0xf3,0x5d,0xf3,0xb5,0x4f,0xc8,0x65,0xb4,0x3e,0x3d,0xa3,0x98,0xed,0x4d,0x38,0x00,0x00,
- 0x05,0x20,0x9d,0xdf,0x1e,0xf9,0x35,0x09,0x76,0xb6,0x40,0xc0,0x76,0x60,0x38,0x64,0xc2,0x51,0x5f,0x43,0x67,0x03,0xe0,0xac,0xf5,0xa9,0x2e,0x74,0xea,0x5d,0x9d,0x5c,0xd2,0x03,0x00,0x00,
- 0x05,0x20,0x9e,0x0a,0xa3,0xe7,0xc6,0x33,0xd1,0xa8,0xe1,0x44,0xce,0xeb,0xb4,0xf4,0xbb,0x25,0x5a,0x9b,0x95,0xc0,0xa7,0xea,0x4f,0xb3,0x47,0x20,0x28,0xa8,0x8a,0x08,0xa2,0x38,0x00,0x00,
- 0x05,0x20,0x9e,0x2b,0x2a,0x43,0x1b,0xf0,0xaf,0xac,0x54,0xbf,0x49,0xda,0xa1,0xf5,0xc9,0x17,0x74,0x6f,0x56,0xeb,0xd4,0x6d,0xd8,0x48,0xf0,0xb3,0xd5,0xed,0xbe,0x6e,0xa8,0xc6,0x00,0x00,
- 0x05,0x20,0x9e,0x7b,0x3b,0x8d,0x0f,0x55,0xc4,0xdc,0x0f,0x22,0x95,0x21,0x6e,0x7e,0x17,0x1d,0x5e,0xe0,0xfb,0x9c,0xa6,0xc5,0x39,0xac,0x31,0x09,0x4d,0xbc,0xbf,0xfd,0xaa,0xff,0x00,0x00,
- 0x05,0x20,0x9e,0x68,0x30,0x84,0x53,0xb1,0x03,0xf8,0xbd,0xa5,0xd5,0x65,0x6a,0x5b,0x5e,0x4f,0xb7,0x89,0x43,0x33,0x90,0x67,0xf5,0x95,0xe5,0x4f,0xae,0x0a,0x4e,0x84,0x42,0x97,0x00,0x00,
- 0x05,0x20,0xa6,0xa6,0xd8,0xe2,0x41,0x74,0x21,0x64,0xb7,0xfb,0x05,0x8d,0xc3,0x96,0xf3,0x2a,0x4c,0x18,0x00,0x3e,0xac,0x46,0x6c,0x53,0x9b,0x97,0xbf,0xa4,0x8c,0x40,0x69,0xc4,0x00,0x00,
- 0x05,0x20,0xa7,0x51,0x7b,0x88,0x7e,0x92,0xeb,0x9b,0xba,0x89,0xee,0xf4,0xd4,0xd2,0x57,0xf9,0x05,0xcb,0x11,0x91,0x2d,0x98,0x6f,0x1a,0xcb,0x9a,0xda,0xa8,0xd2,0x81,0x47,0xb7,0x00,0x00,
- 0x05,0x20,0xa7,0xb7,0xde,0x7f,0xf4,0xbc,0x25,0xfc,0xf2,0x95,0xb5,0xf5,0xae,0x53,0xce,0x4b,0x76,0x2d,0x92,0xc2,0x0f,0xbc,0x5d,0xa7,0xf0,0x58,0x73,0x0c,0x46,0x24,0xad,0xd2,0x00,0x00,
- 0x05,0x20,0xa7,0xad,0x1b,0x73,0xf8,0x2a,0x47,0x95,0x78,0x1f,0x68,0xbc,0x2f,0x48,0x55,0x2b,0x95,0x6a,0x41,0x95,0xa1,0xee,0x43,0xc2,0xb8,0x64,0x6b,0xf7,0x59,0x00,0x4d,0xd0,0x00,0x00,
- 0x05,0x20,0xa7,0xe8,0xa5,0xb6,0xd3,0x38,0x63,0x86,0xc7,0x79,0xd1,0x85,0xbc,0x5c,0xac,0x47,0x70,0xe2,0x32,0x54,0x32,0x42,0x1e,0x35,0x9c,0xe5,0xf5,0xe2,0xeb,0xb5,0xbb,0xfb,0x00,0x00,
- 0x05,0x20,0xa7,0xf0,0x66,0xec,0xe4,0x74,0xaf,0x4f,0x2f,0x43,0x41,0x37,0xcc,0x7e,0xd3,0x21,0x2e,0x57,0xf8,0xfa,0xb7,0x53,0xb6,0x9e,0x3c,0xd7,0x30,0xe0,0xaf,0x12,0x41,0xb1,0x00,0x00,
- 0x05,0x20,0xa0,0x0d,0x2f,0x1d,0x9e,0xe7,0x8b,0xa8,0x4b,0x10,0x29,0xf2,0x99,0xea,0xeb,0x6a,0x60,0x14,0x39,0xe8,0x70,0xcc,0x7c,0x59,0xd2,0x19,0xb3,0xf0,0xda,0x61,0x31,0xa6,0x00,0x00,
- 0x05,0x20,0xa0,0xbb,0xa8,0xe7,0x3c,0xbd,0x3a,0x85,0x5f,0xc7,0x5f,0xa3,0xe9,0x42,0xe5,0x62,0x31,0x8b,0xc8,0xa5,0x78,0xa9,0xd2,0xc6,0x33,0x23,0xc5,0x94,0x0e,0xc9,0xb5,0x0e,0x00,0x00,
- 0x05,0x20,0xa0,0xcb,0x73,0xea,0x3d,0xc1,0x69,0xdc,0xff,0x0d,0xc8,0x05,0x48,0xfd,0xfb,0x37,0xe8,0x6d,0xf5,0x45,0x06,0xf6,0x63,0x92,0x5a,0x08,0x32,0xf1,0xa2,0xb7,0x59,0xe5,0x00,0x00,
- 0x05,0x20,0xa0,0xd5,0x68,0x0d,0xdd,0x70,0xcd,0xd6,0xbd,0xbd,0xd4,0x68,0x44,0x3c,0xc7,0x6f,0x5c,0xc3,0xd5,0xc9,0x99,0xf2,0x36,0x54,0x55,0xa3,0x98,0x6c,0x99,0x74,0x67,0xca,0x00,0x00,
- 0x05,0x20,0xa0,0xf2,0x1b,0xf5,0x38,0xac,0x5f,0xc3,0x6d,0x14,0x4a,0xc4,0x0f,0xa5,0xab,0x00,0x00,0x0e,0xb3,0x64,0xe2,0x6b,0xc9,0x06,0x3f,0x9d,0x5f,0xe5,0x78,0x43,0x48,0xbb,0x00,0x00,
- 0x05,0x20,0xa1,0x4c,0xe0,0x03,0xc6,0xff,0x3d,0x9c,0xbd,0xe7,0xa5,0x6f,0x47,0x32,0x88,0xca,0xb0,0x57,0xe7,0x9d,0x11,0xe1,0x30,0x7e,0x4a,0x8e,0x2d,0x08,0x78,0x49,0x0c,0x1a,0x00,0x00,
- 0x05,0x20,0xa1,0x51,0x39,0xc5,0x71,0xe1,0x01,0x49,0xbc,0xf4,0x86,0x68,0xe9,0x8b,0xe1,0xdd,0xef,0xaf,0xb7,0x97,0x36,0x3a,0x02,0xb3,0x85,0x70,0xbc,0xd9,0x57,0xbe,0x87,0xd4,0x00,0x00,
- 0x05,0x20,0xa1,0xad,0xdc,0x84,0xf2,0xd3,0xeb,0x23,0x5d,0x04,0x52,0xd8,0x2f,0x67,0x99,0xf0,0xfa,0x2a,0xe2,0x97,0xe3,0xc5,0x37,0x97,0x54,0x19,0xd2,0x6b,0xd4,0x09,0x74,0xf4,0x00,0x00,
- 0x05,0x20,0xa2,0x4d,0xe0,0xf0,0x58,0xb9,0xd1,0xd7,0x97,0x8f,0xa5,0xab,0x6a,0x3e,0x91,0xda,0x06,0x36,0x6b,0x74,0x40,0x40,0xf4,0x19,0xf6,0x5f,0x03,0x29,0xd5,0x73,0xe0,0xaa,0x00,0x00,
- 0x05,0x20,0xa3,0x47,0x9a,0x16,0x49,0x20,0x79,0x05,0x97,0xf8,0xea,0xd6,0x7e,0xfa,0x69,0x47,0xb2,0xb3,0xce,0x47,0x5c,0xb0,0x79,0xf3,0x09,0x1c,0x81,0xa5,0x70,0x18,0xbf,0xeb,0x00,0x00,
- 0x05,0x20,0xa3,0x83,0x67,0x3c,0xed,0xcc,0x21,0xcc,0x1d,0xef,0xef,0x00,0x89,0x50,0x7d,0x72,0x4d,0x1b,0xc3,0xcf,0x04,0x99,0x0e,0x02,0x1e,0x85,0xbe,0x33,0x99,0x22,0x74,0x1e,0x00,0x00,
- 0x05,0x20,0xa3,0x87,0x81,0x24,0x72,0x13,0xe9,0x15,0x90,0xce,0xd3,0x63,0x2f,0xbe,0x6e,0xc9,0x35,0xe7,0xfb,0x5b,0xf4,0xf5,0x1d,0x4c,0x17,0xed,0x02,0x33,0x23,0xc3,0xa4,0x00,0x00,0x00,
- 0x05,0x20,0xa3,0x8f,0x4b,0xb5,0x23,0xd7,0xc4,0x59,0x82,0x21,0x2f,0x94,0x7e,0x0b,0x2c,0x74,0xed,0x59,0x4d,0xee,0x6e,0xa4,0x69,0x6a,0xaf,0x29,0x60,0xa3,0x30,0xdf,0x35,0x2e,0x00,0x00,
- 0x05,0x20,0xa3,0xf4,0xaa,0x0e,0xd0,0x73,0x21,0x1b,0x54,0xae,0x33,0x5a,0x7c,0xe9,0x89,0xb4,0x2a,0xa3,0x3d,0x4d,0x2e,0x24,0x27,0xf2,0x84,0xea,0x1c,0x4a,0xee,0x1c,0x48,0xfb,0x00,0x00,
- 0x05,0x20,0xa3,0xd8,0x4f,0x8b,0xdc,0x1d,0x92,0x60,0xcf,0xf6,0xfe,0xb0,0x5e,0xe0,0x6b,0xd8,0xf0,0xfd,0x74,0x73,0x23,0x62,0xa8,0x7b,0x3b,0x05,0xbc,0x70,0xa2,0x22,0x86,0x64,0x00,0x00,
- 0x05,0x20,0xa3,0xdf,0x77,0x0c,0xbe,0x0e,0x77,0x04,0x06,0xaf,0xce,0x6b,0x32,0x0d,0x7d,0x5a,0xb6,0x7f,0x96,0x4b,0x8d,0x98,0x41,0xe8,0x4c,0x85,0x46,0xf3,0x4e,0xb0,0x55,0x75,0x00,0x00,
- 0x05,0x20,0xa4,0x60,0xb8,0xec,0x44,0x47,0xde,0xfd,0x0a,0x34,0x30,0x39,0x3b,0xdd,0x8c,0xa9,0x17,0xb0,0x9f,0xed,0x90,0x61,0x98,0x65,0xe4,0xfb,0x99,0x56,0x05,0x9c,0xaf,0xfa,0x00,0x00,
- 0x05,0x20,0xa4,0x8d,0x04,0x26,0x36,0x3c,0xec,0x67,0x11,0x49,0x14,0x75,0xec,0x40,0x46,0x7b,0x45,0x67,0xc8,0x92,0x14,0x63,0xb2,0x11,0x5b,0xe9,0x37,0x13,0xaa,0x33,0x7c,0xdc,0x00,0x00,
- 0x05,0x20,0xa5,0x39,0xfa,0x5c,0x70,0x84,0xeb,0xa7,0xc1,0xd1,0x08,0x2e,0xd3,0x9c,0xac,0x14,0xae,0xc5,0x36,0xaf,0x89,0x00,0xc0,0xc2,0x0a,0x74,0xa3,0xce,0x87,0x9c,0x3f,0x50,0x00,0x00,
- 0x05,0x20,0xa5,0x79,0xc6,0x25,0xd0,0x8a,0x76,0xcd,0x9b,0x39,0xed,0xae,0xb6,0xcb,0x33,0xeb,0xea,0x65,0x6d,0x10,0x58,0xb6,0xf6,0x40,0xa4,0xf5,0x1b,0xe3,0x5c,0x18,0x96,0x85,0x00,0x00,
- 0x05,0x20,0xa6,0x24,0x76,0x79,0xae,0x50,0xd3,0x88,0x6d,0x7c,0xde,0xb5,0xc0,0x4f,0x51,0x41,0x9e,0x0e,0x65,0x88,0xc6,0x03,0x4a,0x17,0x10,0xd6,0xa7,0xc5,0xfb,0xa8,0x02,0xd9,0x00,0x00,
- 0x05,0x20,0xa6,0x25,0x51,0xc8,0xfa,0x0e,0x50,0x26,0x0e,0x10,0x1a,0xfe,0x4c,0xd0,0xb3,0xb8,0xb1,0x6c,0x81,0xee,0x38,0x72,0xbe,0x81,0xfd,0x3e,0x10,0x86,0xa9,0x1b,0xef,0x19,0x00,0x00,
- 0x05,0x20,0xa6,0x31,0xc1,0x84,0xb8,0xbe,0x91,0xab,0xec,0xce,0x70,0x45,0xea,0x5d,0x3c,0x68,0x7e,0xa9,0xe6,0x54,0xfe,0xb2,0xb5,0x4b,0x0f,0x49,0x51,0x23,0x28,0x1b,0xbb,0x66,0x00,0x00,
- 0x05,0x20,0xa6,0x4c,0x56,0x49,0x22,0x0a,0x6e,0x89,0xcf,0xc1,0x20,0xf6,0xfd,0x99,0xe3,0xcd,0x51,0x87,0x3f,0x51,0xce,0xc5,0x78,0x62,0x9e,0xe1,0x05,0xbc,0xea,0x3d,0x43,0x20,0x00,0x00,
- 0x05,0x20,0xa8,0x72,0xfe,0x49,0x2a,0x34,0x2d,0x86,0x37,0x59,0xe2,0x14,0x10,0x13,0xf1,0xae,0xc4,0xb0,0xbb,0xf5,0xaf,0x19,0x6a,0xf0,0xb3,0xfc,0xe9,0xfa,0x06,0x2c,0x09,0x0e,0x00,0x00,
- 0x05,0x20,0xa8,0x95,0x26,0xe2,0x98,0xb6,0xd1,0xe3,0x96,0xa8,0x70,0x7b,0x8c,0xbb,0x0d,0x87,0xdc,0xab,0xa3,0xdf,0xf8,0x6d,0xfd,0x6b,0x9a,0xfe,0xca,0x93,0xc9,0x5a,0x51,0xa2,0x00,0x00,
- 0x05,0x20,0xa8,0xde,0x57,0x00,0xf7,0x91,0x3e,0x24,0x89,0x16,0xea,0xfe,0x52,0x86,0xd9,0x17,0x89,0xcb,0x8d,0x65,0xed,0x17,0x58,0xab,0x7c,0x66,0x59,0xa3,0x63,0x8c,0x3a,0xed,0x00,0x00,
- 0x05,0x20,0xa8,0xeb,0xa0,0x22,0x66,0x82,0x04,0x0e,0x4c,0x10,0x13,0x12,0x4b,0xdb,0xb7,0x28,0x62,0x50,0x9e,0xa5,0xea,0xa9,0x7b,0x54,0xa9,0x2e,0xf0,0x85,0x23,0xa0,0xe8,0x93,0x00,0x00,
- 0x05,0x20,0xa9,0x27,0xe8,0x5a,0xc0,0xff,0x13,0x18,0x45,0x39,0x13,0x3f,0x85,0x95,0xf1,0xcd,0x9e,0xd9,0xec,0xeb,0xca,0x6a,0xa0,0xb4,0x0e,0x45,0x78,0xed,0x67,0x2a,0x8e,0xe5,0x00,0x00,
- 0x05,0x20,0xa9,0x28,0x24,0x1d,0x83,0xff,0x1a,0xda,0x31,0x14,0x6d,0x63,0x4c,0x26,0x5e,0x53,0xd3,0x2e,0xca,0x16,0xe8,0xdf,0x15,0x8d,0x79,0x11,0x7e,0x8d,0x9f,0x88,0x32,0x86,0x00,0x00,
- 0x05,0x20,0xa9,0x2c,0x38,0xa2,0x4c,0xcd,0x9a,0xbb,0xae,0xad,0x47,0xe4,0xb7,0xc3,0xfa,0xd5,0x97,0x62,0x81,0x88,0xd1,0x16,0x63,0xd0,0x6c,0xd3,0x8a,0x24,0x9d,0xe9,0x14,0xbc,0x00,0x00,
- 0x05,0x20,0xa9,0x76,0xbd,0x97,0xb4,0x6a,0xed,0x12,0xb2,0x3b,0x2a,0x1e,0x77,0xb9,0x86,0x92,0xee,0x66,0x79,0x9c,0x11,0xcd,0xfd,0x22,0x65,0xe7,0x70,0x5a,0x6c,0x31,0x66,0x35,0x00,0x00,
- 0x05,0x20,0xa9,0x5f,0x90,0x4a,0x32,0x8c,0x0f,0xb5,0xad,0x54,0x1b,0x01,0x2e,0x97,0x0c,0xb3,0x74,0xe3,0xca,0xd0,0x46,0xea,0x05,0x09,0x66,0x67,0x8a,0xde,0x34,0x3e,0x97,0x6f,0x00,0x00,
- 0x05,0x20,0xa9,0x94,0xea,0x73,0x12,0xa5,0xea,0x75,0xde,0x36,0x2f,0x5b,0xa4,0x1d,0xbc,0x29,0x71,0x5a,0x90,0x6b,0xa5,0x1b,0xcf,0xaf,0xc3,0x70,0x51,0xdc,0x0b,0x28,0xc6,0xdb,0x00,0x00,
- 0x05,0x20,0xa9,0xa9,0xe5,0xae,0x01,0xc2,0x5e,0x76,0x2f,0x5d,0xa3,0x07,0xdc,0xce,0xb8,0xbc,0x6f,0x47,0xaf,0x3a,0x37,0xf8,0x5c,0x86,0xff,0xe9,0xb6,0xa5,0x00,0x93,0x76,0x11,0x00,0x00,
- 0x05,0x20,0xaa,0x7b,0xc1,0xe9,0xea,0x19,0x21,0x51,0x51,0x3d,0xc2,0x88,0x63,0x47,0xc9,0x69,0xce,0xd6,0x43,0xb0,0xf4,0x09,0xf6,0xce,0x75,0x0f,0xb0,0x92,0x4e,0xc4,0x00,0xd8,0x00,0x00,
- 0x05,0x20,0xaa,0xec,0xea,0xa7,0xc5,0xbe,0x6b,0x39,0x61,0xed,0x64,0x96,0xe1,0x39,0xd3,0x63,0xce,0x4c,0xc7,0xb3,0xb8,0x1b,0x82,0xe7,0x46,0x49,0xdb,0xd5,0x81,0xb1,0x6e,0x8a,0x00,0x00,
- 0x05,0x20,0xab,0x01,0x37,0x86,0x9a,0xa9,0x7a,0xff,0xf9,0x5a,0x23,0x32,0x6d,0x4d,0x38,0x82,0x3c,0xff,0x61,0x3b,0x12,0xf9,0x9d,0xe9,0xa2,0x19,0xf3,0xbf,0xd0,0x2f,0x8a,0x8e,0x00,0x00,
- 0x05,0x20,0xab,0x03,0x89,0xce,0xe5,0xf4,0xad,0xe4,0x54,0x60,0x61,0x67,0x7a,0x34,0xdc,0xe3,0x15,0x38,0x07,0x95,0x79,0xd8,0xce,0x2e,0x19,0x1c,0x20,0xf1,0x31,0x52,0x99,0x23,0x00,0x00,
- 0x05,0x20,0xab,0x1c,0xe3,0x0c,0x7d,0x5e,0x67,0x3e,0xd9,0xf9,0x55,0x8e,0x3f,0x7e,0x96,0x6d,0x5f,0x47,0xe0,0x9f,0xc0,0xa4,0x1c,0xf7,0xa9,0x5e,0xbb,0x2a,0x11,0xd6,0x15,0xef,0x00,0x00,
- 0x05,0x20,0xab,0x7b,0x19,0x47,0x5e,0x8b,0xff,0x8b,0xc6,0x0b,0x44,0x3f,0x57,0x73,0x21,0xf0,0x1c,0x81,0x1c,0x18,0x08,0xf7,0x48,0xd4,0x5d,0x21,0x06,0x09,0x3e,0xe9,0x7e,0xd6,0x00,0x00,
- 0x05,0x20,0xab,0x6e,0x96,0x65,0xc6,0x02,0x85,0xa0,0x72,0xed,0xed,0xb9,0x07,0x45,0x88,0x84,0xfa,0xa3,0xb5,0x2f,0x9b,0x5c,0x08,0xbb,0xfc,0x21,0xd0,0xd8,0xd7,0x90,0xde,0x0c,0x00,0x00,
- 0x05,0x20,0xab,0x91,0xda,0x6c,0x19,0x38,0x12,0xd9,0xff,0x9f,0xf4,0xc4,0x85,0x2f,0xac,0x00,0xa7,0x71,0x56,0x72,0x0b,0x63,0x94,0x5e,0xca,0x4f,0xb5,0x03,0xbc,0x16,0xed,0x13,0x00,0x00,
- 0x05,0x20,0xab,0xc9,0x5b,0xfa,0x6b,0xf3,0x01,0xe6,0x35,0x69,0xe6,0x87,0xc2,0xa8,0x9d,0xf9,0x1b,0xca,0xf6,0x3f,0xf6,0x2f,0xe8,0x89,0x87,0x9d,0x6d,0xcf,0x9a,0x8e,0xdf,0x29,0x00,0x00,
- 0x05,0x20,0xab,0xd8,0xa1,0x4e,0x07,0x50,0xe0,0x65,0x11,0x53,0xfe,0xa5,0x18,0x33,0x92,0x80,0x16,0x8a,0x1b,0x7f,0xa4,0x35,0x67,0xeb,0x16,0x00,0xf1,0xb7,0xeb,0x7d,0x13,0xc1,0x00,0x00,
- 0x05,0x20,0xab,0xe7,0x97,0xdc,0x20,0xfb,0xb1,0x2d,0xdb,0x47,0x9a,0x4c,0x7e,0x52,0xee,0x30,0x08,0x3a,0x46,0x43,0x3e,0xb1,0x9e,0xab,0xc4,0xfe,0x0f,0xc0,0xed,0xee,0x55,0x1a,0x00,0x00,
- 0x05,0x20,0xac,0xbd,0xf9,0x27,0xa2,0x8a,0x84,0x97,0x7d,0x9f,0xe4,0xc7,0x46,0xe4,0x85,0x4f,0x80,0x73,0x44,0xce,0x3c,0xbc,0x43,0x27,0xa9,0xbb,0x1a,0x49,0x66,0xc0,0x73,0xbe,0x00,0x00,
- 0x05,0x20,0xad,0x20,0xaf,0xf9,0x35,0xb9,0x55,0xde,0x85,0x4e,0xac,0x04,0xc6,0x2a,0xb8,0x13,0x1a,0x32,0x13,0xe9,0xdc,0xe9,0x5f,0x93,0x23,0x0e,0xa4,0xb8,0x95,0xe9,0xc5,0x5c,0x00,0x00,
- 0x05,0x20,0xad,0xdc,0xa3,0xa9,0x03,0x24,0xd2,0xfe,0x4d,0x31,0x4f,0xd0,0x37,0x26,0xfc,0xe9,0xcd,0x43,0xb5,0x7a,0x06,0x6b,0x06,0x86,0x8b,0x75,0x0d,0x51,0xaa,0x53,0x2e,0xd8,0x00,0x00,
- 0x05,0x20,0xad,0xe5,0xa2,0x4b,0xc5,0xfd,0x2d,0xaa,0x51,0xa4,0x92,0xc3,0xf4,0x3e,0xac,0x37,0x95,0x03,0xfb,0x13,0x7a,0x49,0x97,0x27,0x4f,0x9d,0xaf,0xf7,0x0f,0x89,0x83,0x2e,0x00,0x00,
- 0x05,0x20,0xae,0x51,0x8d,0x08,0x31,0x0d,0x56,0x88,0x3d,0x1a,0xf9,0x48,0x05,0x68,0xe8,0x25,0x9d,0x5b,0xcd,0x6a,0x83,0xdf,0x20,0x1a,0x60,0xb9,0x10,0x1f,0x35,0x4e,0x6a,0x9b,0x00,0x00,
- 0x05,0x20,0xae,0x60,0xeb,0x28,0x7c,0x03,0xb0,0x45,0x01,0xe2,0x92,0xb0,0xb5,0xa3,0xff,0x02,0x76,0x4e,0x95,0xcc,0x45,0xe4,0x9c,0x20,0x16,0x6a,0xc7,0x94,0xf8,0x5d,0x6d,0xe7,0x00,0x00,
- 0x05,0x20,0xb6,0x81,0xfd,0xb1,0xdc,0x34,0x46,0x6b,0x55,0x59,0x1c,0x8f,0xe6,0xe2,0x93,0x01,0x87,0xc0,0xb3,0x16,0xc5,0x80,0x2b,0xd5,0x0e,0x1d,0xbf,0x76,0xb8,0xbf,0xd0,0x1c,0x00,0x00,
- 0x05,0x20,0xb6,0x98,0x60,0x64,0x1f,0xe8,0x19,0x1a,0x95,0xc2,0x5f,0xed,0x3f,0x57,0xe4,0x43,0x1f,0x15,0x82,0x54,0x4e,0xc2,0x8e,0x5c,0x99,0x1c,0x75,0x6c,0x40,0xea,0xbe,0x6d,0x00,0x00,
- 0x05,0x20,0xb6,0xb2,0x8d,0xdd,0xd2,0xe2,0x41,0x9d,0x96,0x7d,0xc0,0x81,0xab,0xf7,0x25,0xdf,0x09,0x21,0x4d,0xec,0xcc,0x17,0x07,0x8e,0x30,0x6c,0xd2,0xc4,0x69,0xdb,0x31,0x42,0x00,0x00,
- 0x05,0x20,0xb6,0xcf,0x88,0x35,0x74,0x20,0x79,0x8a,0xf5,0x6a,0xca,0x77,0x65,0xb6,0x29,0x7f,0xcb,0x97,0xdd,0xa8,0x37,0xaf,0xe6,0x6e,0xdd,0x1d,0x34,0xf9,0x95,0x22,0x66,0x93,0x00,0x00,
- 0x05,0x20,0xb7,0x01,0x1c,0x28,0x55,0x17,0xc8,0x25,0x66,0x90,0x8f,0xd5,0x59,0x69,0xa9,0x92,0x5e,0xa6,0xe4,0x3e,0xad,0x64,0xe1,0xbf,0x19,0x7f,0xa7,0x5a,0x6b,0xe1,0xcb,0x94,0x00,0x00,
- 0x05,0x20,0xb7,0x15,0xc3,0x33,0x62,0x3a,0x31,0x25,0x17,0x32,0x3a,0x17,0x74,0x88,0xef,0x34,0xdf,0x7d,0x5d,0x82,0xf1,0x29,0x55,0x63,0x2a,0xc2,0x6b,0x9a,0x8c,0x30,0x8b,0x98,0x00,0x00,
- 0x05,0x20,0xb7,0x7b,0x1e,0x61,0x59,0xa7,0xa1,0x3f,0x50,0xef,0xde,0xc9,0x78,0x06,0x0c,0x5c,0xf7,0xdf,0x8a,0x72,0xd5,0x35,0x97,0x23,0xe7,0x55,0x1e,0x78,0x32,0xbd,0x45,0x1e,0x00,0x00,
- 0x05,0x20,0xb7,0x92,0xbd,0x1a,0x81,0xc4,0x84,0x37,0xd0,0x28,0xc9,0x25,0xd0,0xbf,0xd2,0xe6,0x84,0x89,0xbb,0x8a,0xd7,0xef,0x61,0x26,0xc7,0xff,0xa3,0x5a,0x21,0x5a,0x7c,0x4e,0x00,0x00,
- 0x05,0x20,0xb0,0x04,0x52,0x59,0x1e,0x21,0xd8,0x5b,0xd4,0xb3,0xbc,0x19,0x10,0x08,0xa7,0xfc,0x89,0xa9,0xfd,0xd9,0x5f,0xb5,0x4e,0x1e,0x54,0xc0,0xf8,0x2e,0xdc,0xb9,0xa0,0x13,0x00,0x00,
- 0x05,0x20,0xb1,0x10,0x37,0xd6,0x47,0x43,0x47,0xb1,0xb4,0x2b,0xb4,0xc3,0xcc,0xbe,0x52,0x06,0x48,0x46,0xa8,0xbf,0x07,0xb6,0x50,0x54,0x15,0x50,0xb8,0x28,0x9e,0x03,0x57,0xfc,0x00,0x00,
- 0x05,0x20,0xb1,0xa2,0x13,0xc0,0x8c,0x99,0x7f,0x0a,0x70,0x5e,0x00,0x92,0x81,0x07,0xf4,0xc1,0x09,0xe8,0xad,0x0d,0x01,0x71,0x89,0x56,0xe2,0xd6,0x1c,0x28,0x72,0x7a,0x42,0xc4,0x00,0x00,
- 0x05,0x20,0xb2,0x4b,0x45,0x5b,0x0e,0x3a,0xd2,0x0b,0x9a,0xbc,0xb3,0x89,0x61,0xcd,0xee,0xba,0x37,0x0f,0x1d,0xb6,0x13,0x48,0x57,0x9a,0x33,0x41,0x74,0xa8,0x16,0x37,0x92,0xdb,0x00,0x00,
- 0x05,0x20,0xb2,0xc8,0xf4,0x97,0x8b,0xbc,0xb8,0x4e,0xf7,0x71,0x9b,0xdd,0x89,0x79,0x50,0x7e,0x9d,0x91,0x57,0x8f,0x82,0x6d,0x97,0x60,0x20,0xb0,0x97,0xbc,0x9e,0x23,0xae,0x74,0x00,0x00,
- 0x05,0x20,0xb3,0x17,0x8f,0x0b,0x3d,0x4f,0x79,0x6d,0x1b,0x46,0x40,0x5a,0x75,0xbe,0xb4,0x39,0xf6,0x15,0x63,0x5e,0x14,0x36,0x0e,0xa7,0x1e,0x1b,0xf4,0x73,0x6c,0xe2,0xdf,0x1d,0x00,0x00,
- 0x05,0x20,0xb3,0x5f,0xaf,0x37,0x0f,0x3c,0x0a,0xc8,0x6e,0x83,0x70,0x8c,0x2b,0x11,0xaf,0x91,0x8b,0x65,0x72,0x52,0xb7,0x77,0x29,0xf2,0xd5,0xb4,0xfc,0xcb,0x17,0xf6,0x66,0xfb,0x00,0x00,
- 0x05,0x20,0xb3,0x80,0xd0,0x49,0x0b,0xad,0xa9,0xbc,0x16,0x91,0xa9,0xeb,0x04,0xed,0x77,0x1e,0xba,0x1c,0xa7,0x85,0xbd,0xb1,0xb2,0x17,0x70,0x48,0x64,0xed,0x89,0xd9,0xae,0x04,0x00,0x00,
- 0x05,0x20,0xb3,0xda,0x4b,0x39,0x64,0xf9,0x5c,0x5a,0xda,0xb1,0xaa,0x94,0x62,0xf3,0xb2,0x30,0xaa,0x48,0xad,0xc3,0x70,0xa9,0xf2,0xca,0x6c,0xd0,0x2e,0xfe,0xa4,0xb8,0x54,0x41,0x00,0x00,
- 0x05,0x20,0xb4,0x61,0x4e,0xf3,0x72,0x95,0x03,0xf5,0x22,0xd9,0x2d,0x0d,0xc7,0x7d,0x9e,0x58,0xba,0x80,0xb0,0x00,0x60,0xc5,0xb7,0x72,0x8e,0xf0,0x3e,0xd9,0xdd,0x10,0xc8,0xf9,0x00,0x00,
- 0x05,0x20,0xb4,0x82,0x5e,0xcd,0xee,0xf9,0x05,0x20,0x16,0x92,0x2a,0xf1,0x86,0x7f,0x4a,0xf4,0xc3,0x81,0x2c,0xd5,0x80,0x2b,0xdf,0x40,0x05,0xae,0x05,0xc4,0xee,0x4f,0xc8,0xdd,0x00,0x00,
- 0x05,0x20,0xb4,0xca,0x40,0x86,0xcc,0x95,0xdd,0x8b,0x53,0xcd,0xb7,0x44,0xeb,0x2e,0xf0,0x3c,0xdc,0xab,0xc6,0xe5,0x9d,0x49,0xac,0x90,0x9e,0x2a,0xeb,0x17,0xc0,0xdc,0x4f,0x98,0x00,0x00,
- 0x05,0x20,0xb4,0xdc,0x7e,0xd7,0xf7,0x66,0xed,0x7e,0x46,0x14,0x98,0x71,0x58,0x01,0x17,0xc0,0x6c,0xb7,0xc6,0xfd,0xa0,0x35,0x84,0x57,0x46,0x00,0xb6,0xf8,0xc5,0x00,0xe9,0x19,0x00,0x00,
- 0x05,0x20,0xb5,0x10,0xa2,0xd9,0x44,0xbc,0xfc,0xb0,0xaf,0xd4,0x89,0xdd,0x89,0x47,0x40,0x08,0xb0,0x52,0xf5,0x6a,0x66,0x9c,0x98,0xf9,0x85,0x23,0x61,0x0d,0x75,0xb9,0x5a,0xe9,0x00,0x00,
- 0x05,0x20,0xb5,0x18,0x9b,0x3e,0x3c,0xed,0x0f,0x59,0x98,0xd0,0xf2,0x55,0x92,0x8c,0x1c,0xf9,0x38,0x88,0x2b,0x4e,0x6a,0x33,0x6f,0x55,0xbd,0x7b,0xb6,0x11,0xee,0x90,0x10,0xe9,0x00,0x00,
- 0x05,0x20,0xb5,0x77,0xbe,0xd5,0x51,0xfe,0xcd,0x20,0x64,0x1c,0x9f,0x8a,0xe8,0x61,0xed,0x75,0x44,0x2a,0x06,0xb6,0x2c,0x81,0x15,0x32,0xdb,0xbc,0xc5,0xb9,0xee,0x4d,0x13,0x30,0x00,0x00,
- 0x05,0x20,0xb5,0x55,0x31,0x3f,0xe7,0xc7,0x17,0xe4,0x31,0x87,0x47,0x45,0x7c,0x67,0x43,0x5c,0x82,0x73,0xd6,0x62,0x64,0x94,0x92,0x32,0x2d,0x81,0x0e,0x01,0x35,0xc0,0x7e,0xb7,0x00,0x00,
- 0x05,0x20,0xb5,0x82,0xe4,0xe2,0xcd,0x88,0x8b,0xa6,0x09,0x1f,0x2e,0xf2,0x60,0xb9,0x91,0xa2,0x84,0xce,0x0f,0x6d,0xaf,0x9f,0x39,0x87,0x63,0x71,0xd2,0xf3,0x13,0x52,0xce,0xbe,0x00,0x00,
- 0x05,0x20,0xb5,0x83,0x6f,0xb6,0x11,0xd8,0x0e,0xa8,0x57,0xda,0x15,0x20,0x5b,0x1a,0x6d,0x21,0x15,0x5a,0xbd,0xb4,0x17,0x11,0xc2,0xfb,0x0e,0xfc,0xde,0xe8,0x26,0x56,0xa8,0xac,0x00,0x00,
- 0x05,0x20,0xb5,0xcb,0x2d,0x08,0x40,0x8f,0x25,0x91,0xfb,0xc3,0x5b,0x16,0x84,0x9f,0x68,0xdc,0x78,0xca,0x10,0xf0,0x4d,0xd2,0xc0,0x06,0xc1,0x0f,0x3c,0x28,0x6c,0xcf,0x0c,0x9c,0x00,0x00,
- 0x05,0x20,0xb6,0x35,0x41,0xa9,0x66,0xc0,0xcf,0xf4,0x29,0xad,0x29,0x43,0x9a,0xac,0x6e,0x45,0xa4,0x29,0xf8,0x78,0xdb,0xbe,0x54,0x8a,0x49,0x10,0xd2,0xe8,0x70,0x3e,0xed,0x4e,0x00,0x00,
- 0x05,0x20,0xb6,0x68,0x8f,0x48,0x5f,0xf7,0xbf,0x6f,0x80,0x01,0x97,0x90,0x40,0xa0,0x97,0xe7,0xdd,0xf1,0x62,0x57,0x7c,0x70,0x51,0x81,0x73,0x02,0x97,0x6d,0x67,0x57,0x34,0xe9,0x00,0x00,
- 0x05,0x20,0xb6,0x6a,0xa4,0x77,0x5b,0xe1,0x4b,0x03,0xc5,0x1a,0xf1,0x60,0xeb,0xba,0x50,0x86,0xee,0x46,0x99,0x7a,0xd9,0x1c,0x89,0xaa,0xa8,0x7f,0x18,0xff,0x81,0x0f,0x76,0xd7,0x00,0x00,
- 0x05,0x20,0xbf,0x04,0x49,0xd0,0x11,0x0d,0x91,0x07,0x9c,0x81,0x44,0xea,0x6a,0xf2,0xfc,0x56,0x4f,0xec,0x1f,0x18,0xad,0x3a,0x2e,0x61,0x2b,0x67,0x13,0x2c,0x2f,0x81,0xac,0xbb,0x00,0x00,
- 0x05,0x20,0xbf,0x61,0x33,0x63,0x39,0x32,0x9d,0x57,0x29,0xde,0xd2,0xfc,0xde,0xf1,0xfd,0xed,0xd8,0x0e,0xbc,0x32,0x98,0x5f,0xe9,0xfa,0xe2,0xf1,0xc3,0x43,0x5f,0x3d,0x12,0xb4,0x00,0x00,
- 0x05,0x20,0xb8,0x24,0x4b,0x3d,0x10,0x7e,0x4f,0x83,0x1a,0xf6,0x90,0x12,0xc6,0xaa,0x2f,0x7a,0x34,0xec,0xb0,0x0f,0x85,0x7d,0xef,0xef,0x34,0xa6,0x18,0xea,0x12,0x1e,0xfc,0xd6,0x00,0x00,
- 0x05,0x20,0xb8,0x49,0x3c,0x06,0x5b,0x6e,0x09,0x85,0x49,0x40,0x93,0x96,0xf0,0x4d,0x3c,0x84,0x4a,0xd4,0x1b,0x3f,0x06,0x83,0x7f,0xd8,0x52,0xc4,0x5a,0x88,0x0f,0x74,0x93,0x41,0x00,0x00,
- 0x05,0x20,0xb8,0xf4,0x1c,0x1e,0x3a,0xd4,0x60,0xa0,0x59,0xc2,0x03,0xc3,0x72,0x0d,0xd5,0x62,0x0b,0x85,0x7f,0xf0,0x89,0xfc,0x18,0xf0,0x53,0xbf,0xdb,0x8d,0x78,0xef,0x65,0x25,0x00,0x00,
- 0x05,0x20,0xb8,0xdc,0xe6,0xbe,0xcd,0xb9,0xe3,0xf9,0x25,0xd8,0x10,0x36,0xb5,0x42,0x40,0x7b,0x08,0x51,0xe9,0xf4,0xc0,0x23,0xad,0x66,0x6e,0x13,0x87,0xc1,0xc5,0x29,0xa7,0x8b,0x00,0x00,
- 0x05,0x20,0xb8,0xe1,0xa3,0x72,0x6a,0x05,0x15,0x91,0x53,0xcc,0x6d,0x47,0x45,0x08,0xe8,0x6b,0x01,0xf5,0x39,0x1e,0x16,0xda,0xe2,0xad,0xe9,0x00,0x63,0x94,0xc4,0xc4,0xa3,0x0a,0x00,0x00,
- 0x05,0x20,0xb9,0x0c,0x27,0x1c,0xb1,0x6b,0x5b,0x4c,0xec,0xe3,0x60,0x7f,0x1e,0x13,0xcf,0xcd,0xc2,0xc9,0x9b,0x9e,0xf3,0x7c,0xc9,0xe3,0x4e,0xce,0xe6,0x27,0x42,0x93,0xba,0x7f,0x00,0x00,
- 0x05,0x20,0xb9,0x71,0x92,0xd0,0xce,0xdc,0x26,0x57,0xc3,0x72,0xee,0x44,0x20,0x86,0x11,0xb9,0x54,0x6c,0x6e,0x73,0x5c,0x0f,0x9f,0x4f,0xce,0xab,0x26,0x68,0xca,0x98,0x11,0x3f,0x00,0x00,
- 0x05,0x20,0xb9,0x83,0x9e,0xd5,0xe4,0x57,0xaa,0x02,0x11,0x3a,0xc9,0x13,0x78,0xa5,0x6e,0x81,0xb5,0x28,0x07,0xdf,0x32,0x19,0xfd,0x42,0x0f,0x70,0xe0,0x58,0x7b,0x51,0x2a,0xeb,0x00,0x00,
- 0x05,0x20,0xb9,0xa1,0x9b,0xd0,0x6a,0xa9,0x83,0x0b,0x3a,0x40,0x38,0x3f,0x90,0xeb,0xc9,0x36,0x41,0xdb,0x07,0xec,0xf7,0xbf,0xaf,0xc5,0x5c,0xae,0xb2,0x9f,0xea,0xe6,0x36,0x90,0x00,0x00,
- 0x05,0x20,0xb9,0xa4,0xad,0x1e,0x90,0x31,0xd0,0x59,0xe3,0x2d,0x8f,0x96,0xb8,0xfb,0x33,0x23,0xdd,0xdd,0x6c,0xe8,0xb4,0x24,0x2b,0xa5,0xe0,0xb0,0x82,0xc2,0x7e,0xf3,0x4c,0x66,0x00,0x00,
- 0x05,0x20,0xba,0x48,0x1c,0x20,0x18,0x1c,0x82,0x1f,0xf8,0xd0,0xc9,0x27,0x26,0x08,0x46,0x3f,0xbe,0xe2,0x02,0xf3,0xd8,0xb8,0xc5,0x59,0x93,0xf9,0x92,0xb2,0xe1,0x9a,0xf7,0x88,0x00,0x00,
- 0x05,0x20,0xba,0xcb,0x7a,0x48,0xcd,0xcb,0xd8,0x09,0xd2,0x60,0x89,0x06,0x2a,0xdf,0x5f,0xcb,0x90,0x41,0x35,0xdc,0x9b,0xee,0xce,0xe9,0x28,0x10,0xea,0xde,0x4a,0x3d,0x1e,0x30,0x00,0x00,
- 0x05,0x20,0xbb,0x3b,0xdb,0x34,0xa7,0x33,0x25,0x8e,0x5b,0x3a,0xe4,0xac,0x99,0x6b,0x28,0x35,0x0e,0x4a,0x4f,0xd8,0xfe,0x94,0x79,0xf3,0x13,0xb6,0x0a,0x36,0x26,0x57,0x92,0xdb,0x00,0x00,
- 0x05,0x20,0xbb,0x43,0xb7,0xde,0x6c,0x02,0x3c,0xe2,0x84,0x11,0xc0,0x84,0xbb,0x5a,0x84,0x00,0x22,0xde,0x47,0x79,0x9e,0xf2,0x65,0x10,0x8f,0x77,0x1e,0x66,0x4a,0xd0,0xa9,0x45,0x00,0x00,
- 0x05,0x20,0xbb,0x6b,0x23,0x05,0xcd,0x5a,0x41,0xf1,0x30,0x8e,0x54,0x74,0xc9,0x54,0x64,0x5c,0x16,0x09,0x05,0x56,0x34,0x1a,0x38,0x1b,0xe4,0x02,0xad,0xcd,0xcf,0x6c,0xe7,0xbb,0x00,0x00,
- 0x05,0x20,0xbb,0xe1,0x40,0xcb,0x85,0x9d,0x3f,0x86,0x72,0xf6,0x8a,0x22,0xbc,0xe8,0x9b,0xf1,0xab,0x84,0xa9,0x0b,0xd8,0x8f,0x58,0x7f,0x81,0x4f,0x16,0x5f,0x8d,0x22,0x8d,0xb9,0x00,0x00,
- 0x05,0x20,0xbc,0x63,0x7d,0x44,0x4f,0x4e,0xf2,0x42,0xc8,0xf3,0x9f,0xd4,0x06,0x67,0x74,0x2a,0xdb,0x62,0x05,0xf5,0xd1,0x94,0x61,0xfa,0xab,0x88,0xc1,0x9b,0x99,0x6d,0xef,0xcd,0x00,0x00,
- 0x05,0x20,0xbc,0x6d,0x48,0x61,0x62,0x32,0xa3,0xa7,0x56,0x45,0xe3,0xf2,0x87,0x48,0x7a,0xfe,0x2c,0x3f,0xbc,0xa0,0x71,0xdb,0x12,0x3b,0x19,0x67,0xf5,0x05,0xb6,0xae,0x54,0xe3,0x00,0x00,
- 0x05,0x20,0xbc,0xee,0x7e,0x5a,0x6c,0x0a,0x57,0x2f,0xfa,0xd7,0x69,0x0e,0x4e,0xfc,0x93,0xa0,0x69,0x0a,0xc8,0x68,0xa3,0x6c,0x6a,0x93,0xca,0xb2,0x67,0xc0,0x0a,0xd2,0xb3,0x53,0x00,0x00,
- 0x05,0x20,0xbd,0x07,0xc2,0x99,0x84,0x87,0x0e,0xbe,0x08,0xd2,0x0a,0x5b,0xba,0x07,0x3a,0x46,0x12,0x6a,0x38,0xd2,0x53,0x7f,0x68,0x90,0x92,0xab,0xe4,0xcd,0xa0,0x3a,0xfa,0x9e,0x00,0x00,
- 0x05,0x20,0xbd,0x11,0x5a,0xb5,0xe2,0x4e,0xa2,0x79,0x5d,0x8a,0xc6,0x13,0x96,0x62,0x1e,0x07,0xcd,0x63,0x52,0x4d,0x85,0x86,0xa5,0x99,0x0c,0x03,0x2a,0xac,0xd3,0xf1,0x6b,0x59,0x00,0x00,
- 0x05,0x20,0xbd,0x5f,0x90,0x40,0xb3,0x59,0x6f,0xa2,0x4e,0x18,0x97,0xf7,0xb6,0x34,0x6c,0xfa,0x63,0xb5,0xe9,0x3b,0x41,0x77,0x69,0x28,0xab,0x4e,0x40,0xeb,0x76,0x5c,0x8c,0x4b,0x00,0x00,
- 0x05,0x20,0xbd,0x67,0x56,0x00,0x8b,0x27,0xdb,0x2f,0xeb,0xac,0x48,0x1d,0x69,0x01,0x2f,0xbf,0x02,0x62,0x90,0x41,0xa4,0x70,0x7f,0x3e,0x0c,0x1b,0x5b,0xbf,0x8a,0x1f,0x14,0xb5,0x00,0x00,
- 0x05,0x20,0xbd,0xbc,0x15,0x93,0x9a,0x4d,0x2c,0xa2,0xc5,0x24,0x98,0x76,0x76,0x2b,0x44,0x7f,0x92,0xdc,0x50,0xa7,0xa4,0xdc,0x46,0xe2,0x2e,0xa7,0x90,0x47,0x41,0x0e,0x65,0xb9,0x00,0x00,
- 0x05,0x20,0xbd,0x96,0xa7,0xd0,0x2a,0xac,0x87,0x2c,0x00,0x98,0x5c,0x0a,0xcb,0x95,0x5c,0xda,0x68,0xaf,0x4b,0x3b,0x3d,0xda,0xcb,0x13,0x99,0x23,0x44,0x98,0x7f,0xe0,0xcb,0x48,0x00,0x00,
- 0x05,0x20,0xbe,0x07,0x98,0x46,0xc6,0x34,0x94,0x30,0xb0,0x90,0x89,0xcd,0x3f,0x01,0x71,0x71,0x97,0x90,0xa8,0x40,0x8e,0x46,0xb3,0x80,0x2c,0xac,0x65,0x96,0x76,0x9e,0x11,0x69,0x00,0x00,
- 0x05,0x20,0xbe,0x0e,0xb2,0x32,0x0c,0x71,0x29,0x28,0x04,0x39,0x8f,0x1d,0x07,0x9f,0xca,0x33,0x2a,0xcd,0x83,0x6b,0x88,0x68,0x06,0xdd,0x4c,0xc1,0x27,0x67,0x1e,0xee,0xc3,0x5a,0x00,0x00,
- 0x05,0x20,0xc6,0xfd,0xd5,0x97,0x75,0x59,0xfd,0x53,0x72,0x32,0xf4,0xe2,0xd4,0x8b,0x88,0x06,0xaf,0x07,0xac,0x07,0x56,0xbd,0x8d,0xcf,0x10,0x4a,0xf1,0xa8,0x6a,0xaf,0x2b,0x60,0x00,0x00,
- 0x05,0x20,0xc6,0xc9,0x0a,0x6a,0x62,0xf6,0x65,0x78,0x4d,0xa3,0xa1,0xa4,0x5c,0xba,0x73,0xa1,0x1a,0x53,0x5d,0xab,0xf9,0x20,0x60,0x0d,0x8d,0xca,0x54,0xe4,0x1a,0xf5,0x91,0x14,0x00,0x00,
- 0x05,0x20,0xc6,0xdc,0x21,0x2f,0xb1,0x80,0xb4,0xcc,0xfb,0x84,0x95,0x3a,0xc8,0x65,0xd8,0x2e,0x56,0x1b,0xb9,0xff,0x9c,0xe6,0x5d,0x07,0x66,0xc5,0xd3,0x49,0x4f,0xbf,0x9d,0xcb,0x00,0x00,
- 0x05,0x20,0xc7,0x3b,0x73,0xc1,0x41,0xe6,0xda,0x27,0x28,0xb6,0x3c,0x99,0x1e,0x67,0xc5,0xb6,0x15,0x44,0x4f,0xce,0xdb,0xf4,0xa0,0xc9,0xdb,0x23,0x2b,0xf9,0x4d,0xe8,0xb5,0x9d,0x00,0x00,
- 0x05,0x20,0xc7,0x1a,0x96,0x78,0xb3,0x1b,0x7b,0xed,0x43,0xb3,0x3e,0x47,0xb2,0xd4,0x3a,0x2f,0x58,0x14,0x78,0x26,0x5b,0x31,0x47,0xd1,0x42,0x60,0x9f,0x3d,0x4e,0x8e,0xf4,0x97,0x00,0x00,
- 0x05,0x20,0xc7,0x6d,0x1d,0x06,0xdb,0x8c,0xf9,0x1a,0xdb,0xe7,0x84,0x13,0xf8,0x4d,0x65,0xfd,0x46,0x39,0x7b,0x2a,0xf0,0xa5,0xb6,0x53,0x6c,0xc6,0x07,0x40,0x49,0x04,0x83,0x94,0x00,0x00,
- 0x05,0x20,0xc0,0x52,0x6c,0x2d,0xa7,0xaa,0xb6,0x5c,0xe0,0x02,0xbd,0x70,0x7f,0x0e,0xd5,0x89,0xfe,0xb5,0x6b,0xfb,0x81,0xfb,0x0b,0x4b,0xf4,0x85,0x2b,0x13,0x9e,0xd1,0xf4,0x54,0x00,0x00,
- 0x05,0x20,0xc0,0xb9,0x7b,0x21,0xbd,0xa2,0x48,0xda,0x8a,0x3e,0xc3,0x6c,0xac,0xfd,0x6d,0x63,0x21,0xb6,0xb3,0x37,0xa9,0x4d,0x42,0x2c,0x9e,0x75,0x61,0x07,0xdc,0xc9,0xab,0x9b,0x00,0x00,
- 0x05,0x20,0xc1,0x19,0x15,0x62,0x0c,0x4e,0x6d,0x66,0xeb,0x00,0x94,0xf4,0x60,0x78,0x62,0x6c,0x9d,0x56,0xde,0xc8,0x7e,0xa2,0x97,0xa0,0x7d,0xf1,0xa2,0x33,0x7d,0x13,0xa1,0x9e,0x00,0x00,
- 0x05,0x20,0xc1,0x5e,0xb4,0xfb,0xf7,0xb0,0x82,0xb0,0xa2,0x9c,0x76,0x46,0x36,0x65,0x6c,0x4a,0xf8,0x82,0x83,0xe1,0x3a,0xb3,0x9a,0x78,0xb4,0xf2,0x54,0xec,0x42,0x88,0xf5,0x7d,0x00,0x00,
- 0x05,0x20,0xc1,0xa6,0x2e,0xb3,0x8c,0x3e,0xe0,0x74,0x7e,0x62,0x9f,0x38,0x6b,0xc0,0x24,0x69,0xd4,0x09,0x3f,0x58,0xe6,0x06,0x96,0xf6,0x14,0x07,0x17,0xda,0x9f,0x7d,0x74,0x87,0x00,0x00,
- 0x05,0x20,0xc2,0x77,0x5d,0xb8,0x46,0x58,0xda,0x01,0x2a,0xef,0x9c,0x92,0xcb,0x02,0x40,0xe5,0xf3,0x74,0xed,0x13,0xf4,0x67,0x43,0xb1,0x6f,0xbd,0x6c,0xb8,0x75,0x4c,0xc6,0x27,0x00,0x00,
- 0x05,0x20,0xc2,0xb5,0x28,0xa8,0x6b,0x0b,0x3e,0xa2,0x06,0xbd,0xd8,0xef,0xce,0xca,0x5f,0x86,0x8a,0x91,0x63,0xbe,0x66,0xcd,0x8b,0x42,0xb6,0xf7,0x49,0x80,0x7c,0x4e,0xf9,0xcd,0x00,0x00,
- 0x05,0x20,0xc2,0x9e,0xf4,0xb2,0xd4,0x6e,0x61,0x9a,0x52,0x02,0xf4,0x21,0x24,0x25,0xcc,0x2e,0x46,0x64,0x10,0x90,0xd3,0x14,0x81,0x81,0xe2,0xe0,0x2d,0x1b,0x5b,0x4d,0x43,0x43,0x00,0x00,
- 0x05,0x20,0xc2,0xab,0xed,0x45,0x15,0x5d,0xe9,0x18,0x6a,0xca,0x20,0x80,0x6c,0xcb,0xfe,0x9d,0x16,0x57,0x47,0xfe,0xe8,0xb5,0xbf,0x86,0x49,0x6f,0xd3,0x3e,0x73,0x7e,0x53,0x75,0x00,0x00,
- 0x05,0x20,0xc2,0xd7,0x58,0x2b,0x54,0x9a,0x19,0x74,0xcd,0xd8,0xca,0xbe,0xbd,0x72,0x5c,0x6f,0x65,0x07,0xf4,0x61,0x6f,0x6b,0x69,0x06,0x7b,0x36,0xc6,0x3f,0x1f,0x83,0xbc,0x89,0x00,0x00,
- 0x05,0x20,0xc2,0xdf,0x82,0x8a,0x5a,0xe2,0x13,0xef,0x8d,0x4b,0xfa,0x0c,0x7c,0x3a,0x9c,0xce,0x8c,0xf2,0x9d,0x2b,0x9e,0x90,0x45,0xad,0x3a,0x00,0xf8,0x31,0xc6,0xe2,0x47,0xb6,0x00,0x00,
- 0x05,0x20,0xc3,0x1d,0xa1,0x35,0x63,0x64,0xa7,0x98,0x2e,0x43,0x3d,0xfe,0xaa,0x45,0x08,0xf8,0x00,0x52,0xc4,0xef,0x30,0x0b,0x75,0xad,0x1b,0x97,0x3e,0xfc,0x84,0xa4,0xe9,0x2b,0x00,0x00,
- 0x05,0x20,0xc3,0x71,0xec,0xc2,0x61,0xfc,0x2a,0x4f,0xda,0xc5,0x14,0xe4,0xec,0x9f,0x27,0x0c,0x38,0x7c,0x22,0x6b,0x80,0x9d,0xca,0x1c,0x5d,0x86,0xe3,0x54,0x92,0xff,0xfb,0x81,0x00,0x00,
- 0x05,0x20,0xc3,0x72,0x73,0xdd,0x68,0x22,0x0d,0x36,0x27,0xcb,0xf9,0x74,0x38,0x77,0x98,0x7b,0x64,0x02,0xff,0x5b,0x05,0x3e,0xed,0xd0,0xed,0x44,0x98,0xb3,0x35,0x4c,0x14,0x13,0x00,0x00,
- 0x05,0x20,0xc3,0x8b,0xcc,0x56,0xbc,0x01,0xac,0x72,0xb1,0x02,0x4f,0x69,0xa1,0xc4,0x8c,0xe7,0xdb,0x52,0xa9,0x07,0x6b,0xfc,0x14,0x2f,0xee,0x11,0xbd,0xd3,0x60,0x78,0xce,0x45,0x00,0x00,
- 0x05,0x20,0xc3,0x93,0x4c,0x47,0x10,0xf5,0x4a,0xec,0x69,0x85,0x9c,0x46,0xcc,0x05,0x90,0xd1,0xd2,0x42,0xd3,0x31,0xb3,0x1f,0x08,0x16,0xaa,0xd2,0x87,0xd3,0xbe,0x66,0x8e,0xe0,0x00,0x00,
- 0x05,0x20,0xc3,0xc3,0x0e,0x81,0x64,0x74,0x20,0xeb,0xcd,0xdc,0x9a,0xae,0xb6,0x2e,0xe7,0xd1,0xe3,0x29,0xa6,0xf9,0x79,0x9c,0xd4,0xed,0x6a,0xf8,0xf3,0x62,0x00,0xf2,0xd9,0xcf,0x00,0x00,
- 0x05,0x20,0xc4,0x17,0xa5,0x73,0x29,0x5f,0xb8,0x39,0xe0,0x34,0x15,0x16,0x93,0x1b,0x95,0xe5,0x3d,0x24,0x93,0x92,0x63,0x70,0x0c,0x6e,0xb2,0x5d,0x7e,0x88,0xc5,0x06,0xcd,0xd4,0x00,0x00,
- 0x05,0x20,0xc4,0xb7,0xe8,0xce,0x84,0x19,0xb9,0xc9,0x00,0xe4,0x58,0x71,0x28,0x23,0x4c,0x08,0xb4,0xbd,0xc4,0x45,0x1e,0x37,0xbc,0x8e,0xa7,0xa9,0x55,0x7e,0xd1,0xc2,0x00,0x82,0x00,0x00,
- 0x05,0x20,0xc4,0xbe,0xd7,0xed,0xec,0x29,0xd1,0x88,0x6f,0x3a,0x88,0x9c,0x4c,0x2c,0x3f,0x01,0x8a,0x1c,0x16,0x87,0x3b,0xfe,0xac,0x6a,0x99,0xad,0x69,0x99,0x58,0x03,0xf0,0x90,0x00,0x00,
- 0x05,0x20,0xc5,0x20,0x1e,0xf4,0x71,0xcc,0x4f,0x72,0xb6,0xae,0x0e,0x05,0x78,0x02,0x9c,0xfa,0x90,0x10,0x00,0xbc,0xab,0x80,0xc5,0x6d,0x57,0x5f,0xff,0x70,0x87,0x9a,0xba,0xa0,0x00,0x00,
- 0x05,0x20,0xc5,0x8a,0x0a,0x02,0x80,0x22,0x83,0x1b,0x9a,0xc0,0x01,0xc4,0x9c,0xa0,0xa4,0x66,0x47,0x0d,0x7a,0xf2,0x91,0xed,0xde,0x48,0xdc,0x0b,0xe3,0xdc,0xff,0x92,0x15,0x91,0x00,0x00,
- 0x05,0x20,0xc5,0x9f,0x23,0x53,0xcd,0x5b,0x4b,0xa5,0xf2,0x58,0xe7,0x26,0x89,0xe8,0x15,0xf9,0xcb,0x9b,0x5a,0x73,0x0a,0x6b,0x60,0xce,0x41,0x9c,0x29,0x1d,0x82,0xc8,0x05,0xf4,0x00,0x00,
- 0x05,0x20,0xce,0xf8,0xfb,0x76,0x6b,0x75,0xac,0x8d,0x99,0xe9,0xde,0x04,0x1d,0x0d,0xf3,0x36,0x29,0x0f,0x74,0x2f,0x4f,0xed,0xbf,0x5c,0x07,0x92,0xcc,0x85,0x18,0xce,0xe9,0x00,0x00,0x00,
- 0x05,0x20,0xce,0xd3,0xab,0xc8,0xeb,0xe4,0xde,0x1b,0x83,0x01,0x13,0xe2,0x7c,0xc3,0xe2,0xa6,0x7d,0x48,0x85,0xd0,0x75,0xeb,0x57,0xb4,0xb1,0x45,0x78,0xdd,0x2e,0x1f,0xd2,0x65,0x00,0x00,
- 0x05,0x20,0xce,0xde,0x6c,0x15,0x16,0x2e,0x44,0x3d,0x1b,0xf5,0xe4,0x65,0xe2,0x2f,0xb3,0xa8,0xbb,0xdc,0x7c,0x1b,0x98,0x11,0xc3,0x08,0x2f,0x93,0xbc,0x55,0x80,0x89,0x12,0x88,0x00,0x00,
- 0x05,0x20,0xcf,0x98,0xbc,0x46,0xe2,0x48,0xc6,0xf1,0x01,0xd4,0x65,0xdb,0x6e,0xbc,0x94,0x5b,0x55,0x54,0xf7,0xc7,0x35,0xa0,0xc6,0x8b,0xa0,0x1b,0xa9,0x37,0xfd,0xe8,0xa2,0x40,0x00,0x00,
- 0x05,0x20,0xcf,0xaf,0x29,0x4f,0x10,0xe6,0x70,0xdc,0xd4,0x06,0xb5,0x77,0x68,0xfc,0xf3,0xcf,0x2b,0x79,0xce,0x2e,0x9e,0x43,0xd4,0x64,0x85,0x74,0xd7,0x68,0x33,0xea,0x4c,0xe8,0x00,0x00,
- 0x05,0x20,0xcf,0xc4,0x9b,0xbf,0x1c,0x98,0x28,0x8d,0x28,0x1b,0x22,0x8b,0x09,0xba,0x8c,0x90,0x7e,0xf3,0x6a,0x4e,0x56,0xec,0x52,0x63,0x6c,0xd4,0x5c,0x4a,0x3d,0xe2,0x8e,0x4f,0x00,0x00,
- 0x05,0x20,0xcf,0xc4,0x9c,0x95,0x95,0xf5,0x80,0x34,0x9a,0x99,0x00,0x2b,0x4f,0xbc,0xb2,0x81,0xe8,0x90,0x8b,0x32,0x78,0x4b,0xd9,0x5e,0xf1,0x83,0x46,0x47,0x56,0x9b,0x5c,0xf6,0x00,0x00,
- 0x05,0x20,0xcf,0xcc,0xa2,0x48,0x2a,0x0a,0xf5,0xf5,0xbc,0x4f,0x0b,0x4e,0x62,0xb8,0xa9,0xcf,0x4a,0x76,0xd5,0x69,0xc9,0x6b,0x8c,0x0e,0x9f,0x56,0x36,0xe1,0xe4,0x70,0x97,0x17,0x00,0x00,
- 0x05,0x20,0xc8,0x0a,0x3e,0x74,0x5a,0x3e,0x47,0xcb,0x6a,0x7a,0xe4,0x26,0x98,0x40,0x30,0x66,0xf3,0xc3,0x83,0x01,0xf5,0x40,0x34,0xfa,0x43,0xeb,0xa8,0xa4,0xe1,0x09,0xd0,0x22,0x00,0x00,
- 0x05,0x20,0xc8,0x55,0x01,0x42,0x68,0x45,0xb8,0xdb,0x48,0x72,0xeb,0xd2,0x45,0xf8,0x0b,0x8f,0x51,0xc3,0x99,0x18,0x81,0x7a,0x64,0x5a,0x91,0x1e,0x0c,0x5c,0x48,0x02,0x8d,0x34,0x00,0x00,
- 0x05,0x20,0xc8,0x73,0xfd,0x68,0x67,0xfc,0x6b,0x4f,0x50,0xc3,0xc0,0xd8,0xb6,0x4c,0xc5,0xc0,0xbf,0x16,0xbc,0x92,0x58,0x09,0xdd,0x74,0x5f,0x61,0xe3,0xf8,0x9a,0x44,0x52,0x42,0x00,0x00,
- 0x05,0x20,0xc8,0xac,0x68,0x5b,0xe7,0x5d,0xbf,0xcd,0xfc,0x1f,0x05,0x3c,0xdf,0x38,0x2b,0x48,0xc3,0xc0,0x45,0xb2,0x3b,0x90,0x11,0xc1,0xde,0xab,0xa2,0x42,0x72,0xe8,0xcb,0x5d,0x00,0x00,
- 0x05,0x20,0xc8,0xf8,0xd9,0x73,0x22,0xc5,0x4c,0xfb,0x29,0x0e,0x2c,0xd0,0x82,0xcc,0xc9,0xff,0x1b,0xe6,0x17,0x8c,0xe2,0x09,0x0f,0x00,0x83,0x80,0x32,0xd6,0x0d,0x1e,0x89,0xc7,0x00,0x00,
- 0x05,0x20,0xc9,0xad,0x22,0x12,0x37,0xb4,0x1a,0x81,0xef,0x27,0x15,0x17,0x9a,0x40,0x2a,0x39,0x8f,0x33,0xc8,0x35,0x90,0x5b,0x07,0x5a,0x24,0x1b,0xa5,0x32,0xc1,0x75,0x05,0xa5,0x00,0x00,
- 0x05,0x20,0xca,0x08,0x7a,0x5c,0x6f,0xc1,0xba,0x3a,0xd5,0xb9,0x20,0xd8,0x28,0x5e,0x59,0x18,0x8a,0xb9,0x46,0xfe,0x2c,0x18,0x6c,0x87,0xee,0x19,0x0b,0x0b,0x40,0x17,0x8c,0xbf,0x00,0x00,
- 0x05,0x20,0xca,0xb5,0x1f,0xab,0x39,0x41,0xb3,0x4e,0xab,0x3e,0xfd,0xdb,0x10,0x93,0xbe,0xa7,0x6c,0x05,0xb4,0xd8,0x58,0xa4,0xaf,0xf7,0xc1,0x53,0x27,0xef,0x09,0x84,0x26,0x07,0x00,0x00,
- 0x05,0x20,0xca,0x82,0x93,0x15,0xfc,0x75,0x1c,0x25,0x3e,0x4c,0x78,0x47,0x85,0xa3,0x88,0x5b,0xbe,0x5d,0xac,0x25,0x4c,0x82,0xe0,0x63,0x6d,0x2f,0x3f,0x86,0x22,0x3a,0x58,0xe3,0x00,0x00,
- 0x05,0x20,0xca,0x91,0xe3,0x81,0x64,0x95,0x14,0x72,0x91,0x7f,0xf3,0xf2,0x8a,0x4c,0xc8,0x10,0x39,0x98,0xbf,0xb0,0x98,0x58,0xb6,0x1b,0x10,0x2f,0x86,0xd6,0xb9,0x8a,0xf9,0xd2,0x00,0x00,
- 0x05,0x20,0xca,0x90,0x9e,0x7f,0x60,0xa3,0x18,0xff,0x46,0xb6,0xaa,0x3f,0x60,0xc7,0xa8,0x43,0xbd,0x7a,0x6a,0x87,0xe4,0x5c,0xf3,0x84,0xf8,0x74,0xf7,0xfa,0x5c,0xf1,0xc1,0x91,0x00,0x00,
- 0x05,0x20,0xcb,0xeb,0x08,0x0e,0x22,0x68,0x0c,0x01,0xf4,0x18,0xa4,0xcb,0xf3,0xa9,0xfe,0x7c,0x67,0x58,0x85,0x8a,0x69,0xe0,0x3a,0x2f,0x70,0xb1,0x0b,0x3f,0xb8,0x1d,0x42,0xb3,0x00,0x00,
- 0x05,0x20,0xcc,0x0b,0x3f,0x8b,0xd1,0x45,0x7e,0x0a,0x5f,0xda,0x85,0x89,0xdb,0x96,0x0a,0x46,0xc6,0x20,0xf2,0x91,0xa8,0x4b,0x8f,0x33,0x96,0xcf,0xcb,0xcf,0x27,0x54,0x96,0xd6,0x00,0x00,
- 0x05,0x20,0xcc,0x0e,0xe8,0x18,0xbb,0x23,0x53,0xa7,0xd7,0xfc,0x92,0x5d,0x5f,0x0e,0x67,0x7c,0x7c,0x98,0x00,0xb6,0xec,0x21,0x9c,0xca,0xad,0x28,0xe1,0x9c,0x0b,0x02,0x3d,0xdf,0x00,0x00,
- 0x05,0x20,0xcc,0x62,0xa4,0x77,0x8c,0x6f,0x7c,0x5c,0x4d,0x19,0x51,0x58,0x7b,0xfc,0x94,0x09,0x01,0xbf,0xbc,0x03,0xb8,0x37,0x95,0xa2,0xd0,0xf1,0xa6,0xa6,0xc6,0x57,0xae,0x80,0x00,0x00,
- 0x05,0x20,0xcc,0x8a,0xf1,0x34,0x2a,0xe1,0xb4,0x1b,0x5d,0x7f,0xc6,0x3a,0x40,0xc4,0x55,0x5d,0xc7,0xd3,0x3c,0x57,0x04,0xc9,0x61,0xc4,0xcf,0x41,0x89,0xf7,0x43,0x0a,0xa3,0x6d,0x00,0x00,
- 0x05,0x20,0xcc,0xb3,0x0f,0x91,0xa0,0xb8,0x73,0xd7,0xec,0xbb,0x40,0xce,0x55,0x28,0x7a,0xa6,0xb0,0x67,0x92,0x16,0x4e,0xdd,0xe3,0xa9,0xc5,0x29,0x44,0xc5,0xad,0xb8,0x65,0xa0,0x00,0x00,
- 0x05,0x20,0xcc,0xe3,0xb1,0x7e,0x19,0xf5,0x78,0x78,0xb4,0x86,0x62,0xb2,0x99,0x47,0xba,0xb6,0x11,0xca,0x78,0x91,0xc7,0x19,0xfe,0x49,0x5b,0x67,0xfe,0xea,0x3f,0x56,0x97,0x14,0x00,0x00,
- 0x05,0x20,0xcc,0xf1,0x70,0xa4,0x04,0xfd,0x04,0x5c,0x51,0xf7,0x7e,0x3f,0xd4,0xd9,0xf9,0x1a,0xa6,0x6e,0x18,0x35,0x3a,0xf9,0xb6,0x9f,0x42,0x8d,0xa1,0x1b,0xea,0x87,0xa9,0x06,0x00,0x00,
- 0x05,0x20,0xcd,0x00,0xc4,0xfb,0x60,0x1f,0xf6,0x96,0x36,0xdf,0xbb,0x6f,0x16,0x26,0x41,0x49,0xbf,0x53,0x6b,0x69,0xe7,0xad,0xb6,0x3c,0x5a,0xa0,0xde,0x23,0x24,0xaa,0x14,0x05,0x00,0x00,
- 0x05,0x20,0xcd,0x44,0x75,0xc5,0x34,0xcc,0x06,0xbb,0xef,0xe5,0x3a,0x02,0x76,0xe1,0x9c,0xc7,0x9f,0xdf,0x56,0x6b,0xc3,0x28,0x94,0xd3,0x27,0x3e,0x84,0xfd,0xf3,0x10,0x2c,0x67,0x00,0x00,
- 0x05,0x20,0xcd,0xe4,0x3d,0x96,0x02,0xc9,0xfc,0x31,0x98,0x89,0x16,0xb8,0xd6,0xb0,0x3b,0xb5,0xbe,0xd0,0x2d,0x04,0x86,0xc1,0xf1,0x4b,0x4c,0x82,0x31,0xe9,0xb0,0xa5,0xdd,0x90,0x00,0x00,
- 0x05,0x20,0xce,0x35,0x8b,0x57,0x10,0x1c,0xba,0x13,0x0d,0xce,0xe4,0xcc,0x1a,0x6c,0x36,0x4b,0xf7,0x83,0x61,0xbb,0xc9,0x68,0x1c,0x73,0x89,0x23,0x05,0xeb,0x83,0xc5,0x0d,0xa6,0x00,0x00,
- 0x05,0x20,0xce,0x62,0x4e,0x72,0xa7,0xff,0xbc,0x93,0x15,0xd1,0x1d,0xb4,0x43,0xd3,0x51,0xf3,0xf9,0xc4,0xeb,0x74,0xc3,0xaa,0x6a,0xb3,0xe8,0xb5,0x0e,0xfd,0x9b,0xa8,0xcf,0x04,0x00,0x00,
- 0x04,0x20,0xc0,0x87,0x6d,0x13,0x94,0x29,0x8b,0x63,0x8a,0x0d,0x07,0x0d,0xb6,0x6a,0x12,0xa8,0x17,0x8d,0x6d,0xd9,0x01,0x2e,0x0b,0x09,0x3b,0xbf,0x0d,0x33,0x08,0x87,0x35,0xa8,0x20,0x8d,
- 0x04,0x20,0xc0,0x8b,0x52,0x0e,0x8b,0x53,0xe2,0x3e,0x85,0x88,0xac,0x08,0x9a,0x47,0xa0,0x7c,0xc5,0x2e,0x7c,0x60,0x84,0xc5,0x5c,0xba,0x6d,0x69,0xcb,0x5b,0x53,0x6e,0xf1,0x84,0x20,0x8d,
- 0x04,0x20,0xc0,0x95,0xe5,0xf4,0xa5,0xb7,0x9d,0x2c,0x9a,0x6e,0x17,0xc9,0x3e,0x17,0x13,0xab,0xf7,0x28,0x0c,0xbd,0x05,0xb0,0xac,0x72,0x6b,0x79,0x88,0xcd,0x37,0x98,0xf2,0x05,0x20,0x8d,
- 0x04,0x20,0xc0,0x9a,0x47,0xb7,0x2a,0x9a,0x8e,0x5c,0x4a,0x08,0x4a,0xcc,0x14,0xab,0xa0,0xb2,0x2a,0xb9,0x6c,0x88,0x80,0x7a,0xa4,0xd0,0x6e,0x9a,0x6a,0xda,0xac,0x24,0xf0,0x0f,0x20,0x8d,
- 0x04,0x20,0xc0,0xad,0x18,0x80,0x2e,0x63,0x91,0x75,0x5c,0xc6,0x55,0xd6,0x3c,0x5d,0x50,0x70,0xbf,0x08,0x63,0x53,0xed,0xae,0x29,0x5d,0x26,0x70,0xd7,0x5a,0x60,0x76,0x11,0xfc,0x20,0x8d,
- 0x04,0x20,0xc0,0xad,0x68,0xd9,0x50,0x40,0x6a,0xa2,0xcd,0xe2,0xea,0xb1,0x09,0x79,0xa5,0xf9,0xe3,0x92,0x4e,0x2c,0x81,0xac,0xee,0x60,0x04,0xf8,0x61,0xd7,0x4e,0xb4,0x0a,0x8b,0x20,0x8d,
- 0x04,0x20,0xc0,0xae,0x91,0x9f,0x89,0x8f,0x2b,0x46,0xf3,0x9f,0x10,0xe5,0x91,0x38,0xc4,0xd7,0x9e,0x11,0xb6,0x01,0x59,0x51,0xa7,0x49,0x8a,0xe9,0x39,0x48,0x32,0x28,0x35,0xbf,0x20,0x8d,
- 0x04,0x20,0xc0,0xf4,0x06,0x23,0x71,0x23,0x36,0x8d,0x72,0x1a,0x0f,0xfc,0xbe,0x51,0x38,0x86,0xf9,0xbc,0x0a,0x2e,0xb4,0x66,0x7b,0x43,0x02,0xab,0xc5,0x27,0x14,0xcf,0xb2,0xef,0x20,0x8d,
- 0x04,0x20,0xc0,0xf8,0xdc,0x52,0x50,0x52,0x1a,0x6f,0x4d,0x42,0xb3,0x18,0xe7,0xe5,0xab,0xb9,0xf0,0x53,0xab,0x66,0x95,0xb5,0xee,0x81,0x79,0xfd,0x5e,0xef,0x4d,0xd0,0x36,0xd5,0x20,0x8d,
- 0x04,0x20,0xc0,0xfc,0x1d,0xda,0x6c,0xa7,0x83,0x9e,0xa9,0x9f,0x3d,0xbd,0xce,0xb9,0x98,0xaf,0xba,0xe6,0x93,0xda,0xfd,0xc8,0x23,0xfc,0xbb,0xab,0x57,0x65,0x05,0x72,0xac,0x07,0x20,0x8d,
- 0x04,0x20,0xc0,0xca,0xe8,0x86,0xfd,0xe3,0x1b,0x9f,0x9b,0xb4,0xd3,0x29,0xaa,0x2d,0x4e,0x65,0x40,0xa1,0x86,0xd7,0x70,0x07,0xe0,0x44,0x0a,0x6a,0x12,0x1d,0x23,0x9f,0x32,0x8a,0x20,0x8d,
- 0x04,0x20,0xc0,0xd1,0x02,0x2a,0x0f,0x11,0x7b,0xbf,0x5b,0xb4,0xb4,0x86,0x25,0xdb,0xaf,0x9f,0x1b,0xa2,0xab,0x3d,0xd1,0x5d,0xca,0xd8,0x63,0xa0,0x85,0xd9,0xf5,0x7c,0x31,0xe0,0x20,0x8d,
- 0x04,0x20,0xc0,0xd7,0xd5,0x42,0x3a,0x05,0x2a,0x82,0x75,0x93,0x4a,0x99,0xbf,0x9f,0x2a,0x81,0xf9,0xb7,0xb8,0x28,0x0c,0xf1,0xc6,0x48,0xb9,0x50,0x69,0xc4,0xd1,0xaf,0x37,0x4c,0x20,0x8d,
- 0x04,0x20,0xc0,0xdc,0x9a,0x31,0x15,0x4b,0xd0,0xd9,0x69,0x76,0x34,0x17,0xdb,0x83,0x16,0x0b,0x4d,0x16,0x5b,0xbe,0x6d,0x59,0x30,0x2e,0xa5,0x46,0x3f,0x28,0xf3,0x4a,0x95,0x63,0x20,0x8d,
- 0x04,0x20,0xc0,0xea,0x1b,0x8f,0x32,0xf5,0xbb,0x62,0x15,0x05,0x44,0x25,0x06,0xcd,0xe1,0x1f,0xe6,0xb4,0x38,0xa4,0x6c,0x10,0x7e,0x9d,0x6d,0xce,0xf9,0xde,0x78,0xb5,0xc7,0x00,0x20,0x8d,
- 0x04,0x20,0xc1,0x01,0x3f,0x10,0x1c,0x24,0xaa,0x3e,0x35,0x0c,0x39,0xb5,0x11,0x07,0x66,0x3b,0xe9,0x27,0x43,0x29,0x0f,0x38,0x05,0x87,0x67,0x38,0xd3,0xc1,0xe9,0xa8,0x63,0x75,0x20,0x8d,
- 0x04,0x20,0xc1,0x0a,0x81,0x64,0xd4,0x2f,0x39,0xb9,0x39,0x29,0x18,0x98,0x7f,0xaf,0x2a,0xfa,0xfd,0x8e,0x6c,0x1e,0xae,0x92,0x1c,0x2b,0x77,0xd5,0xb8,0xdf,0xdd,0xca,0x4c,0xb8,0x20,0x8d,
- 0x04,0x20,0xc1,0x0a,0x90,0x61,0x6e,0xab,0xc6,0x70,0x87,0xa1,0xe8,0x4e,0x9b,0xef,0xe3,0x41,0xa7,0xda,0x7b,0x4b,0x66,0x70,0x2e,0xf3,0x06,0x98,0x03,0x61,0xbc,0xec,0xde,0x6c,0x20,0x8d,
- 0x04,0x20,0xc1,0x0c,0x77,0x8a,0x91,0xc0,0x06,0xb0,0xdf,0x2a,0xf3,0xb7,0x44,0x90,0x2c,0x2d,0x28,0xc5,0x3d,0xc8,0xde,0x87,0x1d,0x0a,0x65,0x64,0x17,0xea,0xc1,0xbd,0xb2,0x50,0x20,0x8d,
- 0x04,0x20,0xc1,0x1b,0x6d,0x78,0xbb,0x47,0x94,0x5e,0xd3,0x4d,0x00,0xfd,0x75,0xa0,0xd7,0x57,0x51,0x84,0x65,0x35,0x5f,0xd9,0x2b,0xed,0xf9,0x48,0x81,0x34,0x12,0x4e,0x30,0xc8,0x20,0x8d,
- 0x04,0x20,0xc1,0x1c,0x01,0xd0,0x8e,0xdd,0x14,0x5f,0x4b,0x65,0x24,0xf1,0x69,0x86,0xa6,0x63,0xeb,0x19,0xa9,0x20,0xec,0x56,0xff,0xd8,0x4f,0xe0,0x10,0x23,0xfa,0x65,0x39,0xf7,0x20,0x8d,
- 0x04,0x20,0xc1,0x20,0x98,0xb5,0xb4,0x2f,0x0a,0x13,0x65,0x0a,0xff,0x20,0x53,0xc5,0xc7,0x16,0x18,0x9f,0x88,0x41,0xc9,0x3c,0xd1,0xab,0x1c,0x79,0x3d,0xfd,0x88,0xe5,0x92,0x44,0x20,0x8d,
- 0x04,0x20,0xc1,0x22,0xd6,0x14,0xd1,0xa7,0x3c,0x6e,0x6e,0xb2,0x42,0x53,0x5e,0x71,0xbf,0x66,0xfb,0x37,0xbb,0x2d,0x6a,0x87,0xa7,0xea,0xcb,0xdd,0x21,0x95,0x20,0x93,0xa2,0xaf,0x20,0x8d,
- 0x04,0x20,0xc1,0x27,0x32,0xe5,0xfa,0xa8,0x1a,0xc5,0x10,0xf6,0xb9,0x01,0x43,0x3a,0x70,0x14,0x8d,0xbb,0x49,0xcc,0x10,0x22,0x6a,0x92,0x6a,0xe3,0x4f,0x66,0x90,0x31,0x7c,0x3e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x11,0xd5,0x40,0x05,0x31,0xb0,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2c,0x0f,0xfb,0x18,0x04,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x20,0x8d,
+ 0x04,0x20,0xd6,0x9f,0x9d,0x19,0x10,0x32,0xe2,0x90,0x1d,0xa4,0x08,0x48,0x41,0xa7,0x05,0x3b,0x31,0xaf,0x59,0x05,0x87,0xc7,0xeb,0x35,0x0e,0x43,0xa1,0x5d,0xa8,0x22,0x98,0xc7,0x20,0x8d,
+ 0x04,0x20,0xd7,0x38,0x5e,0x38,0x72,0xd2,0x70,0x7b,0xa4,0x39,0x62,0x5c,0xef,0xf0,0xf5,0x19,0xb3,0x75,0x28,0xbc,0xbe,0x24,0xdb,0x2d,0x0d,0xe0,0x7d,0xec,0x80,0x53,0x95,0x49,0x20,0x8d,
+ 0x04,0x20,0xd7,0x57,0xed,0x23,0x12,0x64,0x29,0x98,0xaf,0x57,0x33,0x85,0x54,0x3e,0x41,0xd4,0x0f,0x6b,0xa3,0x20,0x39,0x8a,0xee,0xf6,0x52,0x4e,0x87,0x41,0x00,0xe6,0x3b,0x05,0x20,0x8d,
+ 0x04,0x20,0xd7,0x5b,0x68,0x32,0x61,0x82,0x05,0x08,0xbe,0x32,0x2d,0x7f,0xd9,0x98,0xe6,0xe6,0xf4,0x2e,0x55,0x10,0x5b,0xe5,0xf7,0x57,0xba,0x78,0x75,0x44,0xea,0x9a,0xb7,0x08,0x20,0x8d,
+ 0x04,0x20,0xd7,0x72,0xc2,0x82,0x00,0x52,0x36,0x5d,0xf1,0xf6,0x88,0x35,0xcc,0x2f,0xc4,0x81,0xa5,0x13,0xb0,0x57,0xb0,0x35,0x54,0x84,0xb7,0xc8,0xc6,0x60,0x2c,0x86,0x21,0x3c,0x20,0x8d,
+ 0x04,0x20,0xd7,0x92,0x50,0xde,0x23,0x6c,0x83,0x75,0x81,0x1f,0x83,0x9b,0x10,0x21,0x2f,0xdc,0x81,0xa9,0x60,0x28,0xcb,0x2f,0xfe,0xc7,0x1e,0x1e,0x23,0xb9,0x6c,0x60,0x63,0xd9,0x20,0x8d,
+ 0x04,0x20,0xd7,0xda,0x30,0x73,0x66,0x86,0xe0,0x82,0x71,0x96,0xd1,0xa4,0x29,0x66,0xf6,0xe7,0x44,0xa9,0xad,0x59,0x0e,0x87,0x22,0x1c,0x0d,0xb4,0x23,0x5d,0xa1,0x7c,0xe8,0x45,0x20,0x8d,
+ 0x04,0x20,0xd0,0x7a,0xcc,0x52,0x83,0x8e,0x34,0x51,0x74,0x01,0xb5,0x23,0xef,0xe2,0xe4,0x6c,0x14,0x90,0xbf,0x66,0xb6,0x39,0x75,0x5d,0x78,0xf1,0x17,0x48,0xde,0xcf,0x87,0x99,0x20,0x8d,
+ 0x04,0x20,0xd0,0x69,0xf0,0x08,0x1d,0x1c,0x97,0x7e,0xed,0xca,0x20,0xc9,0x35,0x3a,0xa8,0xac,0x8b,0x93,0x25,0x54,0xea,0xa3,0x76,0xde,0xbe,0x48,0xac,0xf7,0x56,0x30,0x11,0x30,0x20,0x8d,
+ 0x04,0x20,0xd1,0x62,0xdc,0x41,0xd8,0x67,0x4d,0x0b,0x3b,0xef,0xbf,0x82,0xb8,0xa3,0x4f,0xf0,0xa1,0x77,0xc2,0xc9,0xcf,0x8b,0x79,0xc6,0x96,0x0b,0xbc,0x71,0x14,0x34,0x3f,0xe3,0x20,0x8d,
+ 0x04,0x20,0xd1,0xbe,0x5e,0x0e,0x53,0xe1,0x81,0xa6,0x5a,0x60,0xaa,0x77,0x43,0xa2,0xe7,0xb4,0xd5,0x30,0x4b,0xbb,0x8d,0x27,0x93,0x97,0x63,0x5f,0x16,0xa2,0x07,0x77,0xf2,0x3e,0x20,0x8d,
+ 0x04,0x20,0xd1,0xf0,0xed,0x35,0xe7,0x48,0xce,0xaf,0xca,0x2d,0x52,0x7f,0xad,0x3d,0xb8,0x68,0x66,0x3e,0x40,0x54,0xd2,0x81,0x08,0x4a,0x05,0x83,0x78,0x3a,0x6e,0x08,0xe7,0x70,0x20,0x8d,
+ 0x04,0x20,0xd1,0xf1,0x76,0x2c,0x0a,0x44,0x66,0xf3,0x06,0xec,0xc3,0xb0,0xb9,0x2a,0xcc,0xdc,0x36,0xfe,0x76,0x32,0x24,0x33,0xc0,0x93,0x2f,0xb3,0x85,0x7e,0xe5,0x5a,0x8e,0x4c,0x20,0x8d,
+ 0x04,0x20,0xd2,0x5a,0x3a,0x01,0xe6,0x6c,0xb3,0x3b,0xc1,0x76,0xf8,0x1b,0xaf,0x6d,0x89,0x4c,0x47,0xa3,0x9f,0x4e,0x51,0x9e,0x6f,0x4b,0x8f,0xba,0xe6,0xab,0x48,0x16,0xc1,0x62,0x20,0x8d,
+ 0x04,0x20,0xd3,0x42,0x52,0x53,0x19,0xc4,0xa0,0x7b,0x68,0x00,0xb2,0x09,0x5a,0x24,0x62,0xfc,0xb6,0xfa,0xc5,0x1b,0x36,0x0d,0x42,0xba,0xcd,0x17,0xf6,0xf0,0x86,0x1f,0x7d,0x9c,0x20,0x8d,
+ 0x04,0x20,0xd3,0x84,0xa3,0x27,0xd8,0xba,0xb1,0x32,0xa2,0x8f,0xdc,0x57,0x49,0xab,0xe9,0xf6,0xa7,0x36,0xd5,0xa3,0x45,0x63,0x28,0x43,0x9a,0xd9,0x91,0xfd,0x04,0xdd,0x7d,0x21,0x20,0x8d,
+ 0x04,0x20,0xd3,0xb1,0x9f,0xe5,0x4f,0xa2,0x8e,0xb7,0x0f,0x3c,0x38,0x87,0x22,0xa8,0x3f,0x2e,0xe6,0x37,0x3f,0x0a,0xd1,0xfd,0xd6,0xda,0x60,0x45,0x51,0x4b,0x0a,0xbc,0x5a,0xa9,0x20,0x8d,
+ 0x04,0x20,0xd4,0x18,0x53,0xe8,0x18,0xf6,0x6a,0xfa,0xd6,0x42,0xd1,0x4d,0x51,0x02,0x36,0x47,0x9b,0x8f,0xd5,0xc7,0x9e,0xfd,0x4b,0x43,0x27,0xd4,0xb4,0xb1,0x29,0x53,0xb8,0xc9,0x20,0x8d,
+ 0x04,0x20,0xd4,0x5f,0x04,0x6b,0xc9,0x5c,0xdf,0x0b,0x98,0xeb,0x72,0xd2,0xa2,0xd5,0xf8,0xb4,0x30,0x8c,0xcd,0x4b,0xac,0x09,0xa4,0xf8,0xdd,0xdf,0x45,0x3e,0x40,0x5d,0x11,0x51,0x20,0x8d,
+ 0x04,0x20,0xd4,0x5f,0x71,0x44,0xb7,0x8c,0xc6,0x29,0x7c,0xbf,0x50,0xc2,0x0f,0x27,0xf1,0xd9,0x13,0xe5,0x6a,0xe8,0xb0,0xa2,0x10,0xb4,0x55,0xa6,0x1d,0xb1,0xb2,0x5b,0x44,0x24,0x20,0x8d,
+ 0x04,0x20,0xd8,0x73,0x8e,0x55,0x90,0x75,0x4e,0x86,0x51,0xa3,0xdf,0x44,0xb0,0x0b,0x93,0xbe,0xd1,0x2c,0x70,0xb9,0x7b,0x61,0x0f,0x88,0xf9,0x43,0x95,0x38,0xf5,0x0d,0xe0,0x35,0x20,0x8d,
+ 0x04,0x20,0xd8,0xf7,0xf9,0xaa,0x2e,0x0c,0x16,0xcf,0xf0,0x92,0x98,0x5d,0x6a,0xef,0x95,0x21,0x9b,0x37,0x87,0x1c,0x76,0xfa,0x5e,0x09,0xfc,0x00,0xdc,0xf5,0x4a,0x27,0xac,0x1e,0x20,0x8d,
+ 0x04,0x20,0xd8,0xef,0x0e,0xe7,0x71,0x61,0xf2,0x78,0xf5,0x20,0x02,0x2d,0x96,0xef,0x83,0x5d,0xd2,0x09,0x1e,0xc3,0x2e,0x09,0x97,0xed,0xf7,0x46,0x82,0xe5,0x17,0xcb,0x4a,0xe3,0x20,0x8d,
+ 0x04,0x20,0xd9,0x79,0xc1,0x8d,0xf8,0xd0,0xbd,0x6c,0x4e,0x1b,0xf8,0xff,0xb8,0xbb,0xe9,0xd9,0xd7,0xae,0x35,0x26,0x62,0x8e,0xa6,0xdf,0x04,0x50,0xf6,0xd2,0xa3,0xc5,0x47,0xb4,0x20,0x8d,
+ 0x04,0x20,0xd9,0x7d,0x7d,0x80,0x42,0x4e,0x5d,0xfd,0x4c,0x57,0x2e,0xcb,0x6c,0xba,0x76,0x9e,0xac,0x8e,0x17,0xc9,0x82,0x19,0x47,0x0c,0x7d,0x98,0xf7,0x35,0x2c,0x1f,0x9d,0x65,0x20,0x8d,
+ 0x04,0x20,0xda,0xba,0xfb,0x57,0xac,0x82,0x5d,0xc1,0x18,0x8a,0xc6,0x34,0xd1,0x57,0xc8,0x76,0x07,0x48,0x50,0x6a,0xf1,0x92,0xef,0x46,0x1b,0x76,0x47,0x00,0x4c,0xc3,0x60,0x3a,0x20,0x8d,
+ 0x04,0x20,0xda,0xe9,0x14,0x31,0x06,0xef,0x1d,0x97,0xbe,0x95,0x80,0x4f,0xd5,0xba,0x37,0x13,0x39,0x9f,0x75,0x7e,0xc0,0x71,0x19,0x4f,0x6a,0x90,0xd2,0x54,0x3b,0x08,0x17,0x9a,0x20,0x8d,
+ 0x04,0x20,0xdb,0x38,0xef,0x94,0x42,0x72,0x32,0x68,0x13,0x68,0xc0,0x6c,0x49,0x86,0x13,0x66,0xeb,0x20,0xfc,0x6f,0x73,0x86,0x61,0xf4,0xd3,0x03,0x71,0x7c,0xfc,0xdb,0xa4,0x8d,0x20,0x8d,
+ 0x04,0x20,0xdc,0x0c,0x6b,0x85,0xfa,0x09,0x8d,0x52,0x6a,0xfa,0x25,0x45,0x2f,0x37,0x0d,0x70,0x2f,0x1c,0x50,0x96,0xeb,0x05,0x1e,0x2d,0x72,0x53,0x45,0x92,0x59,0x1b,0x70,0x85,0x20,0x8d,
+ 0x04,0x20,0xdc,0x80,0xfe,0x55,0xdd,0xaf,0x35,0x92,0xfa,0x95,0x09,0x1d,0x73,0x27,0x53,0x64,0x2c,0x5b,0xb6,0x4c,0xf2,0xd7,0x38,0x88,0x97,0x39,0x07,0xfc,0x85,0x1e,0xfc,0x6a,0x20,0x8d,
+ 0x04,0x20,0xdc,0xdc,0x53,0x83,0x96,0xf8,0x7f,0x8e,0x81,0x86,0xb1,0xd3,0xb3,0xca,0x49,0x8f,0xf3,0xb8,0xe6,0x2f,0x9a,0xde,0xcf,0x58,0xd9,0x32,0xa3,0x1a,0x42,0xdc,0x4e,0x34,0x20,0x8d,
+ 0x04,0x20,0xdc,0xde,0x12,0x4c,0x84,0x63,0xa9,0xdd,0xe0,0xb9,0x41,0x72,0x10,0xb0,0xe6,0x87,0xc1,0x55,0xc6,0x8c,0x98,0x05,0x29,0xab,0xda,0x3a,0xe8,0xab,0x72,0xa6,0x9f,0xd0,0x20,0x8d,
+ 0x04,0x20,0xdd,0x96,0x36,0x3e,0x5d,0x3b,0xae,0x2f,0xfa,0x05,0x2e,0x9c,0x5d,0x80,0x6f,0xf1,0x60,0x30,0x6e,0xae,0x08,0x88,0xd7,0x0d,0xd0,0xb5,0x9b,0xa3,0x45,0x66,0x93,0x69,0x20,0x8d,
+ 0x04,0x20,0xe6,0xa0,0x53,0xc1,0xd8,0x20,0x54,0xf1,0x8c,0x92,0xba,0x3f,0x90,0xb3,0x74,0x48,0x8b,0x96,0x02,0x73,0x12,0xc0,0xd6,0xd5,0x43,0x7f,0x8d,0xdf,0x99,0x41,0x37,0x57,0x20,0x8d,
+ 0x04,0x20,0xe6,0xa8,0xa1,0xa3,0xd9,0x91,0xa1,0xd3,0x88,0xbd,0x1f,0x03,0xeb,0xdc,0x69,0xff,0xca,0x54,0x49,0x87,0xce,0xa4,0xcf,0x98,0x95,0x40,0x44,0xdb,0x1f,0x25,0x35,0x1a,0x20,0x8d,
+ 0x04,0x20,0xe7,0xe9,0xc5,0x85,0x3f,0x83,0x30,0xb5,0xaa,0xe9,0xda,0x43,0x92,0xa5,0xc0,0x37,0x33,0xdc,0x22,0x8e,0xc3,0xe5,0x87,0xf3,0x7d,0xe0,0x1f,0x17,0x49,0x94,0x6a,0x81,0x20,0x8d,
+ 0x04,0x20,0xe2,0xf4,0xa0,0xd7,0xc3,0xc0,0x0c,0x74,0x42,0x39,0x15,0x30,0xbc,0xd0,0xf6,0x48,0x80,0x6d,0xd4,0x34,0x4c,0x78,0x28,0x93,0x45,0xd1,0x76,0x0e,0x98,0x25,0xfc,0xb5,0x20,0x8d,
+ 0x04,0x20,0xe3,0x65,0xf2,0x53,0x6b,0xb8,0x36,0x1e,0xe6,0x15,0x02,0x6b,0x98,0xa0,0xce,0xd7,0x17,0x30,0xa5,0x84,0x44,0x19,0xa7,0x82,0x27,0x22,0x0e,0x09,0x8f,0x8d,0xf3,0x20,0x20,0x8d,
+ 0x04,0x20,0xe3,0xd9,0xa0,0x94,0x3b,0x01,0x14,0xbd,0xad,0x4f,0x2f,0x22,0x74,0xa4,0x23,0x69,0x44,0xdd,0x5c,0x4d,0x82,0x95,0xc1,0x93,0x6f,0xcf,0x88,0xaa,0x9c,0xbd,0xc3,0x37,0x20,0x8d,
+ 0x04,0x20,0xe4,0x3d,0x75,0x4e,0x71,0xd5,0x6b,0x81,0x37,0xc4,0xe5,0x2d,0xde,0x94,0x85,0x5c,0xa1,0xb7,0x62,0x2c,0x06,0x5b,0xf9,0x97,0x3c,0xee,0x2e,0xd4,0x7f,0x78,0x3a,0x53,0x20,0x8d,
+ 0x04,0x20,0xe4,0x4b,0xbf,0x49,0x3f,0xfe,0xca,0x7b,0x5c,0x30,0xd4,0x99,0x8b,0x3f,0x97,0x53,0xc7,0x7a,0xa3,0x1e,0x06,0x62,0xee,0x11,0xe2,0x5f,0x6b,0x34,0x97,0xe5,0x92,0x5b,0x20,0x8d,
+ 0x04,0x20,0xe5,0x7a,0xcc,0x5a,0x97,0x0b,0xc7,0x0c,0x16,0xd6,0x77,0x03,0x5c,0x18,0x30,0xc5,0x5a,0x4d,0x7c,0x8a,0x35,0x01,0x58,0x6b,0xde,0x03,0xfc,0xef,0xf5,0x21,0x12,0x56,0x20,0x8d,
+ 0x04,0x20,0xe5,0x5f,0xa7,0xc9,0x1f,0xdc,0x0b,0x27,0x8b,0xcd,0x23,0x86,0xfb,0xba,0xe4,0xe1,0xc9,0x77,0x9c,0xb9,0x87,0x56,0xb7,0x4a,0x20,0x3f,0x4c,0xae,0x35,0x36,0x3b,0x7e,0x20,0x8d,
+ 0x04,0x20,0xee,0x98,0x54,0xba,0x87,0xb5,0xcb,0xb7,0xd2,0x9a,0x01,0x78,0x39,0x39,0x52,0x49,0x4e,0xda,0xd0,0xbc,0x61,0x9e,0xa1,0x05,0x76,0xf1,0x86,0xc9,0x24,0xd1,0x0b,0xe3,0x20,0x8d,
+ 0x04,0x20,0xee,0xc2,0xf3,0x48,0xb8,0x5a,0x73,0x7e,0xd3,0x33,0x87,0x73,0x4d,0x60,0x2c,0xd3,0xa0,0x94,0x04,0x1a,0x20,0x98,0xc1,0x59,0x30,0xcf,0x78,0x59,0x2e,0xf1,0xd2,0x7d,0x20,0x8d,
+ 0x04,0x20,0xef,0x8a,0x5f,0xe5,0x67,0x8e,0xe4,0xb3,0x83,0x63,0xd1,0x7d,0xa4,0x12,0xf7,0xf9,0x9b,0xb4,0xde,0x29,0xaa,0x83,0xb2,0x7d,0xb7,0xfd,0x34,0x99,0xb6,0x82,0xd4,0xbf,0x20,0x8d,
+ 0x04,0x20,0xe8,0x6e,0xf7,0x3a,0x31,0x36,0x0f,0x21,0x77,0xfc,0xf4,0x4d,0xc0,0x0e,0xb3,0x4b,0x2e,0xa7,0x96,0xce,0xe5,0x4e,0xe5,0x64,0x9f,0xbd,0x7f,0x51,0x00,0x1b,0x03,0x49,0x20,0x8d,
+ 0x04,0x20,0xe9,0x90,0xa1,0x51,0x46,0xef,0xaf,0xf9,0xe0,0xd6,0x9a,0x5e,0x4b,0xd4,0x7f,0x10,0x36,0xc4,0x1d,0x2f,0x9e,0x4b,0x11,0x5c,0x31,0x59,0xf7,0xaa,0x93,0x16,0x77,0x17,0x20,0x8d,
+ 0x04,0x20,0xea,0x8c,0x60,0x11,0x69,0xa1,0xb3,0x6e,0xee,0x7f,0x62,0x23,0x7d,0x1e,0x0c,0x90,0xa8,0x2e,0x94,0x01,0xd6,0xde,0x53,0x77,0xec,0x45,0x62,0x1b,0x5b,0x6f,0x27,0x44,0x20,0x8d,
+ 0x04,0x20,0xeb,0x4c,0x2b,0xc6,0x2f,0x50,0x84,0x82,0x57,0xd4,0x01,0xa9,0x36,0x7b,0x29,0x72,0x3e,0x3f,0x2f,0x6d,0x59,0xd0,0xa9,0xa1,0x1b,0xce,0xd8,0x7c,0xbc,0x41,0xec,0x14,0x20,0x8d,
+ 0x04,0x20,0xeb,0xd0,0x0e,0x3d,0xdf,0x0c,0x4c,0x20,0x04,0x87,0x4e,0x1e,0x86,0x98,0x94,0x2d,0xec,0x0c,0x39,0x3c,0x62,0x1b,0xe4,0x98,0x1d,0x86,0x32,0x01,0x37,0xab,0x7f,0x05,0x20,0x8d,
+ 0x04,0x20,0xeb,0xd9,0x1d,0x41,0x74,0x00,0x0a,0x46,0x2d,0x05,0x64,0xa2,0x3d,0x8e,0x77,0x39,0xa7,0x95,0x1c,0x5a,0xa7,0xd4,0xf9,0x66,0x15,0x5f,0x4f,0xb5,0xd8,0x3d,0xe2,0x58,0x20,0x8d,
+ 0x04,0x20,0xec,0x97,0xe2,0x95,0x29,0xdb,0x08,0x26,0xc9,0x47,0x97,0x97,0x37,0x9f,0x30,0xfe,0x79,0x5b,0x8c,0xe5,0x93,0x3c,0x5f,0xde,0xbc,0x2b,0x31,0x04,0xce,0x0b,0x0e,0x73,0x20,0x8d,
+ 0x04,0x20,0xec,0xd9,0xea,0x05,0x12,0xd0,0x26,0xf4,0xa0,0x86,0x33,0xe6,0x54,0x4f,0xb9,0x57,0x06,0xd6,0x38,0x96,0x10,0x96,0x9d,0x98,0x29,0x28,0x9e,0xd7,0x4b,0x16,0xa9,0x3e,0x20,0x8d,
+ 0x04,0x20,0xed,0x50,0xa3,0xfe,0xd9,0x66,0x15,0x31,0x85,0x3c,0x74,0xda,0x8c,0xda,0x4e,0x24,0xdf,0x0f,0xcf,0x72,0xb0,0x0d,0xdd,0x79,0x75,0xae,0x33,0x6e,0xd9,0x2c,0x72,0x13,0x20,0x8d,
+ 0x04,0x20,0xed,0x56,0xb6,0xa5,0xcf,0xce,0x0e,0xc5,0x95,0xf2,0x02,0x83,0xea,0xe6,0x11,0xe1,0x5e,0x60,0xc0,0x88,0x58,0xa9,0x1b,0xb1,0x1d,0x54,0xc0,0xc9,0xd5,0x47,0x80,0xe8,0x20,0x8d,
+ 0x04,0x20,0xed,0x5e,0x16,0xd9,0x8a,0x82,0x58,0x47,0x4b,0x90,0x2c,0xc1,0xd7,0x7f,0xcd,0x95,0x11,0xc4,0x22,0x52,0x01,0x4d,0x95,0xee,0x03,0x54,0xd9,0x2c,0xb7,0x21,0x26,0xf6,0x20,0x8d,
+ 0x04,0x20,0xed,0x84,0x64,0x53,0xe4,0x33,0xd5,0x07,0xb7,0xde,0xae,0x3c,0x3c,0xf3,0x7d,0x8f,0xdd,0x58,0x49,0xfa,0xc7,0xc8,0x57,0xa7,0x1e,0x68,0x02,0x1e,0x84,0xf3,0x6a,0x0d,0x20,0x8d,
+ 0x04,0x20,0xee,0x08,0xd0,0x45,0xf9,0x41,0xcf,0x6c,0xff,0xab,0x08,0xa3,0x3d,0x6a,0xc9,0xd4,0x27,0x05,0xf3,0x8a,0xeb,0xf2,0x1d,0x4f,0x04,0xaf,0x8b,0x75,0x85,0xf9,0x63,0xfd,0x20,0x8d,
+ 0x04,0x20,0xee,0x51,0xc1,0x50,0x47,0x66,0x69,0x66,0xa8,0xde,0x5a,0x3e,0x89,0x9f,0x6f,0x24,0x64,0x86,0xe2,0xae,0x60,0xa8,0x23,0xf4,0xac,0xbe,0x29,0x99,0xf8,0x8d,0x2e,0x85,0x20,0x8d,
+ 0x04,0x20,0xf6,0xa7,0x6f,0xc8,0x5d,0xee,0xbd,0xdb,0x6a,0x50,0x39,0xd4,0x16,0x89,0xd4,0x61,0xae,0x14,0x5e,0xf3,0x50,0x14,0x8a,0x38,0xdf,0xc8,0xa1,0x8a,0x1b,0xe8,0x20,0x43,0x20,0x8d,
+ 0x04,0x20,0xf6,0xc5,0x0a,0x43,0x44,0xd9,0x9e,0x23,0x16,0x68,0xeb,0xc9,0x39,0xdf,0x92,0x09,0xbb,0x33,0x7a,0xf2,0x4a,0xfe,0xd2,0x49,0x4b,0xd5,0xbd,0x66,0xc0,0xc8,0x57,0x95,0x20,0x8d,
+ 0x04,0x20,0xf7,0x52,0x80,0x5e,0xe4,0x3b,0x00,0xa6,0xfb,0x8d,0x96,0x08,0x0b,0xea,0xea,0xd8,0xe0,0xa2,0x19,0xc7,0xa6,0xf6,0x54,0x7f,0xe6,0x49,0xe8,0xac,0xdb,0xe3,0x67,0x69,0x20,0x8d,
+ 0x04,0x20,0xf0,0x73,0x3d,0x30,0x64,0x77,0x80,0x53,0x95,0x65,0xbb,0x10,0xb6,0x9d,0xca,0x55,0x6d,0xe2,0x0e,0xf4,0x27,0x16,0x61,0x0e,0xa9,0x40,0x7c,0x56,0xf4,0x6c,0xc7,0xcf,0x20,0x8d,
+ 0x04,0x20,0xf1,0xdc,0x1a,0x12,0x46,0x6e,0xca,0xae,0x07,0xd7,0x52,0x8c,0x94,0xf3,0x00,0x0b,0x79,0x11,0xaa,0x17,0x3b,0xa3,0xac,0x1b,0xb2,0x19,0x56,0xf8,0xb2,0x69,0x4d,0x1d,0x20,0x8d,
+ 0x04,0x20,0xf2,0x22,0x14,0x59,0xde,0x66,0xeb,0x87,0x3a,0xe8,0x07,0x8d,0x2c,0x5e,0xb7,0xe8,0xaf,0x42,0x8d,0xf5,0x68,0x76,0xfa,0xf6,0xd6,0xc7,0x08,0xe5,0xb9,0xdd,0x1b,0x00,0x20,0x8d,
+ 0x04,0x20,0xf2,0x70,0x0f,0xf7,0x6c,0x86,0x62,0xa6,0x19,0x4e,0x7e,0x9b,0x8b,0xfb,0xa2,0xbc,0x0a,0xea,0x3f,0x5a,0x60,0xc0,0xf4,0xf6,0x6a,0x57,0x8d,0x0b,0x1f,0xec,0xf6,0x48,0x20,0x8d,
+ 0x04,0x20,0xf3,0x3b,0xef,0x7d,0x4b,0x85,0x43,0x80,0x7a,0x90,0x6b,0x05,0x09,0x3d,0xdf,0x01,0x1d,0x12,0x3b,0x22,0x43,0xf3,0x90,0xf4,0xba,0xd6,0xaa,0xb8,0xa4,0xe7,0x70,0xe2,0x20,0x8d,
+ 0x04,0x20,0xf3,0xaa,0xbd,0x6c,0x41,0xb1,0xc5,0xa1,0xbd,0x9d,0x89,0xb9,0x19,0x6a,0xf1,0x81,0xbf,0x1f,0x57,0x43,0xe0,0x67,0x2a,0xcb,0xd3,0x21,0xf6,0x9d,0x96,0xc8,0xee,0x3e,0x20,0x8d,
+ 0x04,0x20,0xf4,0x35,0x0b,0x15,0xaf,0x3e,0x1d,0x5f,0x6f,0xb2,0x87,0x13,0xe3,0xa1,0x18,0xef,0x6c,0x8e,0x38,0x64,0xea,0x42,0x21,0xfa,0xce,0x12,0x29,0xc9,0xf4,0x4d,0xfb,0x19,0x20,0x8d,
+ 0x04,0x20,0xf4,0x15,0xe0,0xcc,0x5a,0xdd,0x67,0x45,0x8e,0x6d,0x6b,0x15,0x58,0xc2,0xac,0xc8,0x92,0xf7,0x51,0x6b,0x2d,0x86,0xc6,0xb4,0x53,0xaa,0xea,0x45,0x5c,0xea,0x1a,0x57,0x20,0x8d,
+ 0x04,0x20,0xf5,0x5c,0x4a,0xe0,0x5e,0x2f,0xda,0x6d,0x02,0xef,0x36,0x6d,0xb4,0x45,0x94,0xf7,0xfe,0xe9,0x6c,0x3e,0x5f,0xba,0xb4,0x9e,0x8e,0xc9,0x7e,0x72,0xa8,0x11,0xd1,0x5e,0x20,0x8d,
+ 0x04,0x20,0xf5,0xb1,0x0d,0x23,0x86,0x92,0x6a,0x81,0xd7,0x3f,0xa3,0x24,0x36,0xda,0x26,0xbd,0x55,0x24,0xcb,0xf6,0x85,0x6b,0x42,0xf3,0x23,0x4d,0xe4,0x92,0xa6,0xc6,0xfd,0x90,0x20,0x8d,
+ 0x04,0x20,0xf6,0x5b,0x41,0x3e,0xb7,0xfa,0xbd,0x90,0x48,0xc7,0xc5,0x34,0x38,0x15,0xfd,0x99,0xe5,0x18,0xfc,0x1d,0xf0,0x86,0x70,0xef,0x10,0x70,0x0d,0x12,0x6e,0x95,0xee,0x9c,0x20,0x8d,
+ 0x04,0x20,0xff,0x1c,0x9e,0x48,0x7c,0x27,0x72,0x5f,0xb2,0x81,0xef,0x5e,0x46,0x71,0x49,0x14,0x1d,0xea,0x0e,0x86,0x77,0x77,0xb6,0x2d,0xa0,0x3d,0xd9,0x7f,0x29,0x68,0xb3,0x0f,0x20,0x8d,
+ 0x04,0x20,0xff,0xb0,0x84,0x86,0xa2,0x27,0x24,0x15,0xd8,0xd1,0xde,0xa1,0xa9,0x13,0x47,0x02,0x84,0x1b,0x92,0x42,0x13,0x72,0x96,0x2d,0xee,0x7c,0xd9,0xa1,0xea,0x77,0x64,0x88,0x20,0x8d,
+ 0x04,0x20,0xff,0xef,0x45,0xc2,0x5e,0x33,0x80,0x0b,0x31,0x9e,0xd7,0x54,0xe8,0x69,0x2c,0xdd,0x0e,0xd1,0xf4,0x62,0x14,0x7a,0x29,0x9c,0xc8,0x6c,0xb6,0x97,0xd3,0x16,0x68,0xa1,0x20,0x8d,
+ 0x04,0x20,0xf8,0x41,0x44,0x73,0xc3,0xac,0x0b,0xbf,0xf1,0x4f,0x47,0xc0,0x02,0x94,0x1f,0xbb,0x4f,0xbf,0x5d,0xa3,0x17,0x58,0x96,0x40,0xbc,0x56,0x43,0x71,0x52,0x97,0x07,0x5c,0x20,0x8d,
+ 0x04,0x20,0xf8,0x53,0x61,0xb6,0xfd,0xa3,0x08,0x5d,0x84,0x47,0x9b,0x78,0x27,0x67,0x90,0x05,0xaf,0xa9,0x4f,0x9f,0xee,0x84,0xa8,0xb2,0xd0,0x8e,0xbf,0x42,0x1b,0x9d,0xb7,0x98,0x20,0x8d,
+ 0x04,0x20,0xf8,0xfe,0xa2,0x8b,0x16,0x2f,0x76,0xe0,0xcc,0xd4,0x84,0x8f,0x2d,0xf3,0x8b,0x34,0xce,0x90,0x0b,0x5e,0x3b,0x46,0x34,0x4e,0xae,0x1c,0x16,0x7e,0xc5,0xc2,0xc6,0xc4,0x20,0x8d,
+ 0x04,0x20,0xf8,0xd2,0x4d,0x3d,0x09,0x65,0x80,0xd7,0x27,0xb3,0x3c,0x4d,0xfb,0xb0,0x5e,0x39,0x64,0xb1,0xea,0x66,0x8c,0x54,0xd9,0x50,0x8c,0xd8,0xcb,0x7d,0x2f,0xce,0xe1,0x74,0x20,0x8d,
+ 0x04,0x20,0xf9,0x37,0x1b,0xf1,0xee,0x98,0xb5,0x19,0xef,0x9d,0xc1,0x01,0x33,0x84,0x86,0xbb,0x47,0xd7,0xa9,0xa9,0xa7,0xd1,0x6d,0x2e,0xc8,0xd0,0xb3,0xb0,0x3f,0xae,0x6b,0x55,0x20,0x8d,
+ 0x04,0x20,0xf9,0xbd,0x57,0xe4,0xb0,0x66,0x43,0x7f,0x08,0x30,0xa6,0xbe,0x4a,0x00,0xfa,0xc3,0x45,0xa1,0xef,0xb6,0x29,0x0c,0x0e,0xd0,0x4e,0xfd,0xe1,0xfc,0x5a,0x2a,0x1c,0x93,0x20,0x8d,
+ 0x04,0x20,0xf9,0xc8,0x53,0x1a,0xd6,0x50,0x5f,0x8b,0xca,0x1c,0xd2,0x06,0xe3,0x56,0xef,0x28,0x46,0x0c,0x03,0x05,0xe5,0x4c,0x89,0x91,0xc6,0xe9,0x15,0x33,0x90,0xcc,0xc6,0xc6,0x20,0x8d,
+ 0x04,0x20,0xfb,0x17,0x3f,0x49,0x3b,0x30,0x92,0xe7,0x75,0x2f,0x2e,0x85,0x31,0x75,0xd9,0xaa,0xd2,0x8c,0xd3,0xd5,0xb6,0x85,0x2d,0x0e,0xdb,0x76,0x32,0xe6,0x10,0x0e,0x45,0xb7,0x20,0x8d,
+ 0x04,0x20,0xfb,0x5a,0xfc,0xbf,0x05,0x0c,0x21,0x97,0xb1,0x85,0x23,0x7d,0x6f,0x63,0xe6,0x8e,0xb4,0x32,0x63,0x5d,0xcd,0x62,0x0a,0xed,0x02,0x2b,0x17,0x80,0xe9,0xa5,0xb5,0xe6,0x20,0x8d,
+ 0x04,0x20,0xfb,0xf1,0x17,0xd6,0x03,0x3b,0x01,0x8b,0x98,0xcf,0x16,0x20,0xde,0xaf,0x6c,0xed,0x60,0xab,0x6e,0x14,0x0b,0x58,0x6b,0x2d,0xf8,0x06,0x98,0x37,0x7a,0xff,0x7a,0x0f,0x20,0x8d,
+ 0x04,0x20,0xfc,0x2c,0xaa,0xad,0xe8,0x5a,0xba,0x52,0x2f,0x41,0x42,0x0b,0xc6,0xca,0x6e,0xa0,0x6e,0x32,0x0e,0xe8,0x8d,0x61,0x44,0x8b,0x0f,0x9d,0xcd,0x8f,0x04,0xbe,0x1e,0x64,0x20,0x8d,
+ 0x04,0x20,0xfc,0x77,0xed,0x48,0x93,0x65,0x0d,0x98,0x99,0xf3,0x7a,0x73,0xa1,0x1b,0x2c,0xfc,0x2b,0xc6,0x9e,0xfb,0x8f,0x86,0x70,0x80,0x2a,0x47,0xef,0x2a,0xf2,0x10,0xb5,0x19,0x20,0x8d,
+ 0x04,0x20,0xfc,0x7b,0xa8,0xd7,0xa4,0x7e,0x1d,0x0e,0x35,0x1c,0x81,0xe1,0x79,0x3d,0xa5,0xc0,0x13,0x73,0x95,0x7e,0x8e,0x1b,0x6f,0x0b,0x80,0xd3,0xf5,0xf8,0xf2,0xad,0x87,0xb8,0x20,0x8d,
+ 0x04,0x20,0xfc,0x5f,0x9e,0xfb,0x72,0x34,0xcb,0x90,0x6a,0x0c,0x02,0x7e,0xb9,0x81,0x92,0xb5,0x0a,0xd6,0x0e,0xf5,0xfe,0xaa,0x28,0x2d,0xd7,0x2a,0xa4,0xc2,0xc7,0xe5,0xa0,0xd3,0x20,0x8d,
+ 0x04,0x20,0xfc,0x99,0xcd,0x29,0x50,0x95,0xac,0xff,0x02,0xe3,0x7e,0x7b,0xb9,0x48,0x85,0x0b,0x0d,0x10,0x1b,0xe4,0xbd,0x90,0x89,0x69,0x05,0x19,0xbf,0x62,0xa1,0xde,0x0d,0xdb,0x20,0x8d,
+ 0x04,0x20,0xfc,0xed,0x9c,0x1f,0x7a,0xdb,0xa7,0x3f,0xb1,0xe1,0x77,0xb1,0xd8,0x2b,0x0a,0xd9,0x28,0x6b,0x22,0x6d,0x91,0xac,0xab,0x90,0xd0,0x29,0xb9,0xda,0x6c,0x51,0xbb,0x81,0x20,0x8d,
+ 0x04,0x20,0xfd,0x80,0xa7,0xf2,0xe9,0xba,0xa4,0x68,0x90,0x8a,0xb2,0x48,0xe6,0xd1,0x7a,0x32,0x78,0xe6,0x09,0xbe,0xf9,0xb5,0x05,0x20,0x19,0x2c,0x39,0xc3,0x9a,0x08,0x9f,0x33,0x20,0x8d,
+ 0x04,0x20,0xfe,0x4c,0x57,0x10,0xc4,0x20,0xfc,0x97,0x4c,0xcc,0xa1,0x75,0x65,0x3a,0x61,0x0e,0x87,0x11,0xaa,0x8a,0xd6,0xb7,0x5d,0xb1,0xce,0x60,0xb8,0x05,0x22,0x98,0xde,0x10,0x20,0x8d,
+ 0x04,0x20,0xfe,0x56,0xa6,0xe1,0xd7,0x06,0x37,0x10,0x8c,0x3c,0x0a,0x75,0x91,0xc9,0xa0,0x32,0xc6,0xfc,0xa5,0x79,0xca,0xe2,0xcb,0x20,0xef,0x0f,0xb1,0x49,0xa9,0x79,0x82,0x8e,0x20,0x8d,
+ 0x04,0x20,0x07,0x06,0xac,0xf7,0xa7,0x90,0x48,0x5d,0x79,0x20,0xf8,0x73,0xa9,0x96,0x55,0x59,0x92,0x83,0x1b,0xbd,0x70,0x9a,0x7c,0x0a,0xf0,0xdf,0x08,0x5b,0x3e,0x99,0x34,0xcc,0x20,0x8d,
+ 0x04,0x20,0x01,0x05,0xc2,0x89,0x38,0x2c,0x7a,0x6e,0x12,0x12,0x22,0x59,0x51,0x7e,0x7b,0x22,0x27,0xe6,0x85,0xb5,0xe5,0x5d,0x76,0xe1,0x4c,0xb6,0x9d,0x16,0xea,0x4c,0x3a,0x2e,0x20,0x8d,
+ 0x04,0x20,0x01,0x77,0x4a,0xf1,0x91,0xbc,0x60,0x46,0xd3,0xc0,0xda,0x82,0x52,0x3a,0xa0,0x7b,0xfc,0xae,0x57,0x4f,0xd6,0x19,0x7a,0xf3,0x89,0xb6,0xd1,0xf9,0x64,0x06,0x13,0x2e,0x20,0x8d,
+ 0x04,0x20,0x01,0x5b,0xa8,0xaf,0x56,0x1b,0xe2,0x89,0x12,0xb8,0x3d,0xc8,0x0e,0xb6,0x21,0x2a,0xe7,0xba,0xd8,0x67,0xe8,0xa2,0x6e,0x1e,0x01,0xd0,0xb8,0x8a,0x28,0x17,0x1d,0xb7,0x20,0x8d,
+ 0x04,0x20,0x01,0x64,0x48,0x16,0x7c,0x4d,0xde,0xac,0x11,0x19,0xe0,0xbd,0x5e,0xfd,0xb7,0xb4,0xe7,0x69,0x93,0xf1,0xe5,0xc1,0x2e,0x2d,0xaa,0xa5,0xc4,0xa2,0xb7,0x8e,0x3b,0xf0,0x20,0x8d,
+ 0x04,0x20,0x01,0xec,0xa0,0x5a,0x97,0xc3,0xad,0x82,0x49,0xd5,0x9d,0x62,0x80,0x18,0xf0,0x1d,0x68,0x3f,0xaa,0x58,0xda,0xa7,0xe8,0xa4,0xea,0x10,0x07,0x22,0x97,0xb1,0x5a,0xde,0x20,0x8d,
+ 0x04,0x20,0x02,0x6d,0x2d,0xdf,0xf7,0x20,0xb8,0xa1,0xb9,0xf1,0x8a,0xd3,0x21,0xc9,0xb5,0xd1,0xa3,0x98,0x34,0xdf,0xc0,0x74,0xfd,0x31,0xfc,0x33,0x3f,0xbe,0x9d,0x78,0xd4,0x46,0x20,0x8d,
+ 0x04,0x20,0x02,0xb5,0xaf,0x5b,0x78,0xac,0xcf,0xc9,0x70,0xb2,0xe2,0x01,0xc8,0x88,0x6a,0x3a,0xb2,0xec,0x45,0x49,0x56,0xba,0xa5,0x6f,0x90,0x35,0xc8,0xe3,0x2e,0xb4,0x3b,0xbe,0x20,0x8d,
+ 0x04,0x20,0x02,0xcf,0x62,0xf4,0xf4,0x97,0x4c,0x55,0x12,0x1e,0x6c,0xa1,0x73,0xc6,0xeb,0x86,0xdb,0x73,0x92,0x34,0x2e,0x04,0x06,0x00,0xbf,0xbb,0x53,0x67,0xb4,0x97,0xa1,0x74,0x20,0x8d,
+ 0x04,0x20,0x02,0xe4,0xdc,0x08,0x18,0x82,0x0d,0x33,0xec,0x3d,0xac,0x53,0x32,0xcd,0x6e,0xb5,0xc6,0xd5,0x34,0x9c,0x83,0x1b,0x00,0x59,0x36,0xdc,0x18,0x71,0xb9,0x06,0xe4,0x9f,0x20,0x8d,
+ 0x04,0x20,0x04,0xf0,0x66,0xf9,0x74,0x12,0xc1,0xf9,0xf8,0x4e,0xc1,0x82,0x51,0xfb,0x4d,0xee,0xf6,0xa0,0x48,0xe7,0xb0,0x2b,0x40,0xa9,0x16,0xcf,0x60,0x64,0xb2,0x7d,0x6a,0x95,0x20,0x8d,
+ 0x04,0x20,0x05,0xb2,0xd0,0xac,0x42,0xe6,0x2a,0x57,0x08,0x47,0x67,0xf6,0x6b,0x1a,0x68,0x37,0xdc,0x7b,0xde,0x59,0x65,0xaf,0xd2,0xcf,0xb1,0x78,0x48,0xd7,0x69,0x1e,0x2d,0x96,0x20,0x8d,
+ 0x04,0x20,0x06,0x4b,0xbc,0xc7,0x8b,0x1c,0x7f,0xc6,0x91,0x93,0xee,0x77,0xcd,0x30,0x8b,0x8d,0x62,0x52,0xb3,0xb0,0xb7,0x21,0x7e,0x3f,0x9f,0xc9,0x5c,0xab,0x42,0x8f,0xb6,0xcd,0x20,0x8d,
+ 0x04,0x20,0x06,0x6a,0x84,0xf6,0x9e,0x01,0x88,0x4d,0x0d,0x7a,0x57,0xc8,0x7d,0x11,0x68,0x85,0x36,0x5d,0x8f,0xa6,0x58,0xf3,0x77,0x0d,0xce,0xfc,0x26,0x92,0xa1,0x58,0xf1,0x2d,0x20,0x8d,
+ 0x04,0x20,0x0e,0xd2,0x68,0x95,0xe8,0x14,0x1f,0x86,0x3b,0xda,0x90,0xcc,0x56,0x54,0xca,0xf7,0x4d,0x6e,0x7e,0x27,0x8e,0x91,0x8b,0x46,0x92,0x4e,0xa2,0x59,0x6d,0xe8,0xb5,0x8f,0x20,0x8d,
+ 0x04,0x20,0x0f,0x8a,0xb4,0x90,0x9c,0x4c,0x41,0x18,0x6b,0x77,0xe3,0xde,0xdb,0x51,0x6b,0x1c,0xe5,0x89,0x42,0xa8,0x53,0x5e,0x69,0x8e,0x9d,0x02,0x32,0xf5,0x5d,0xcc,0x51,0xab,0x20,0x8d,
+ 0x04,0x20,0x08,0x05,0x62,0x54,0xf9,0x34,0xf2,0x6b,0xd4,0x6a,0x55,0xb1,0x55,0x02,0xf2,0xbd,0x8e,0xa3,0xc2,0xc0,0xf1,0xc3,0xb1,0x56,0x88,0xca,0x64,0x83,0xd9,0x4b,0x81,0xe4,0x20,0x8d,
+ 0x04,0x20,0x08,0x06,0x92,0x85,0x28,0x18,0xd2,0xf6,0xc6,0x9f,0x69,0x18,0xc9,0x09,0x93,0x91,0xf0,0x81,0x0e,0xcc,0x62,0x79,0x31,0x13,0x5b,0xae,0xd0,0x83,0xa4,0xfd,0x9c,0xa9,0x20,0x8d,
+ 0x04,0x20,0x08,0x1f,0xd4,0x73,0x94,0xb8,0x9c,0xe6,0x01,0x4c,0xb0,0x92,0xb9,0x72,0x4f,0xb1,0xf7,0x44,0x3d,0x68,0x44,0xcb,0x2f,0x30,0xaa,0x88,0xb2,0x36,0xcb,0x02,0xd7,0xcd,0x20,0x8d,
+ 0x04,0x20,0x08,0x78,0xdd,0xdf,0x74,0x00,0x8a,0x31,0xf1,0xdf,0x6f,0xae,0xb3,0x39,0x8d,0x74,0xe7,0xdd,0xed,0x49,0x48,0xe2,0x96,0xbd,0xde,0x7c,0xc2,0x83,0x3c,0x9d,0x3e,0xbc,0x20,0x8d,
+ 0x04,0x20,0x08,0x4b,0xf9,0xc2,0x01,0x33,0x55,0xd5,0x02,0x7e,0x5c,0xee,0x95,0x82,0xe4,0x8d,0x20,0x4c,0x61,0xd5,0x0d,0xe4,0x2d,0x84,0x14,0x12,0x41,0x1f,0x80,0x91,0x5c,0x3c,0x20,0x8d,
+ 0x04,0x20,0x08,0xe2,0xce,0xc2,0xf4,0x75,0xfe,0xa9,0x50,0x2d,0x65,0x88,0xe7,0x4e,0x97,0x38,0x79,0x5d,0xc1,0xf5,0x7f,0xca,0xa5,0x58,0x03,0x05,0x73,0x0a,0x9b,0x0f,0xa4,0xf0,0x20,0x8d,
+ 0x04,0x20,0x09,0x90,0xcc,0xf3,0xf1,0x84,0x3c,0xd8,0xff,0x19,0x48,0x28,0x28,0xdf,0x8b,0x59,0x43,0x38,0xe2,0x6e,0x75,0xd4,0xfc,0x77,0xee,0x52,0x4f,0x40,0xe7,0xca,0x15,0xd6,0x20,0x8d,
+ 0x04,0x20,0x0a,0x1f,0x23,0xba,0xdc,0x6e,0xa8,0x73,0x14,0x3f,0x66,0x3a,0x31,0xb0,0x90,0x6e,0xf1,0x2b,0x9a,0x72,0x2d,0x97,0x97,0xeb,0x07,0x81,0xbc,0x4b,0xff,0x3f,0x35,0x32,0x20,0x8d,
+ 0x04,0x20,0x0a,0xca,0xf8,0x55,0x82,0x41,0x15,0x39,0x43,0x38,0xe7,0x83,0x22,0x71,0x99,0xc5,0xdf,0x20,0xec,0x79,0xe6,0x7f,0x67,0xba,0x85,0x4c,0x78,0x3d,0xce,0xb9,0x41,0xa6,0x20,0x8d,
+ 0x04,0x20,0x0b,0xa7,0x72,0x57,0xd5,0x27,0xe9,0x23,0x8e,0xc3,0x50,0x4d,0x24,0x64,0x3d,0x57,0x68,0x67,0x64,0xb2,0x9f,0x2f,0xd7,0xce,0x40,0x9e,0xd9,0x46,0xc7,0xa4,0xc4,0x2f,0x20,0x8d,
+ 0x04,0x20,0x0c,0x56,0x04,0xd0,0x44,0xf9,0x48,0x73,0x03,0x78,0xd1,0x61,0xfe,0xc6,0xcc,0xf6,0xc8,0x2a,0xb7,0x07,0xd9,0x2b,0x2c,0x0f,0x00,0x3f,0xb4,0x3e,0xdf,0xec,0xce,0x59,0x20,0x8d,
+ 0x04,0x20,0x0c,0xb3,0x86,0xc8,0xc4,0xc9,0x3e,0xce,0xad,0x4d,0x40,0x4c,0x46,0xe7,0xb1,0x5f,0x32,0x22,0x91,0x7f,0x5b,0x93,0x72,0x79,0x3c,0xc7,0x80,0x41,0x16,0x73,0x2c,0xdd,0x20,0x8d,
+ 0x04,0x20,0x0d,0x34,0x17,0x93,0x74,0x16,0x2d,0x2f,0x14,0x39,0x22,0x80,0x36,0x84,0xa3,0xba,0x61,0xcc,0xee,0x70,0xbc,0x8c,0xf6,0xd5,0x9b,0xf3,0x4b,0xd9,0x92,0x5b,0xa6,0xfe,0x20,0x8d,
+ 0x04,0x20,0x0d,0x37,0x73,0x31,0x21,0x9a,0x8a,0xa5,0x75,0x30,0xc6,0xc4,0xa1,0xa2,0xb6,0x29,0xa8,0x52,0x15,0xe2,0xe6,0xf0,0x2c,0xcb,0x2f,0x8a,0x0c,0x66,0xaa,0x41,0x20,0x1f,0x20,0x8d,
+ 0x04,0x20,0x0d,0xfd,0x9f,0x1d,0x4a,0xa7,0x55,0x28,0x43,0xde,0x2d,0x21,0x13,0x1c,0x20,0xcf,0x02,0xab,0x6a,0x14,0xe5,0x11,0x5e,0x42,0xe0,0x49,0x59,0x06,0xc4,0xa4,0x4c,0xd8,0x20,0x8d,
+ 0x04,0x20,0x0e,0x43,0xfe,0x51,0xb2,0x35,0xe9,0x5d,0xda,0x2a,0x4e,0x48,0x4e,0x36,0xe4,0xfa,0x9a,0xc2,0xf3,0x80,0xdc,0xc3,0x69,0x17,0xab,0x4d,0x4a,0x24,0x7c,0xe9,0x40,0xd8,0x20,0x8d,
+ 0x04,0x20,0x0e,0x5b,0x60,0x33,0x7f,0xa1,0xde,0x4a,0x38,0x62,0x9e,0x9e,0xfb,0xa9,0xc4,0xe1,0xfd,0x79,0x6f,0xf5,0x48,0x7d,0xc1,0x3c,0x3a,0xd0,0x10,0x02,0x9f,0xfd,0xa8,0x03,0x20,0x8d,
+ 0x04,0x20,0x17,0xb9,0x71,0x0a,0x62,0xbf,0xc0,0x45,0xa7,0xb8,0xc6,0xa5,0x70,0x7d,0x28,0x6b,0xd1,0xfb,0x64,0xf9,0xcd,0x47,0x81,0xc7,0xa0,0x82,0xd7,0x9a,0x68,0xb9,0x35,0x0a,0x20,0x8d,
+ 0x04,0x20,0x17,0x8a,0xe5,0x69,0xa6,0xee,0x76,0x9a,0xab,0x61,0x0d,0x12,0xd7,0xc6,0x5a,0x12,0xf4,0x79,0xac,0xaf,0x3c,0xfa,0x71,0x92,0x67,0x6a,0x94,0x5c,0x14,0xe6,0xf5,0x91,0x20,0x8d,
+ 0x04,0x20,0x17,0x95,0xb4,0x73,0x5c,0xee,0x3c,0x77,0x36,0x32,0xb9,0x44,0xcd,0x2f,0xa6,0x13,0x5b,0xd8,0xac,0x40,0x9d,0xf3,0x8c,0x50,0x25,0xda,0xa8,0x13,0xe4,0x75,0x35,0xdc,0x20,0x8d,
+ 0x04,0x20,0x10,0x4c,0xf1,0xdd,0xd1,0x21,0x34,0x43,0x73,0x77,0x60,0xf9,0x2c,0xb8,0x00,0xb4,0xa6,0x1b,0xc2,0xae,0xea,0x83,0xad,0xab,0x1d,0x09,0x33,0xa7,0xc3,0xfd,0x57,0xea,0x20,0x8d,
+ 0x04,0x20,0x10,0x5b,0x4b,0xd1,0xf0,0x82,0xf9,0xab,0x10,0xb9,0x93,0xd2,0x4e,0xda,0x0a,0x00,0x28,0xad,0x31,0x5e,0x7c,0xe0,0x1f,0x28,0xeb,0x27,0x39,0xb0,0x4e,0x72,0x03,0x5b,0x20,0x8d,
+ 0x04,0x20,0x10,0xac,0x79,0x2d,0x92,0x34,0x96,0x09,0x8f,0x1b,0xfc,0xe5,0x06,0xff,0xae,0x4d,0xe7,0x62,0x1b,0x60,0xf7,0x9e,0x75,0xdd,0x9c,0x77,0xe5,0xb3,0x78,0x38,0x4f,0x2f,0x20,0x8d,
+ 0x04,0x20,0x10,0xad,0x47,0xb2,0x8f,0xff,0xa1,0x04,0xb2,0x79,0xa2,0x2b,0xb3,0xbd,0x1b,0xa7,0xc0,0xa8,0x4c,0x9b,0x1f,0xad,0x9a,0x54,0x84,0xec,0x9e,0x4e,0x2c,0x43,0xc9,0x16,0x20,0x8d,
+ 0x04,0x20,0x11,0x4c,0xe2,0x7b,0x43,0xff,0x9a,0xde,0x78,0xfa,0x1b,0xff,0x49,0xf1,0xc8,0x30,0x77,0xd5,0x29,0xe7,0x47,0x4c,0x7c,0xb7,0xe7,0x64,0xae,0xbc,0x76,0x05,0x42,0x56,0x20,0x8d,
+ 0x04,0x20,0x14,0x43,0x0a,0x6d,0xb2,0xa0,0x0d,0xfc,0x6c,0xb3,0xc6,0xa5,0xa7,0x79,0x47,0x35,0xd7,0xc5,0x76,0xc5,0x0b,0x7c,0xc3,0x53,0x1a,0x55,0x46,0x1c,0x06,0xb3,0x0c,0x32,0x20,0x8d,
+ 0x04,0x20,0x14,0x60,0x4e,0x8d,0x1d,0x7d,0x15,0xa2,0x1d,0x28,0xb6,0xa3,0x4a,0x40,0x10,0x61,0x0a,0x2f,0x1e,0xd1,0xc3,0xba,0x27,0xa0,0x58,0xc0,0xd5,0x72,0x28,0x61,0xcb,0x5d,0x20,0x8d,
+ 0x04,0x20,0x14,0xf4,0x89,0x7f,0xe6,0xc4,0x08,0x25,0x3e,0x14,0xda,0x8e,0x3a,0xe6,0xb0,0xe8,0x59,0xb1,0x3a,0xc8,0xba,0x2e,0x35,0x98,0x03,0x01,0x55,0x51,0xe4,0x95,0x45,0xb1,0x20,0x8d,
+ 0x04,0x20,0x14,0xe6,0xef,0xed,0x0e,0x15,0x4c,0x95,0x46,0x9e,0x45,0xbd,0xa0,0x78,0xf1,0x27,0x17,0x40,0xc3,0x4a,0x5d,0x28,0xfc,0x13,0x43,0x6b,0xf9,0x10,0x5e,0x3a,0xa4,0x4d,0x20,0x8d,
+ 0x04,0x20,0x16,0x39,0x49,0xe0,0x6c,0x0d,0x64,0xfc,0x94,0x39,0xd5,0x46,0xbc,0xd2,0x97,0x56,0x31,0x93,0xa6,0x94,0x64,0x41,0xf5,0x2d,0x5e,0x72,0x50,0xf9,0xd7,0xf8,0xf0,0xa8,0x20,0x8d,
+ 0x04,0x20,0x1e,0x98,0xb3,0xb9,0x89,0x0c,0x13,0x7a,0xf9,0x8d,0xf5,0xef,0xbb,0xa2,0x3d,0xbf,0x7a,0x98,0xb2,0xfb,0xfb,0xf3,0xa9,0x59,0x9d,0x66,0xc1,0x11,0x4d,0xf3,0xfb,0x75,0x20,0x8d,
+ 0x04,0x20,0x1f,0x00,0x23,0x5d,0xd2,0xce,0x19,0x64,0xc5,0x29,0x16,0x04,0xb3,0xcf,0x59,0xcc,0x39,0xf7,0xb9,0x87,0x05,0x64,0x02,0xdd,0x04,0x8d,0x48,0x98,0x63,0x28,0x78,0xfb,0x20,0x8d,
+ 0x04,0x20,0x1f,0x04,0xb1,0x3f,0x2b,0xf7,0x9d,0x66,0x7e,0x7b,0x7b,0x3e,0x2c,0x87,0xf9,0xc9,0xa5,0x02,0x15,0xe3,0x3f,0x5e,0xb8,0xb4,0xb8,0x78,0x41,0xf2,0xe9,0x88,0x51,0x6b,0x20,0x8d,
+ 0x04,0x20,0x1f,0x12,0xd4,0x33,0xce,0x97,0xc3,0x23,0xc5,0x26,0x79,0x48,0x29,0x1b,0x88,0xd1,0xb7,0x59,0xf0,0x19,0xc0,0xa5,0x2a,0x40,0x07,0x45,0x1f,0x21,0xfc,0xf6,0x9a,0x5e,0x20,0x8d,
+ 0x04,0x20,0x1f,0x64,0x3f,0x61,0x14,0xb4,0xfb,0x19,0xcb,0xd7,0x31,0xf1,0x64,0x1c,0xd7,0x78,0x4a,0x83,0xfe,0x22,0x8d,0x75,0x40,0xcf,0xa6,0x3f,0x9a,0x5f,0x7c,0x65,0xbc,0x3a,0x20,0x8d,
+ 0x04,0x20,0x1f,0xdb,0x25,0xc0,0x99,0xd2,0xb9,0x13,0xd6,0xe1,0x36,0x95,0x72,0x0d,0x79,0xc3,0xb1,0x3d,0x1b,0x6d,0xa9,0x16,0x26,0xa3,0x06,0xfd,0xe8,0x2d,0x15,0x03,0x99,0xa5,0x20,0x8d,
+ 0x04,0x20,0x18,0x18,0x43,0x64,0x4e,0x30,0xdf,0xd5,0xd7,0x0f,0x46,0x3a,0xfe,0x95,0xde,0x59,0x5c,0xce,0xcb,0x85,0xad,0x2c,0x0d,0x59,0x2b,0x66,0x84,0xc9,0x34,0xe7,0x78,0x80,0x20,0x8d,
+ 0x04,0x20,0x18,0x7a,0x09,0xcb,0x17,0xdb,0x7d,0xb1,0xe0,0x5d,0xa3,0xe8,0x9a,0x32,0x4f,0xd0,0x7a,0x94,0x1c,0x05,0xbb,0xed,0xc9,0xbf,0x8a,0xe3,0xda,0xb6,0x04,0x07,0x42,0xd0,0x20,0x8d,
+ 0x04,0x20,0x19,0x89,0x98,0x9f,0x6a,0x28,0x9a,0x69,0x56,0x85,0xbf,0x57,0x17,0xf9,0xae,0x18,0xa4,0x7c,0x68,0xb2,0xdd,0xb8,0xb9,0x81,0x76,0x9e,0x89,0x38,0xf2,0x15,0xae,0x17,0x20,0x8d,
+ 0x04,0x20,0x19,0xd0,0xf5,0x70,0xfd,0xbc,0x80,0xdd,0x25,0x29,0x28,0x91,0xa7,0xad,0x2d,0xc6,0x36,0x87,0xef,0x93,0x65,0x33,0x89,0xea,0x27,0xfe,0x56,0xc2,0x67,0x23,0x14,0x09,0x20,0x8d,
+ 0x04,0x20,0x1a,0x49,0xb6,0xba,0xab,0x76,0x59,0xd1,0x11,0x58,0xf3,0x5e,0x19,0xfe,0x09,0x69,0x78,0x46,0x51,0x1e,0x2f,0x30,0x6b,0x14,0xe7,0xc7,0x7e,0x31,0xa8,0x12,0xae,0x3f,0x20,0x8d,
+ 0x04,0x20,0x1b,0x51,0xa8,0xa6,0xb0,0x27,0x76,0x67,0xb0,0x71,0xde,0x14,0x76,0xca,0x88,0x90,0x93,0x8f,0x77,0xa9,0xf2,0x23,0xde,0xd0,0x86,0x19,0x90,0xe3,0x2a,0xd9,0xf8,0x86,0x20,0x8d,
+ 0x04,0x20,0x1b,0x71,0x5c,0x1a,0x1a,0x1b,0x2a,0x4a,0xe7,0xc0,0x48,0x8b,0xb0,0x48,0x7b,0x1f,0x45,0x06,0x3c,0x95,0x77,0x39,0x0c,0x4f,0x6a,0x67,0x7e,0xdc,0x4b,0x13,0xff,0x62,0x20,0x8d,
+ 0x04,0x20,0x1c,0x00,0x4c,0x1c,0xbd,0xaf,0x39,0xfd,0x0f,0x06,0x00,0x62,0x01,0x2f,0x2d,0x29,0xe7,0x8c,0x4e,0xd8,0xe1,0xc7,0x58,0xa6,0x00,0x8d,0x90,0x9f,0xc2,0x9b,0xff,0x64,0x20,0x8d,
+ 0x04,0x20,0x1d,0x12,0x22,0x94,0x19,0x1c,0xe6,0x4b,0x4b,0xe1,0x24,0x5b,0x4a,0xfe,0xc4,0x75,0xf6,0x09,0x29,0x6d,0xb5,0x33,0x09,0x0d,0xd8,0xcc,0x2f,0x8d,0xad,0xc6,0x2d,0x1f,0x20,0x8d,
+ 0x04,0x20,0x1d,0x78,0x39,0xe7,0xb9,0xa6,0xe6,0x4d,0x9b,0x42,0x14,0x73,0xb6,0xc4,0xc2,0x2e,0x5d,0x98,0x12,0x46,0x61,0xa6,0x1e,0x81,0xd9,0x3a,0x8c,0xe6,0xc2,0xc6,0xd8,0xd0,0x20,0x8d,
+ 0x04,0x20,0x1d,0x73,0x6c,0x06,0x2a,0x16,0x1b,0x92,0xa4,0xdc,0x4b,0xc4,0xa9,0xf5,0x54,0x69,0x87,0xc6,0xca,0x01,0xb6,0x17,0x23,0x85,0x64,0x95,0x2d,0x92,0xae,0xae,0x13,0x39,0x20,0x8d,
+ 0x04,0x20,0x1d,0xd4,0xac,0x4e,0x01,0xaa,0xf8,0x73,0xd8,0xfd,0x47,0xa9,0xff,0xc6,0xfa,0x8a,0x90,0x20,0x53,0xc3,0xc6,0x0d,0x3f,0x5c,0x96,0x36,0x36,0x07,0x85,0xcb,0xb7,0xad,0x20,0x8d,
+ 0x04,0x20,0x1e,0x4e,0x78,0x3c,0x93,0xae,0x21,0xd3,0x7a,0xe7,0x36,0x3e,0x65,0x52,0xc4,0xc6,0xb6,0x39,0x3b,0xd2,0x17,0xd2,0x1e,0xa2,0x2b,0x11,0x65,0xf1,0x04,0xa0,0x20,0xb6,0x20,0x8d,
+ 0x04,0x20,0x26,0xbc,0x0e,0x05,0xf7,0x42,0x68,0x7e,0x35,0x84,0x83,0x3a,0x6f,0x0f,0x48,0x8f,0x8f,0xa1,0x5b,0x16,0xfa,0x3e,0xd8,0xba,0xf8,0xfc,0xb9,0x87,0x68,0x8e,0x37,0x2b,0x20,0x8d,
+ 0x04,0x20,0x27,0x0e,0x30,0x39,0x8c,0x63,0x39,0x8f,0x43,0xda,0x37,0x53,0x53,0xf9,0x93,0x13,0xa7,0xba,0x9e,0x09,0xe6,0xac,0xc7,0x3d,0x9b,0xd0,0x69,0xb2,0x4e,0x23,0x77,0x6a,0x20,0x8d,
+ 0x04,0x20,0x27,0x59,0x90,0xe4,0x75,0x7b,0x4d,0x74,0xa8,0x25,0x87,0xfc,0x71,0xbc,0xb3,0x46,0xec,0x88,0xda,0x04,0xcd,0x0d,0x00,0x2a,0x4f,0x88,0xc5,0x30,0xed,0xfb,0xa3,0x6d,0x20,0x8d,
+ 0x04,0x20,0x20,0x21,0x7c,0x51,0x38,0x64,0x33,0x60,0x33,0x05,0xec,0x26,0x10,0xb6,0xb2,0x9d,0x39,0x23,0x6c,0x35,0xed,0x18,0xf5,0x66,0xe9,0x0c,0x81,0x70,0x33,0x25,0xa7,0xae,0x20,0x8d,
+ 0x04,0x20,0x20,0xaf,0xc7,0x97,0xe6,0xb0,0xde,0xb5,0x80,0xbb,0x96,0x7c,0xd9,0x10,0x3c,0xd3,0x92,0x67,0xec,0x53,0x77,0x6e,0xee,0xa7,0xd5,0x6f,0xc0,0x5a,0x72,0x4f,0x10,0xa8,0x20,0x8d,
+ 0x04,0x20,0x20,0xf8,0x86,0x43,0x9c,0xe2,0x17,0xd7,0xbf,0xa6,0x54,0xb7,0x84,0x30,0xc7,0xda,0x7f,0x5d,0xd4,0xff,0x86,0x07,0x9c,0x65,0x52,0xad,0x75,0xad,0x10,0x34,0x1b,0xb1,0x20,0x8d,
+ 0x04,0x20,0x21,0xc9,0x06,0x3a,0x42,0xce,0x93,0x00,0x7b,0x61,0xe7,0xf5,0xde,0xbd,0x4a,0x6a,0xfd,0xde,0xdd,0x49,0x09,0xac,0x77,0x92,0x88,0x8e,0x0b,0x14,0xf8,0xea,0x2f,0x2b,0x20,0x8d,
+ 0x04,0x20,0x22,0x31,0x6a,0x5c,0xfa,0x3d,0x8e,0xad,0x40,0x0b,0x2d,0x61,0x32,0xd5,0x3c,0x5a,0x68,0x4c,0xed,0xda,0x1f,0x06,0x48,0x31,0xd6,0x00,0x44,0x8e,0x3b,0x64,0xab,0x0c,0x20,0x8d,
+ 0x04,0x20,0x22,0x4c,0x42,0x2d,0x8c,0xf6,0xb0,0x64,0x7a,0x34,0xc3,0x55,0x99,0xf6,0x71,0x3f,0xf1,0x2d,0x0a,0x46,0xaa,0xaf,0x91,0x4f,0x90,0x7c,0xd7,0x68,0x08,0x6d,0x7c,0x11,0x20,0x8d,
+ 0x04,0x20,0x22,0x63,0x85,0x60,0x89,0x55,0x3a,0x35,0xb2,0x99,0xf3,0x9b,0xa7,0xa3,0xf8,0x92,0x4d,0xe1,0x75,0xf4,0xa3,0xac,0xd0,0xe2,0x76,0x64,0x3e,0xca,0xdb,0xd7,0xc4,0x03,0x20,0x8d,
+ 0x04,0x20,0x23,0x45,0xc8,0x5d,0xd8,0x70,0x1f,0xd6,0x8e,0x3f,0x1d,0x09,0x56,0x24,0xf5,0xd6,0x44,0xf7,0x47,0x62,0xdf,0x3f,0xdd,0x6f,0x00,0x2b,0xbc,0x29,0xf2,0x79,0x4f,0x3b,0x20,0x8d,
+ 0x04,0x20,0x24,0xf4,0x92,0xf9,0xa4,0x51,0x19,0xbb,0xf7,0x73,0xc6,0x44,0x72,0x41,0xdf,0x04,0x7f,0xbb,0x1b,0x81,0xc6,0xe8,0x2a,0xe7,0x09,0x2a,0xd1,0x45,0xff,0x7d,0xf8,0x88,0x20,0x8d,
+ 0x04,0x20,0x24,0xc1,0xdf,0x81,0x6a,0x9b,0x39,0x93,0xd4,0xfb,0x05,0x5d,0x1d,0x27,0xa7,0x09,0xc6,0x02,0x2c,0x3b,0x8f,0xd3,0x8d,0x1d,0x0f,0x88,0x0a,0x59,0x61,0xfe,0x0e,0x5d,0x20,0x8d,
+ 0x04,0x20,0x24,0xc4,0x00,0xe1,0x96,0xa3,0x54,0xaa,0xb6,0xfc,0x2d,0x8c,0x71,0x73,0xf0,0x2e,0xa0,0x5e,0x22,0xfb,0x4c,0xf2,0x53,0xbf,0x86,0x71,0xf0,0x71,0x0d,0x01,0x37,0xa4,0x20,0x8d,
+ 0x04,0x20,0x24,0xd3,0xab,0x6f,0x21,0xc7,0xce,0x50,0x2c,0x78,0xdf,0x07,0x2a,0x4e,0x75,0x4c,0xd0,0xcc,0x58,0xf5,0x82,0x51,0x35,0x6e,0xdf,0xed,0x0a,0xf8,0xca,0x04,0xe7,0xeb,0x20,0x8d,
+ 0x04,0x20,0x28,0x69,0x50,0xb3,0x8a,0x22,0x83,0xbb,0x64,0x9e,0xbb,0x84,0x80,0xa5,0x57,0x6a,0xb0,0x9d,0x77,0xee,0x9f,0x87,0xdd,0x6f,0x9a,0x0e,0x6b,0x59,0x72,0x99,0x56,0xb0,0x20,0x8d,
+ 0x04,0x20,0x2a,0x0d,0xf9,0xdd,0xcb,0x2e,0xe6,0x78,0xb8,0x93,0x54,0x65,0xac,0x84,0xe4,0xaf,0x3d,0x18,0x6a,0x03,0xff,0x73,0x1f,0xbc,0x6d,0x61,0x2c,0x66,0x99,0x82,0x91,0x29,0x20,0x8d,
+ 0x04,0x20,0x2a,0xcc,0x41,0xe0,0xec,0x74,0x58,0x3c,0x46,0xf0,0x98,0x31,0x9f,0x75,0x4f,0x61,0xad,0xc0,0xb0,0xcf,0x8f,0xa5,0x32,0x1b,0x91,0xf9,0xd2,0x8b,0xb5,0x2e,0xb0,0xc0,0x20,0x8d,
+ 0x04,0x20,0x2a,0xd0,0xe7,0x67,0xea,0x87,0x96,0x9f,0x12,0x5c,0xea,0x4d,0xbd,0x37,0xde,0x4c,0x3c,0xcc,0x2d,0x10,0x0b,0x72,0x6d,0x23,0x14,0x95,0x1b,0xd1,0xcf,0xb3,0xc5,0xcd,0x20,0x8d,
+ 0x04,0x20,0x2d,0xb0,0xa1,0x7d,0xd6,0xf2,0x38,0xed,0x33,0xf5,0xc1,0x98,0x62,0x8d,0x44,0xae,0x21,0x5b,0x68,0xd2,0x78,0xcb,0xe5,0xde,0x25,0x38,0xc8,0xc0,0x2c,0x3b,0xe0,0xc2,0x20,0x8d,
+ 0x04,0x20,0x36,0xe3,0x9a,0x1a,0x7c,0x0f,0x23,0x5d,0x62,0x1a,0xf7,0x92,0x40,0x61,0x55,0x0d,0x7f,0xe6,0xb6,0x08,0xf7,0xf7,0xd6,0x98,0xee,0xa8,0xa4,0xda,0xe2,0x16,0x61,0x5d,0x20,0x8d,
+ 0x04,0x20,0x37,0x1c,0x98,0x83,0x68,0x6b,0x38,0xbd,0x75,0xff,0xca,0xf5,0xed,0xd7,0x3a,0x5e,0x75,0x0a,0x16,0xd3,0x4d,0x96,0x43,0xdb,0x25,0x2a,0x37,0x52,0xc6,0x84,0x2e,0x94,0x20,0x8d,
+ 0x04,0x20,0x37,0x43,0x20,0x60,0x5b,0xbe,0xb6,0x55,0x2a,0x52,0x7c,0xd8,0xb5,0xd3,0x50,0x6f,0x14,0x6f,0xa5,0x4f,0x12,0xf8,0x5b,0xf4,0x83,0x48,0x48,0x27,0x27,0x0c,0x45,0x14,0x20,0x8d,
+ 0x04,0x20,0x37,0x63,0xaa,0x0c,0x1e,0xb1,0xe4,0x69,0x7b,0xb8,0x2f,0xeb,0xfc,0x3a,0x0c,0x83,0x94,0x15,0x41,0x16,0xa9,0xac,0x94,0x18,0x89,0xf7,0x31,0x25,0x2b,0x72,0x52,0xc9,0x20,0x8d,
+ 0x04,0x20,0x37,0x69,0x4a,0xa0,0x66,0x55,0x46,0x5d,0x09,0x8e,0x22,0x8c,0x6c,0x85,0x05,0xc8,0x5c,0x93,0xfc,0x6d,0xff,0x49,0xfe,0xe3,0xf5,0xd2,0x0d,0xd4,0x95,0x6a,0xc2,0x99,0x20,0x8d,
+ 0x04,0x20,0x37,0xec,0xd7,0x65,0xa3,0x8a,0x24,0x1a,0x53,0xde,0xe5,0xf2,0x1b,0x5b,0x34,0xa2,0x3e,0x1e,0xdd,0x54,0xc9,0x49,0x6d,0xdd,0x85,0x62,0xc7,0xdc,0x5b,0xd8,0x7c,0xad,0x20,0x8d,
+ 0x04,0x20,0x31,0x7d,0x5c,0x40,0x99,0x74,0xb5,0x2e,0xe9,0x57,0xb6,0x76,0x89,0xbd,0x80,0xed,0x9a,0x1f,0x6d,0xcb,0xfc,0x0d,0xb5,0x52,0xd7,0x37,0x77,0xf9,0x11,0x33,0xa7,0x52,0x20,0x8d,
+ 0x04,0x20,0x31,0x5d,0x02,0xb7,0x95,0x5b,0x72,0xae,0x38,0x51,0xb1,0x0d,0x08,0x99,0x99,0x61,0x62,0x8b,0x47,0x26,0x6d,0xfe,0x91,0xbd,0x0d,0x82,0xb0,0x14,0x0e,0x78,0x9f,0xd4,0x20,0x8d,
+ 0x04,0x20,0x32,0x8d,0x41,0xec,0x0b,0x85,0xbf,0x58,0x62,0xd3,0x05,0xa5,0x29,0x3a,0xac,0xaa,0x8f,0x25,0xc2,0x3c,0xb9,0x1b,0x16,0x44,0xde,0x73,0x3c,0x85,0xa6,0x81,0xeb,0xb4,0x20,0x8d,
+ 0x04,0x20,0x32,0xaa,0x63,0x18,0xbd,0x35,0x20,0x2c,0x1b,0x16,0x59,0x1a,0xc2,0x75,0x8b,0xf8,0xcd,0x35,0x3d,0x2c,0x0c,0xc8,0xc9,0x05,0x76,0x19,0x2f,0xe4,0xd7,0xaa,0xab,0xc5,0x20,0x8d,
+ 0x04,0x20,0x32,0xdf,0xdc,0xef,0xc9,0xa6,0x79,0x92,0x9f,0xf3,0x75,0x13,0xd9,0x84,0x47,0x7c,0x44,0x50,0x8d,0xf3,0x19,0xc4,0x8f,0xc8,0xf8,0xc2,0x18,0x3f,0x04,0x29,0x58,0x90,0x20,0x8d,
+ 0x04,0x20,0x33,0xa6,0x95,0x65,0x35,0xa3,0x78,0xfd,0x92,0x60,0x2e,0xf6,0xfd,0x7a,0xab,0xb4,0xd8,0xb1,0x13,0x13,0xc6,0x1b,0x20,0x99,0x0a,0x68,0x79,0x38,0x83,0x72,0x6a,0xf5,0x20,0x8d,
+ 0x04,0x20,0x33,0xe6,0x2c,0x65,0x2a,0x86,0x67,0xdf,0x47,0x80,0xe6,0xc9,0x13,0x22,0xe8,0x5a,0x4e,0x40,0xe3,0xbb,0x9f,0x6f,0x30,0xfc,0x62,0x85,0xfc,0x72,0xa9,0xf3,0xe9,0x7d,0x20,0x8d,
+ 0x04,0x20,0x33,0xf3,0x67,0xe5,0x06,0x2c,0x4e,0xac,0x1c,0x5b,0x5f,0x64,0xb5,0xbb,0x5c,0x1d,0x2e,0x0f,0x3a,0x92,0x6a,0xba,0xe8,0xf3,0x89,0x94,0x66,0x34,0xeb,0x83,0x94,0xdc,0x20,0x8d,
+ 0x04,0x20,0x34,0x05,0x09,0x3f,0xca,0x98,0x18,0xad,0x58,0x03,0xfc,0xb1,0xa8,0x53,0x12,0xba,0x2a,0x6a,0x6c,0xc9,0xba,0x27,0x7f,0xaa,0x2f,0xb1,0xa4,0x7d,0xfc,0x52,0x5a,0xef,0x20,0x8d,
+ 0x04,0x20,0x34,0x55,0x1a,0x64,0x20,0xe7,0x22,0xce,0xb3,0x86,0x56,0x08,0x94,0xb7,0x7d,0xb5,0xc2,0xbb,0xba,0x5c,0x08,0x35,0x59,0x23,0xe3,0x1e,0x53,0x40,0xf3,0x78,0x1b,0x62,0x20,0x8d,
+ 0x04,0x20,0x35,0xf6,0x79,0x62,0xe5,0xd2,0x72,0xd4,0x1c,0xcf,0x8c,0xd4,0x03,0x41,0x2d,0x7d,0x84,0xfe,0x1d,0x7c,0x57,0x54,0x32,0x77,0xa6,0x76,0xab,0x32,0x8b,0x27,0xd4,0xf5,0x20,0x8d,
+ 0x04,0x20,0x36,0x66,0x4d,0x9f,0xf7,0xec,0x13,0x91,0x87,0x08,0x0c,0x5f,0x12,0x97,0x25,0xd3,0x32,0xc3,0xb1,0x47,0xce,0x19,0x0f,0xe6,0x5c,0x54,0x8d,0x69,0x4c,0x77,0x98,0xdf,0x20,0x8d,
+ 0x04,0x20,0x3f,0xd4,0x58,0x1b,0xcb,0x2f,0xeb,0xd1,0xe2,0xd2,0xb0,0xf2,0xa0,0x68,0x84,0x78,0xf0,0x88,0x22,0x20,0xf3,0x00,0xc4,0xf9,0x7f,0x88,0x33,0x4b,0x91,0x2b,0x93,0xdc,0x20,0x8d,
+ 0x04,0x20,0x3f,0xe2,0xe8,0xcb,0xb9,0x41,0xce,0x63,0x8b,0x13,0x8f,0x96,0x7f,0xd8,0xcc,0x43,0x80,0x79,0xe8,0x34,0x0c,0x97,0x25,0x23,0x8e,0xdb,0x41,0x2e,0x2d,0xb0,0xb4,0x38,0x20,0x8d,
+ 0x04,0x20,0x38,0x0c,0xa1,0xe8,0xd0,0xdd,0x7c,0x0e,0x69,0x71,0x02,0xc2,0xf6,0x1d,0xe2,0x4a,0x56,0x62,0xc3,0xcb,0x20,0xc8,0x62,0x6c,0x01,0x2b,0xed,0x54,0xf5,0x6d,0xfe,0x07,0x20,0x8d,
+ 0x04,0x20,0x38,0x15,0x46,0x7f,0x14,0xc7,0x20,0xf4,0xe6,0x9f,0x16,0x70,0xbe,0xa7,0x4d,0x6a,0xd1,0xd6,0x5b,0x65,0xbe,0x8b,0x74,0x8a,0xc5,0x4c,0xb6,0x68,0xf6,0xaa,0x32,0xe2,0x20,0x8d,
+ 0x04,0x20,0x38,0x94,0x67,0xfc,0x12,0xd2,0x88,0xf3,0xb9,0xd2,0x74,0x09,0xcd,0x57,0x48,0x0c,0xfa,0xed,0xa8,0xc9,0x26,0x22,0x61,0x05,0x0f,0x42,0xee,0xda,0x1e,0x11,0x3d,0xd8,0x20,0x8d,
+ 0x04,0x20,0x39,0xbd,0x2c,0x5f,0x8e,0xc5,0x62,0x28,0x82,0xf8,0x9c,0x30,0xc4,0xe8,0x2b,0x69,0x9f,0x64,0xa3,0xb1,0x39,0x42,0x96,0x99,0x6e,0xfc,0xeb,0x92,0xbd,0x82,0xec,0x9c,0x20,0x8d,
+ 0x04,0x20,0x39,0xfa,0x3f,0x19,0x20,0xd6,0xce,0xbb,0x32,0x71,0x7b,0x2c,0x11,0xff,0x2d,0xd7,0xbd,0x98,0xbb,0x9b,0x3e,0x6e,0x97,0xd8,0x1a,0xdb,0xf9,0x76,0xc3,0xdc,0xb2,0x02,0x20,0x8d,
+ 0x04,0x20,0x3a,0x02,0x60,0xcf,0xde,0x38,0x79,0x3a,0xb0,0xea,0x66,0x33,0x65,0xdd,0x11,0x1b,0x1e,0xa3,0x68,0x00,0xe7,0xaf,0x96,0xb6,0x56,0xb4,0xa9,0x8d,0xdb,0x85,0x72,0x27,0x20,0x8d,
+ 0x04,0x20,0x3a,0xf4,0x57,0x45,0xb6,0x84,0x88,0x25,0x19,0x4a,0x83,0xef,0xa8,0xea,0x3a,0xd3,0x65,0x31,0x9b,0x9d,0x03,0x31,0x35,0x15,0x45,0x28,0x8c,0xd5,0x9b,0x00,0xc6,0x1c,0x20,0x8d,
+ 0x04,0x20,0x3a,0xfb,0x9e,0xf9,0x77,0xfe,0x71,0x0e,0xe6,0xd0,0xc7,0xcf,0x3b,0x7a,0xdf,0x92,0x82,0x1d,0xac,0xd1,0x4e,0xc6,0x65,0xa7,0x9e,0x1e,0x1b,0x2c,0x19,0xa2,0x97,0xf6,0x20,0x8d,
+ 0x04,0x20,0x3a,0xd0,0xd6,0xb5,0x34,0x93,0xa1,0x91,0x76,0x60,0xa4,0x62,0x5f,0xb8,0x9a,0x56,0xd9,0xbd,0xc4,0x9e,0xf0,0x96,0xd0,0xbd,0x8c,0x27,0x50,0xb1,0xec,0x44,0x08,0xa6,0x20,0x8d,
+ 0x04,0x20,0x3a,0xe4,0x83,0x96,0x98,0x01,0x5e,0xeb,0x88,0xf2,0x89,0xd6,0x7e,0x58,0x6a,0x18,0x3f,0xf4,0x57,0x96,0x63,0xdb,0x9d,0x48,0xce,0x2b,0x9b,0x2b,0x43,0x8a,0x6f,0x9b,0x20,0x8d,
+ 0x04,0x20,0x3b,0x1b,0x5c,0xa7,0xdf,0x84,0xf0,0x68,0x04,0x9c,0xa5,0x17,0x36,0x78,0xd9,0x3b,0xec,0x6f,0x84,0x7d,0x05,0x2d,0x6e,0x3d,0x11,0x01,0x1a,0xc0,0xc1,0xfd,0xe3,0xd7,0x20,0x8d,
+ 0x04,0x20,0x3b,0xd0,0x45,0x49,0x25,0x13,0x42,0x0e,0x26,0x5a,0x88,0xa8,0x5d,0x8d,0x7b,0x41,0xa7,0xa6,0xa6,0x4c,0xef,0x33,0x32,0xf1,0x14,0xbf,0xd2,0x78,0xc7,0x99,0x61,0xa0,0x20,0x8d,
+ 0x04,0x20,0x3c,0x2a,0x3b,0xf9,0xb8,0xe3,0xfc,0xb8,0xd0,0x20,0xfd,0x96,0x00,0x60,0x4d,0x1b,0x08,0xdc,0xe0,0xc2,0xdb,0x5a,0x9b,0x24,0x7f,0x59,0xca,0xd6,0xaa,0x99,0x6c,0x51,0x20,0x8d,
+ 0x04,0x20,0x3c,0x59,0x5b,0x47,0xf7,0xed,0x46,0x77,0x94,0x94,0x77,0x3c,0x0d,0x47,0x1b,0x34,0x59,0x3d,0x32,0x8b,0xf8,0x3f,0x13,0xa5,0xe0,0x04,0x3c,0x44,0x36,0x4c,0x8d,0x1b,0x20,0x8d,
+ 0x04,0x20,0x3c,0x93,0x31,0xb5,0x73,0xf7,0xfd,0x42,0xa8,0xc0,0x97,0x9d,0x95,0x46,0xc2,0x4c,0x40,0x6d,0x78,0x16,0x3a,0x99,0xfb,0x91,0x2e,0xaf,0x1b,0x4f,0xff,0xcb,0x56,0x96,0x20,0x8d,
+ 0x04,0x20,0x3d,0x57,0xd1,0xf4,0xc4,0x96,0x7f,0x58,0x7a,0x98,0x54,0xc0,0xb4,0x33,0x78,0x7d,0xa0,0x51,0xe2,0x71,0x39,0xb4,0xd5,0xc2,0xfb,0xe6,0x21,0xaa,0x7b,0xa7,0x35,0x43,0x20,0x8d,
+ 0x04,0x20,0x3d,0x5f,0xd8,0x93,0x06,0x5e,0x72,0x1c,0x64,0xa4,0x99,0xb5,0x64,0x05,0xf9,0xdc,0x95,0xb1,0x99,0xe8,0x47,0x38,0x17,0xc0,0xd9,0xa2,0xd5,0xb4,0x7f,0xbb,0x54,0x13,0x20,0x8d,
+ 0x04,0x20,0x3e,0x18,0x77,0xda,0x16,0x72,0x38,0x09,0xdb,0x4f,0x4e,0x95,0x05,0xab,0x2f,0xce,0x31,0xc7,0x90,0xc9,0xf9,0x3b,0x34,0x4f,0x03,0x8a,0xc8,0xd7,0x9b,0xf2,0x3e,0xdc,0x20,0x8d,
+ 0x04,0x20,0x3e,0x30,0x63,0x69,0x74,0xc0,0x7b,0xde,0x53,0xa3,0x94,0xe9,0xbc,0x5d,0x3b,0x02,0x94,0xe7,0x03,0x19,0x1d,0x34,0x8b,0x5f,0x7e,0xc6,0x87,0xbb,0x23,0x11,0x05,0x8a,0x20,0x8d,
+ 0x04,0x20,0x3e,0x4e,0xca,0xb2,0x8f,0xa9,0x84,0x0b,0x04,0x52,0xee,0x20,0x42,0x26,0x68,0xd2,0x17,0xdb,0xfb,0xd1,0xb4,0xd6,0x5f,0x01,0xeb,0x8d,0x8f,0x7d,0x04,0x86,0xb1,0x4e,0x20,0x8d,
+ 0x04,0x20,0x46,0x89,0xce,0x47,0xbd,0xa7,0x1c,0x10,0xce,0xa9,0x87,0xdf,0xd2,0x0c,0xf1,0x69,0xed,0x57,0x7a,0xf7,0xa0,0xcf,0x0e,0x41,0x57,0xf0,0xef,0x47,0x88,0x6a,0xab,0x9b,0x20,0x8d,
+ 0x04,0x20,0x47,0x39,0x55,0xea,0x71,0x08,0x1f,0x1e,0xf1,0xc2,0x0c,0x7b,0x90,0x40,0xe2,0x9d,0x00,0x15,0x2d,0xb4,0x34,0x9c,0xe2,0xb2,0xef,0xb6,0xa6,0xee,0x1a,0x3d,0x26,0xa7,0x20,0x8d,
+ 0x04,0x20,0x47,0x41,0x44,0x18,0x23,0x4f,0x8b,0x6b,0xf0,0x5f,0x8f,0xad,0x70,0x71,0x14,0xb2,0x92,0xec,0x81,0xf9,0x24,0xf1,0xa6,0x8d,0x9f,0xc3,0x7f,0x01,0xde,0x1e,0x2c,0x58,0x20,0x8d,
+ 0x04,0x20,0x47,0xec,0x81,0x10,0x2c,0xa1,0x07,0xcb,0xae,0xd0,0x22,0x6a,0xe2,0x5d,0x1d,0xa1,0xed,0xb9,0xcf,0x37,0x52,0x6d,0x88,0x2c,0x6e,0x6a,0xb4,0x11,0x09,0xe3,0xdb,0xf9,0x20,0x8d,
+ 0x04,0x20,0x47,0xf3,0xb0,0xf0,0x56,0x74,0xad,0x9f,0xc9,0x4d,0x16,0x54,0x36,0xd9,0x87,0x0a,0x9b,0xfc,0x2b,0xb4,0xad,0xd3,0x69,0xc6,0x64,0xcb,0x49,0x1e,0xcf,0x8c,0x0a,0x35,0x20,0x8d,
+ 0x04,0x20,0x40,0x48,0xb1,0xa8,0x26,0x20,0xab,0x50,0x3e,0x0c,0x5c,0xdc,0x3c,0xb6,0x8d,0xd9,0xdc,0x26,0xcf,0x54,0xf2,0xde,0xe1,0x32,0x76,0x2a,0x96,0xff,0xfa,0xef,0xf1,0x07,0x20,0x8d,
+ 0x04,0x20,0x40,0xb1,0x9a,0x24,0xbc,0x4b,0x9f,0x96,0xc4,0xcf,0x90,0x0c,0xc2,0xd0,0x55,0xe7,0xed,0x60,0xf3,0xb3,0x94,0x69,0x61,0xa6,0x84,0x7b,0xfe,0x73,0x83,0x47,0xc6,0x8f,0x20,0x8d,
+ 0x04,0x20,0x40,0xf8,0xfa,0x78,0xfc,0xfc,0xca,0xd6,0x3d,0x87,0xa4,0x61,0xdb,0x39,0x98,0x7c,0x19,0x7b,0x76,0x28,0xe2,0x6e,0x17,0xe9,0xf0,0x9f,0x7d,0x98,0x71,0x68,0x98,0xc3,0x20,0x8d,
+ 0x04,0x20,0x40,0xfe,0x20,0x70,0xbc,0xc0,0x7b,0x88,0x97,0xa8,0x9b,0xa0,0x2c,0xc1,0xfa,0x0c,0xb0,0x86,0xc1,0x2a,0xb5,0x1d,0xd6,0x57,0x37,0xf6,0xb9,0xd2,0x17,0x6d,0x62,0x75,0x20,0x8d,
+ 0x04,0x20,0x41,0x0e,0xb5,0xfa,0x48,0xbe,0x25,0x88,0x4c,0xb1,0x43,0xc3,0x31,0x79,0xc1,0xee,0x40,0x0d,0x46,0x0b,0x6a,0xe6,0x7a,0x5d,0x58,0x33,0x00,0xc7,0x68,0xe9,0xd9,0x59,0x20,0x8d,
+ 0x04,0x20,0x41,0x46,0xb6,0xb7,0x42,0xb9,0x22,0x9a,0x8b,0x84,0x31,0x1e,0x40,0xca,0xbd,0x33,0x54,0x68,0x4d,0xd5,0xb5,0x26,0x54,0x83,0x7f,0x74,0xa1,0xa3,0x6b,0x86,0x75,0xa5,0x20,0x8d,
+ 0x04,0x20,0x41,0x9b,0x2e,0xcf,0xc2,0x8b,0x71,0x0b,0xad,0xd2,0xfa,0xdb,0x53,0x89,0xeb,0x9a,0x1c,0x2a,0x4b,0x8e,0xbf,0x16,0x1b,0x73,0xfd,0xa1,0x97,0xfc,0x0a,0x79,0x4e,0xf1,0x20,0x8d,
+ 0x04,0x20,0x42,0x1c,0x80,0x21,0x48,0x8d,0x4f,0x1b,0x39,0x17,0x34,0x17,0xc9,0x85,0xaa,0x03,0x03,0xcf,0xe0,0x0c,0x94,0x72,0x83,0xfd,0xaf,0x44,0xfe,0x1a,0x31,0xa2,0xf8,0x49,0x20,0x8d,
+ 0x04,0x20,0x42,0x53,0xf6,0xf7,0x66,0x68,0x58,0x82,0x39,0x2a,0x24,0x3c,0xf9,0xe7,0x45,0x2d,0xe6,0x0a,0x1a,0x90,0x84,0x97,0x4a,0x63,0x51,0x8a,0x5c,0x8d,0x34,0x09,0x56,0xf0,0x20,0x8d,
+ 0x04,0x20,0x42,0xe6,0xce,0x85,0xed,0x28,0x1d,0x03,0x58,0x39,0x2e,0x32,0xed,0x6a,0xb0,0x39,0x9e,0x58,0x26,0x6a,0x1f,0xef,0x6f,0x09,0xf9,0x4c,0xe2,0xc0,0x34,0x04,0x99,0xae,0x20,0x8d,
+ 0x04,0x20,0x44,0xe7,0xbc,0xb5,0x52,0x8d,0x7a,0x30,0xb8,0x78,0xac,0x8f,0x56,0x2e,0x72,0x6d,0xb8,0x83,0xe4,0x6b,0x28,0x88,0xf3,0x04,0x51,0xdb,0xf3,0x14,0xdd,0x9e,0x1b,0xf3,0x20,0x8d,
+ 0x04,0x20,0x45,0x2a,0x39,0x4b,0x37,0x3f,0x88,0x2e,0xea,0xa5,0xcf,0x2d,0xab,0x48,0x12,0xb6,0x34,0xd3,0xd5,0xf3,0xab,0xa0,0xfe,0x6a,0x68,0xe2,0xa9,0x5d,0x69,0x91,0xc1,0xf2,0x20,0x8d,
+ 0x04,0x20,0x4e,0xae,0xe6,0x85,0xcf,0x49,0x1e,0x14,0xb6,0x87,0x87,0xe5,0x4e,0x1d,0xf6,0x08,0xb0,0xab,0xfe,0x50,0x8b,0x17,0xd6,0xe9,0xbf,0x5d,0x60,0x03,0xe2,0xff,0x97,0x02,0x20,0x8d,
+ 0x04,0x20,0x4e,0xe7,0xe7,0xdc,0xa9,0x58,0x54,0xb9,0xfa,0xb5,0x94,0x6e,0x07,0xab,0x42,0x9d,0xaf,0x28,0x59,0x57,0x3d,0x5c,0xdf,0xa3,0x82,0xe6,0x34,0xcd,0xd3,0x88,0x0e,0x4f,0x20,0x8d,
+ 0x04,0x20,0x4e,0xe6,0x38,0x25,0x11,0xba,0xf1,0xc2,0x8e,0xda,0x6d,0x08,0x08,0xa9,0x28,0x6b,0x19,0x68,0x7a,0xd4,0x7e,0xe9,0x0d,0x5d,0xaa,0x45,0xf1,0xcb,0xd6,0x4f,0xcf,0xd2,0x20,0x8d,
+ 0x04,0x20,0x4f,0xbf,0x52,0x77,0xf5,0x17,0x46,0xde,0xdc,0x4e,0x8d,0x0a,0x1e,0xa8,0xdf,0xc5,0xf1,0x9a,0x07,0x5f,0x91,0xb2,0x09,0x37,0x55,0xb1,0xdf,0x89,0x56,0x22,0x2a,0x8a,0x20,0x8d,
+ 0x04,0x20,0x4f,0x8f,0xc5,0x71,0x78,0x65,0xb7,0x96,0x4d,0x0d,0xeb,0x7f,0x56,0x6a,0xaf,0xf0,0x5a,0x98,0xf3,0x55,0x5a,0xb4,0xa3,0x57,0xe3,0x0d,0x1c,0x03,0x3f,0x28,0x3e,0xc6,0x20,0x8d,
+ 0x04,0x20,0x48,0x0c,0x10,0x5d,0x09,0x66,0x06,0xc0,0x5d,0x35,0xd4,0xe1,0xad,0xe0,0x2c,0x9c,0x07,0x04,0x60,0x6c,0xd4,0x00,0x15,0x0d,0xb4,0x90,0x9c,0x79,0x33,0xac,0x73,0xac,0x20,0x8d,
+ 0x04,0x20,0x48,0x96,0x9d,0xe8,0xd5,0xa3,0xf9,0x15,0x6d,0x50,0xf9,0x8f,0xdc,0x1c,0x78,0xc9,0x3e,0x1d,0x22,0x45,0x21,0xae,0x02,0x86,0x77,0x37,0x15,0xa1,0x66,0x5a,0x56,0x6a,0x20,0x8d,
+ 0x04,0x20,0x49,0x20,0x9e,0x7b,0x52,0x8e,0xbf,0xc3,0x34,0xed,0x37,0xc7,0xd4,0xbe,0xa4,0xa5,0x13,0xd0,0xfc,0xc2,0x7f,0x8f,0x26,0x7e,0x4a,0xa3,0x36,0x64,0x3b,0xa0,0x09,0xc5,0x20,0x8d,
+ 0x04,0x20,0x49,0xa9,0x76,0xa8,0x45,0x6f,0x23,0xc7,0x9b,0x0e,0x4f,0xc5,0x54,0x4b,0x05,0xb4,0x01,0x07,0xa8,0x7f,0x76,0xac,0x38,0x66,0x72,0x2a,0xfd,0x23,0xf0,0x22,0x17,0xb6,0x20,0x8d,
+ 0x04,0x20,0x49,0xf3,0x31,0x25,0x4c,0x7e,0xb6,0x01,0x97,0x3c,0x1a,0x19,0x8a,0x63,0x29,0x52,0x8a,0x16,0xbb,0x6d,0x29,0x89,0x0e,0x34,0x6f,0xe7,0x00,0xc1,0x34,0xb7,0x88,0xbf,0x20,0x8d,
+ 0x04,0x20,0x4a,0x7c,0x52,0x1d,0x70,0x42,0xc9,0xad,0x33,0x85,0x59,0xf9,0x44,0x89,0xba,0x2f,0x3f,0xd1,0x29,0x9d,0xcc,0x8a,0xda,0x78,0xbc,0x86,0x0a,0x13,0x47,0xfd,0x7c,0x28,0x20,0x8d,
+ 0x04,0x20,0x4a,0xd1,0xe8,0x2a,0xbf,0xe7,0x65,0xcb,0x5c,0xae,0x0f,0xa3,0x4b,0xd0,0x1a,0xf6,0x98,0x63,0xcd,0x3f,0x15,0x3f,0x03,0x1c,0x65,0x77,0xad,0x83,0x47,0x0a,0xf4,0x11,0x20,0x8d,
+ 0x04,0x20,0x4a,0xd5,0x55,0x60,0x0b,0x16,0x44,0x81,0xc7,0x1e,0x24,0x38,0x9b,0xe2,0xd5,0xf4,0xb3,0xb1,0x07,0x9e,0x07,0xb0,0xd8,0x55,0x7c,0x2a,0x01,0xe0,0x1f,0xb5,0x9e,0x4f,0x20,0x8d,
+ 0x04,0x20,0x4b,0x00,0x70,0x4e,0x57,0x49,0x8a,0x6d,0xa3,0x3f,0x3a,0x88,0xbe,0xad,0x45,0xfe,0xd5,0xa9,0x59,0x13,0x0a,0xc9,0x31,0x00,0xe7,0x02,0x72,0x78,0xcd,0xa3,0x4e,0xad,0x20,0x8d,
+ 0x04,0x20,0x4b,0x49,0x37,0x3e,0x20,0x1c,0x9c,0x3d,0xef,0x7a,0x04,0xad,0x6c,0x0a,0xf6,0x9d,0x86,0xad,0x70,0x2e,0xe9,0xa1,0x5d,0xf0,0x6a,0xd9,0xf3,0x7d,0x8a,0x25,0x12,0xdd,0x20,0x8d,
+ 0x04,0x20,0x4b,0xad,0xe2,0x4c,0x9d,0xa7,0x45,0x2d,0x67,0x6d,0x99,0x82,0x6c,0x1a,0x12,0x92,0x22,0x4b,0x81,0xc4,0x9f,0x45,0xc3,0xca,0x9b,0x9f,0x34,0xdd,0xd2,0xb3,0x10,0xa7,0x20,0x8d,
+ 0x04,0x20,0x4c,0xc6,0x19,0xf7,0x8d,0xf4,0xc4,0x20,0xd9,0xe1,0xac,0x01,0x8d,0xb7,0x6f,0x2b,0x62,0xca,0x71,0x40,0x34,0x33,0x33,0x1c,0xa0,0x5f,0xb5,0xeb,0x21,0x94,0xa7,0xb0,0x20,0x8d,
+ 0x04,0x20,0x4d,0xd4,0x65,0xfe,0x97,0x36,0x15,0xf2,0xe3,0xe1,0x1f,0x8e,0x95,0xab,0x02,0x17,0x86,0x19,0xc1,0x18,0x7d,0x41,0x36,0x72,0x3b,0xc7,0x08,0xb1,0xa7,0xe0,0x94,0x0e,0x20,0x8d,
+ 0x04,0x20,0x4d,0xd6,0x75,0x40,0x33,0x55,0x18,0x78,0x83,0xdd,0xd5,0x34,0x1f,0x75,0xa1,0x62,0x1b,0x57,0xc2,0xb9,0x4f,0x7f,0x9f,0xa0,0xf6,0x68,0xff,0x70,0xc2,0x3f,0x73,0x84,0x20,0x8d,
+ 0x04,0x20,0x57,0x26,0xb6,0x0f,0xa8,0x29,0xc3,0x7b,0x7d,0x3b,0x36,0x88,0x48,0x41,0x85,0xa0,0xc0,0x4d,0xa7,0x48,0xb2,0x7f,0x89,0xdc,0xd5,0xe0,0x21,0xdf,0x65,0x88,0xb5,0xda,0x20,0x8d,
+ 0x04,0x20,0x57,0x68,0xab,0xf3,0xdf,0x17,0x94,0x62,0xfe,0x55,0xab,0x8e,0xb2,0x09,0xa3,0x27,0xea,0x4a,0x7f,0x3b,0x9b,0xd5,0xf7,0x5b,0x9e,0x8e,0x1d,0xa2,0xeb,0xb7,0x30,0xf2,0x20,0x8d,
+ 0x04,0x20,0x57,0x83,0x2c,0x42,0xca,0x60,0xfb,0x46,0x5a,0x40,0xe3,0x94,0xe1,0x0f,0xb0,0x82,0x86,0x86,0x93,0xfe,0x23,0x5b,0x61,0xfb,0xc9,0x5e,0x50,0xff,0x70,0xe5,0x43,0x46,0x20,0x8d,
+ 0x04,0x20,0x50,0x18,0x09,0xe0,0xda,0x94,0x0e,0x11,0x1a,0xed,0x58,0x50,0x7d,0xd4,0xda,0x7c,0x6d,0x35,0x73,0x10,0x3b,0x42,0x42,0xa9,0x7e,0x10,0xd9,0x13,0x9c,0x34,0x36,0xce,0x20,0x8d,
+ 0x04,0x20,0x50,0xb1,0xc8,0x64,0xbb,0xce,0x5b,0x09,0x11,0x38,0xe5,0xbf,0x32,0x9e,0xfe,0xa8,0xe3,0x85,0x72,0x9b,0xb0,0x9c,0x30,0xef,0xff,0x3a,0x6f,0x91,0x39,0x61,0x2b,0x70,0x20,0x8d,
+ 0x04,0x20,0x52,0x5a,0xe5,0x0d,0x3b,0xf8,0x90,0xc3,0x48,0x98,0x1a,0xc6,0xc2,0x1f,0x10,0xa5,0x4c,0xee,0x8f,0xd4,0x80,0x89,0xf7,0xac,0x14,0xb4,0xc6,0xfb,0x65,0xec,0x2a,0x8d,0x20,0x8d,
+ 0x04,0x20,0x53,0xbe,0x83,0x63,0x0a,0xe0,0xe3,0xe7,0x16,0x47,0x97,0xfa,0xc0,0x9d,0x16,0x32,0x19,0xe2,0x3d,0xf8,0x93,0xc6,0x0f,0xf7,0xb8,0xf1,0x2e,0xb8,0x0d,0x58,0x63,0x6d,0x20,0x8d,
+ 0x04,0x20,0x53,0xab,0x26,0x50,0x6e,0x71,0x9a,0xa9,0xe1,0x27,0xa0,0xa5,0x65,0x33,0x4f,0x74,0x8e,0xbf,0xd6,0x48,0x5b,0xe4,0x17,0xce,0xf4,0x36,0x7f,0xa0,0x6b,0xe7,0x72,0x9c,0x20,0x8d,
+ 0x04,0x20,0x54,0x24,0xd7,0xcb,0x4e,0x7b,0xb6,0x40,0x24,0x14,0x10,0xf1,0x2f,0xb8,0xb2,0x97,0xb6,0xfd,0xb9,0x11,0x19,0x24,0x88,0x54,0x10,0x1a,0x20,0xcc,0xa7,0xc2,0x99,0x51,0x20,0x8d,
+ 0x04,0x20,0x54,0x7a,0x6a,0x2d,0xdb,0xa9,0xef,0x05,0x6b,0x4f,0x14,0xd6,0x17,0x8a,0x8a,0x5e,0x82,0xf5,0xb2,0x84,0x32,0xfa,0x3b,0x20,0xc2,0xf3,0xa6,0x8d,0x66,0x00,0x7b,0x29,0x20,0x8d,
+ 0x04,0x20,0x56,0x19,0x3b,0x83,0x15,0xa5,0x40,0x31,0xcc,0x07,0xc5,0xf6,0xa7,0xdd,0xb3,0x02,0x91,0xb3,0x31,0x6c,0x59,0x2f,0x45,0x1a,0xf6,0xfa,0x03,0xa8,0x4e,0xd4,0x80,0x41,0x20,0x8d,
+ 0x04,0x20,0x5e,0xa8,0x74,0x47,0x93,0xdb,0x21,0xe1,0x27,0x4b,0x1e,0x2f,0x94,0x60,0x72,0x56,0x0f,0xf5,0x69,0xb7,0xeb,0xae,0x78,0x6b,0x5b,0x0c,0x70,0x46,0xd7,0x06,0x97,0x91,0x20,0x8d,
+ 0x04,0x20,0x5f,0x06,0x9c,0x97,0xf1,0x52,0x74,0xd5,0x28,0xa6,0x24,0xf6,0xfd,0x47,0x52,0x3f,0x3d,0xea,0x0c,0x76,0x83,0xc3,0xf5,0x35,0xa3,0x0f,0xc3,0x05,0x82,0xc5,0xd8,0x5d,0x20,0x8d,
+ 0x04,0x20,0x58,0x04,0x52,0x5d,0x1e,0x63,0xad,0x37,0xb0,0xb1,0x68,0xc7,0x59,0x9e,0x42,0xca,0x2b,0x00,0x71,0xb8,0xad,0x7c,0xd3,0x6b,0x67,0x9a,0x9b,0xc9,0x16,0xe5,0x84,0x82,0x20,0x8d,
+ 0x04,0x20,0x58,0x79,0xdc,0x92,0xe6,0x9b,0x43,0xfd,0x57,0xfd,0xd4,0xba,0xbd,0x4f,0xbe,0x22,0x21,0xc1,0xd0,0xf0,0xac,0x72,0xaf,0x22,0x32,0xab,0xdf,0xc3,0xfa,0xf7,0x33,0x85,0x20,0x8d,
+ 0x04,0x20,0x59,0x38,0xaf,0xf9,0x3b,0xc4,0x83,0x8c,0x6d,0x13,0x3c,0x36,0xec,0x1c,0xe0,0x24,0x84,0x7f,0xb0,0x36,0x2c,0x20,0x51,0x64,0x9e,0xcf,0xe7,0x74,0x8f,0x0c,0xcb,0x5e,0x20,0x8d,
+ 0x04,0x20,0x59,0x90,0xb2,0x2f,0x38,0x3b,0x3a,0x46,0x7c,0xcd,0x64,0x19,0xcf,0x07,0xd4,0xd9,0xb4,0x80,0x33,0x43,0xb8,0x45,0xbc,0x59,0x53,0x58,0x61,0xe3,0x3d,0x01,0x79,0xf1,0x20,0x8d,
+ 0x04,0x20,0x59,0xf6,0xcc,0x22,0x5c,0x69,0x31,0x07,0x67,0xc4,0x8f,0x81,0x5e,0x0a,0xc5,0x2b,0xb1,0xd3,0x8c,0xc8,0x8b,0x2a,0xdc,0xf3,0x16,0xc7,0x59,0x54,0x68,0xc6,0x35,0x75,0x20,0x8d,
+ 0x04,0x20,0x5a,0x32,0xc2,0x14,0x9b,0x6a,0x63,0x12,0x2d,0x83,0xce,0x1b,0x83,0x9e,0x78,0x26,0x92,0x82,0x94,0xfc,0xd5,0xf5,0xff,0xdf,0x12,0x87,0xf3,0x00,0x92,0xa2,0x2a,0xb0,0x20,0x8d,
+ 0x04,0x20,0x5a,0x75,0x48,0xfe,0xe9,0x6d,0x97,0xc8,0x11,0x09,0x88,0x93,0xaf,0x73,0x8a,0x3a,0x57,0x91,0x64,0x5e,0xb2,0x1e,0x51,0x48,0xe4,0xad,0x30,0xda,0xac,0x26,0x28,0xa8,0x20,0x8d,
+ 0x04,0x20,0x5a,0x8e,0x83,0x61,0x7f,0x56,0x3f,0x9a,0x99,0x3b,0x02,0x11,0x30,0xb5,0x72,0x85,0xe7,0xac,0x9d,0x5c,0x6e,0x0d,0x2d,0xb1,0x1a,0x2b,0x95,0x10,0xbf,0x52,0x05,0xb4,0x20,0x8d,
+ 0x04,0x20,0x5a,0xee,0x3e,0x00,0x86,0x37,0x02,0x5e,0x69,0x41,0x88,0xe4,0x69,0xf3,0x60,0xca,0xc1,0x9a,0x69,0x5c,0x94,0x8d,0x93,0x5a,0x66,0x18,0x13,0x5d,0xbe,0xd7,0x98,0xe7,0x20,0x8d,
+ 0x04,0x20,0x5c,0x53,0x05,0x8c,0x65,0x32,0xea,0x2b,0x70,0x07,0xc8,0x9d,0x23,0x7d,0x90,0x9e,0x71,0xe0,0x80,0xf8,0x64,0x2e,0x2f,0x2b,0x7b,0x84,0x32,0xaf,0x77,0x3c,0x4e,0x35,0x20,0x8d,
+ 0x04,0x20,0x5c,0x71,0x2c,0x3d,0x97,0x55,0xee,0x73,0x03,0x1f,0xe1,0x94,0x6a,0x09,0xa5,0x37,0xde,0xfa,0x3c,0xb7,0x32,0x1d,0xca,0xec,0x6f,0xc8,0x4e,0xe2,0x63,0x19,0xc1,0xac,0x20,0x8d,
+ 0x04,0x20,0x5d,0x6c,0x2a,0x5f,0xc8,0xec,0x08,0xa0,0xbf,0x3e,0x6a,0x57,0x3f,0x98,0xea,0xf5,0x7a,0x3a,0xaf,0x65,0xd8,0x22,0x2e,0x4d,0xf1,0x0a,0xa9,0x76,0x4d,0x5c,0x4b,0xb7,0x20,0x8d,
+ 0x04,0x20,0x5d,0xb6,0x58,0xee,0x58,0x6a,0x73,0x98,0x3e,0x6e,0x73,0x6c,0x59,0xa1,0x9f,0xb3,0xc2,0x77,0xa0,0x9a,0xc1,0x7e,0xfc,0x27,0xdf,0xa8,0xda,0xea,0x67,0x4e,0xa8,0x47,0x20,0x8d,
+ 0x04,0x20,0x5d,0xa5,0xf5,0x4f,0x49,0x32,0x71,0xb5,0x52,0x37,0xbe,0x61,0x7b,0x5b,0xd1,0xfb,0x22,0x2e,0x1a,0x29,0x62,0x88,0xa3,0x98,0x4f,0x2d,0xb9,0x30,0x98,0x4d,0xe2,0xa7,0x20,0x8d,
+ 0x04,0x20,0x5d,0xe2,0x09,0x67,0xe3,0xac,0x41,0xe2,0x7e,0x6d,0xa2,0xf1,0x6e,0xda,0xa7,0xf1,0xfc,0xe4,0x11,0xbc,0x04,0x50,0x70,0x38,0xe9,0x20,0x15,0xc0,0xc9,0x77,0xeb,0x90,0x20,0x8d,
+ 0x04,0x20,0x5e,0x14,0x5e,0xc4,0xc2,0x03,0x84,0x1c,0x15,0x97,0x39,0xc5,0x0d,0x02,0x08,0xf9,0x34,0x9a,0xf6,0x28,0xbb,0x19,0x74,0x4b,0x11,0x2d,0x02,0x1f,0xbc,0xe0,0xa2,0x50,0x20,0x8d,
+ 0x04,0x20,0x5e,0x1f,0x3e,0x58,0x80,0xcb,0x21,0x16,0x7f,0x1c,0xe3,0x8e,0x31,0x6c,0x98,0xd6,0xdb,0xbb,0x90,0x88,0xf6,0x09,0x17,0x15,0x4d,0x09,0xbe,0x4d,0x15,0x65,0x50,0x14,0x20,0x8d,
+ 0x04,0x20,0x66,0x96,0xfb,0x81,0x01,0xef,0x69,0x39,0xda,0xbd,0xf9,0xb8,0xc4,0x95,0x31,0x8f,0xc7,0x09,0xfc,0x43,0xb7,0x01,0x0f,0xcb,0x8f,0x36,0xf3,0x7c,0x62,0xd4,0x74,0x63,0x20,0x8d,
+ 0x04,0x20,0x66,0xce,0x02,0x20,0xd6,0x01,0x5c,0x28,0xd0,0xde,0x2a,0x36,0x31,0x65,0xe0,0xbb,0x1d,0x6b,0x1b,0x63,0x93,0xc6,0x16,0xcf,0xa5,0x58,0x39,0x00,0x6c,0xf5,0x93,0x4e,0x20,0x8d,
+ 0x04,0x20,0x67,0xf2,0x94,0xc8,0x6e,0x37,0x20,0x47,0x7f,0xb7,0xea,0x75,0x28,0x23,0xe4,0x24,0xf6,0xa2,0x3d,0x10,0x8f,0xe8,0x24,0x21,0x4d,0xb3,0x6e,0x49,0xbf,0x2a,0x93,0x92,0x20,0x8d,
+ 0x04,0x20,0x60,0xe8,0xce,0x4a,0x70,0x80,0x53,0x2e,0x51,0xf2,0xe7,0x63,0x03,0x1e,0xef,0xb9,0x09,0xa8,0x58,0xea,0x80,0x78,0xa4,0x67,0x18,0xcb,0xc1,0xa4,0xc2,0x38,0xbc,0xd8,0x20,0x8d,
+ 0x04,0x20,0x61,0x56,0x0d,0x6e,0x3b,0x0b,0x87,0x25,0xd6,0x23,0xa5,0x49,0x33,0xd3,0x88,0x9d,0x08,0x9e,0xab,0xbe,0xaa,0xc6,0xf7,0xfd,0x9d,0x7d,0x3a,0x12,0xe1,0x55,0x86,0x9d,0x20,0x8d,
+ 0x04,0x20,0x61,0xfc,0xe5,0x0b,0x80,0xbc,0xee,0xf6,0x83,0x55,0x95,0x7c,0xc0,0x0c,0x97,0x23,0xcd,0xa8,0x9f,0x04,0x44,0x1b,0x08,0x96,0xda,0x7a,0xa6,0x6c,0x24,0x2c,0x6b,0x7f,0x20,0x8d,
+ 0x04,0x20,0x61,0xe0,0x5e,0x2d,0xa3,0x1e,0x28,0x9b,0x11,0x09,0x5e,0x8e,0xba,0xe2,0x05,0x21,0x0e,0xdd,0x58,0xf3,0x6a,0xc1,0x71,0xa7,0xec,0xe4,0x54,0x9b,0x94,0xb5,0xce,0x51,0x20,0x8d,
+ 0x04,0x20,0x62,0x84,0x77,0x4f,0x98,0x73,0xc6,0xad,0x86,0x93,0x98,0x09,0xa1,0x1e,0x34,0x23,0x69,0xad,0xdc,0xdd,0x94,0x47,0xb8,0xfc,0xc1,0xee,0x8c,0xa3,0x70,0x99,0x6b,0xc1,0x20,0x8d,
+ 0x04,0x20,0x63,0xa3,0x3b,0xd7,0x99,0xca,0xf1,0x47,0xc5,0x1f,0xa9,0xea,0xc4,0x68,0x43,0xe5,0x30,0x75,0x92,0x6b,0x4e,0xa9,0x33,0xf2,0x58,0xe4,0x6f,0x36,0x6b,0xcc,0xe7,0xc7,0x20,0x8d,
+ 0x04,0x20,0x63,0xc3,0x20,0x7c,0xcc,0xdc,0xde,0xfe,0xb4,0x12,0x5f,0x3b,0xb3,0x18,0xfc,0x5f,0x67,0x21,0x77,0x1d,0x56,0x36,0xf7,0xb1,0x66,0x2e,0x84,0x60,0xcf,0x32,0xd8,0xc2,0x20,0x8d,
+ 0x04,0x20,0x64,0x6a,0x0c,0x40,0x1e,0xb7,0xbb,0xc3,0x69,0xfe,0x51,0xa5,0x1e,0xae,0x32,0x3b,0x78,0x10,0x1d,0x80,0x16,0x9d,0xaf,0x4b,0xd8,0x24,0xea,0xcb,0xc2,0xcb,0x5b,0xbe,0x20,0x8d,
+ 0x04,0x20,0x64,0xce,0x81,0x44,0xd4,0xae,0x32,0x6c,0x16,0xe5,0x6f,0xa6,0xc1,0xca,0xcd,0x62,0xc6,0xfa,0xde,0xc2,0x40,0x75,0xdb,0x9b,0x66,0x38,0xda,0x0e,0xc2,0x73,0x70,0xfa,0x20,0x8d,
+ 0x04,0x20,0x65,0x52,0xe9,0xc2,0x53,0x24,0x9b,0x14,0x56,0x69,0x9b,0x26,0xf5,0xea,0x14,0x8d,0x55,0x82,0xec,0xd2,0x29,0x8b,0x36,0x25,0x9a,0xa3,0xd5,0x87,0x0e,0xea,0xb1,0xd9,0x20,0x8d,
+ 0x04,0x20,0x65,0x89,0x0f,0x62,0x84,0x8a,0xd2,0xf6,0xd6,0xcb,0x55,0x5a,0x7f,0x8e,0x8e,0x29,0x87,0xc8,0x7f,0x09,0x98,0x57,0x2f,0x9b,0x6c,0xa6,0x7f,0xcf,0xbc,0x6d,0x18,0xe7,0x20,0x8d,
+ 0x04,0x20,0x65,0xeb,0xb8,0xa1,0x37,0x07,0x0d,0xa6,0x18,0x05,0x3d,0xb0,0x0b,0xfd,0x62,0x2e,0x22,0x73,0xa1,0x60,0xe9,0xb9,0x16,0xb3,0x9e,0x15,0x88,0xc4,0x2c,0x8e,0xfb,0x94,0x20,0x8d,
+ 0x04,0x20,0x6e,0x83,0x44,0x23,0x82,0x5a,0xa6,0xdc,0x35,0x65,0x7e,0xc4,0x26,0x52,0xf2,0x35,0xaa,0xd3,0x50,0xd9,0x3b,0xcc,0x13,0x19,0x2c,0x8d,0xeb,0xfc,0x41,0x1f,0x31,0x12,0x20,0x8d,
+ 0x04,0x20,0x6e,0xd3,0x96,0x36,0xbf,0x7c,0xa5,0xce,0xae,0x21,0x88,0xbb,0xf9,0xcb,0x1b,0x36,0x5a,0xd8,0xf8,0x12,0xc3,0xa4,0x35,0x0d,0x6f,0x8a,0x16,0x2f,0x42,0x84,0xa1,0xbc,0x20,0x8d,
+ 0x04,0x20,0x6f,0x73,0x78,0x6b,0xc8,0x66,0xba,0x9e,0x40,0xd8,0x66,0x1c,0x70,0x03,0xa8,0xec,0xc4,0xf4,0x1e,0xe5,0x79,0x6c,0xab,0x15,0xce,0x57,0x66,0x8a,0xa1,0xee,0x06,0xb9,0x20,0x8d,
+ 0x04,0x20,0x6f,0xb9,0xee,0x8b,0x40,0x2f,0xa5,0xa2,0xe7,0x3a,0xea,0xd2,0xfa,0xfe,0xe9,0xa8,0x53,0xa3,0x4c,0xf0,0x02,0x17,0xf6,0xcb,0xd6,0x1f,0xab,0xe9,0x99,0x4a,0x71,0x4c,0x20,0x8d,
+ 0x04,0x20,0x6f,0xba,0xc2,0xb9,0x5a,0xa9,0x51,0x1f,0x71,0xcf,0xcd,0x2f,0x08,0x3d,0x97,0x69,0xe8,0x11,0x55,0xf8,0x44,0xc9,0xc5,0x5c,0xe5,0xd9,0xa3,0x2f,0xf8,0xf9,0x0a,0x70,0x20,0x8d,
+ 0x04,0x20,0x6f,0xad,0x89,0x9e,0x48,0x0b,0x96,0x1c,0xf8,0xe3,0xae,0xd4,0x3b,0x85,0xdb,0x08,0xce,0x5e,0xda,0x64,0x29,0x87,0xc9,0xaa,0x41,0xd6,0xb9,0x95,0x77,0xff,0x65,0xf1,0x20,0x8d,
+ 0x04,0x20,0x68,0x9c,0xb3,0xf4,0x02,0x5b,0x53,0x24,0xce,0x67,0x93,0x1b,0xf8,0x48,0x55,0xb5,0xf4,0xc2,0xf9,0x30,0xd6,0x7f,0xd1,0x5f,0x92,0x68,0x49,0x09,0xfd,0x8f,0x0a,0x72,0x20,0x8d,
+ 0x04,0x20,0x68,0xd8,0x4d,0x12,0x96,0xf6,0x2a,0x4f,0x85,0x3d,0xc0,0x36,0x0b,0x28,0xf5,0x06,0x5a,0x1d,0x98,0x14,0x02,0x07,0x6e,0xba,0xbe,0x83,0x0b,0xc5,0x40,0xc7,0x90,0x35,0x20,0x8d,
+ 0x04,0x20,0x69,0xa8,0xf1,0xf0,0x9f,0x3f,0x88,0xb1,0x8f,0xd3,0x6e,0xc1,0xfc,0x54,0x11,0xa2,0x5c,0xe6,0x4e,0xa9,0xd7,0xc6,0x22,0xd8,0xd9,0xf5,0x18,0x29,0x83,0xba,0x0e,0x0c,0x20,0x8d,
+ 0x04,0x20,0x69,0xdc,0xd1,0xad,0xd1,0xfb,0x25,0x67,0x49,0x52,0x25,0xdf,0x8d,0x6a,0x15,0x8b,0x07,0xa3,0x32,0x4a,0xbb,0x8e,0x3c,0xcf,0x72,0xcd,0x7f,0xbc,0xd5,0x4c,0x5d,0xbb,0x20,0x8d,
+ 0x04,0x20,0x69,0xe0,0x3b,0x71,0xef,0x8d,0xcd,0x5b,0xde,0x17,0x9a,0x07,0xb2,0xc6,0xfd,0x9f,0xf7,0x31,0x31,0x83,0x57,0x64,0x0b,0xfc,0x1c,0xd8,0xbb,0x51,0xf9,0xb0,0xb7,0x8b,0x20,0x8d,
+ 0x04,0x20,0x6a,0x39,0x4e,0xe9,0x2f,0x09,0x53,0x2f,0xd5,0x56,0x68,0xd6,0xe8,0xb4,0xfb,0xa7,0x49,0x92,0xaf,0xe4,0xf2,0x39,0x54,0x88,0x4f,0x70,0xb2,0xcb,0xf2,0xd0,0xb9,0x09,0x20,0x8d,
+ 0x04,0x20,0x6a,0x3e,0x67,0xe7,0xa0,0xdb,0x54,0xdf,0x1a,0xee,0xe5,0xcc,0x29,0x48,0x93,0xf5,0xa5,0xbf,0xa6,0x9f,0xe9,0x35,0x9e,0x8b,0xc0,0xcb,0x01,0x51,0x56,0x5d,0xb5,0xe2,0x20,0x8d,
+ 0x04,0x20,0x6a,0x23,0xb4,0xd7,0xf6,0xd9,0xd6,0x4a,0x44,0x79,0xfe,0x0b,0x68,0xec,0xbc,0x0b,0x31,0x6f,0x88,0x9f,0xa6,0xe2,0xd5,0x97,0xd9,0xfc,0xc3,0x77,0x23,0xfe,0x4d,0x9a,0x20,0x8d,
+ 0x04,0x20,0x6a,0x48,0x24,0x7b,0xf0,0x16,0x09,0xce,0x89,0x7d,0x7b,0xf9,0x67,0xcd,0x8b,0xf9,0x95,0xfb,0x2e,0x10,0x4b,0x49,0x9f,0x38,0x3f,0x7c,0xbf,0xcb,0x29,0xe5,0x1a,0x4f,0x20,0x8d,
+ 0x04,0x20,0x6a,0x96,0xd3,0x87,0xcb,0x7a,0x2d,0x37,0xdd,0x37,0x50,0xcb,0x33,0xb4,0x4a,0x78,0x81,0x23,0x92,0xc3,0xa0,0x69,0x35,0xf7,0xdb,0x65,0x5e,0x7d,0x5d,0x23,0x08,0x2e,0x20,0x8d,
+ 0x04,0x20,0x6a,0xe4,0xaf,0x69,0x5a,0xbe,0x2a,0x48,0xb2,0x3f,0x0f,0xcb,0xf1,0x5a,0x77,0x1c,0x4c,0xae,0x35,0xed,0x25,0x99,0x1d,0xb9,0x8a,0xfd,0x00,0x63,0x3a,0x47,0x10,0xf3,0x20,0x8d,
+ 0x04,0x20,0x6b,0x89,0x4a,0xa2,0x97,0x15,0xac,0xb5,0x3d,0x72,0x68,0x99,0xb7,0x96,0x9d,0x84,0xef,0xf0,0xed,0x4d,0x11,0x6e,0x4e,0xcc,0xb0,0xe5,0x7e,0x8a,0xef,0xda,0x92,0x9d,0x20,0x8d,
+ 0x04,0x20,0x6c,0x34,0x5b,0x0e,0x13,0xdc,0x0b,0xb2,0xa8,0xa7,0x5b,0x62,0xb6,0xc8,0x4c,0x8d,0x04,0xd4,0x46,0x54,0x6c,0x89,0x98,0xed,0x45,0x90,0xbe,0x98,0xa7,0x8d,0x0e,0x64,0x20,0x8d,
+ 0x04,0x20,0x6c,0xba,0xfd,0x14,0x1b,0x01,0x62,0x04,0x36,0x38,0x6a,0xb8,0x3c,0xa4,0xa1,0x95,0x54,0xdb,0x79,0x20,0x77,0x64,0x69,0x56,0xb5,0xd1,0x24,0x0b,0x74,0x3c,0xd8,0x90,0x20,0x8d,
+ 0x04,0x20,0x6d,0x98,0x9b,0xa0,0xde,0x06,0x64,0xf7,0x17,0x40,0x3b,0x2a,0x02,0x2a,0xe4,0x0f,0x95,0x8b,0x0c,0x35,0x2e,0xc7,0xd8,0xdd,0x63,0xc3,0xa2,0xc8,0xb2,0xa7,0xd4,0x4b,0x20,0x8d,
+ 0x04,0x20,0x6e,0x62,0xff,0xdb,0x57,0x8f,0xc4,0x70,0x25,0xb6,0x45,0x7f,0xa7,0x10,0x1e,0x50,0xf8,0xfa,0xac,0x9d,0x60,0x61,0x03,0xb6,0xa7,0x51,0xf8,0x43,0x35,0xf8,0x9e,0x1a,0x20,0x8d,
+ 0x04,0x20,0x77,0xe2,0xca,0x61,0xde,0xa7,0x8c,0xda,0xb6,0x18,0xea,0xd9,0x7a,0xd6,0x0c,0x0e,0xc7,0xf4,0x7e,0x77,0x88,0xe3,0x3d,0x36,0x5c,0xaa,0x62,0xe9,0x4c,0x55,0x08,0xe3,0x20,0x8d,
+ 0x04,0x20,0x71,0x34,0x87,0x8b,0x20,0x31,0x9d,0x2c,0x81,0x84,0x55,0x41,0xd0,0x37,0xa8,0x1c,0x84,0xc0,0xd8,0xab,0x19,0x3d,0x88,0x61,0x98,0xc5,0x49,0x7b,0xe2,0x36,0xcd,0xf0,0x20,0x8d,
+ 0x04,0x20,0x71,0x4a,0x11,0xcf,0x3b,0xa8,0x47,0x8a,0xa4,0xa3,0x1b,0xf9,0xf7,0x72,0xaa,0x70,0x97,0xd0,0xa4,0x42,0xfa,0xce,0xeb,0x82,0x53,0xff,0x22,0x00,0x28,0xc3,0xdf,0xd3,0x20,0x8d,
+ 0x04,0x20,0x71,0x91,0x9d,0x1a,0xb7,0xae,0xcc,0x98,0xee,0x6d,0xd3,0xa5,0xac,0x6d,0xf2,0x15,0x61,0xbf,0x94,0x26,0x54,0x4a,0x93,0x70,0x5d,0x87,0xef,0xe6,0x30,0x86,0xee,0x87,0x20,0x8d,
+ 0x04,0x20,0x71,0x9a,0xd9,0x6a,0x9d,0x08,0xd9,0x6a,0x7b,0xce,0x54,0xe2,0xba,0x60,0x51,0x73,0x61,0xc4,0xca,0x17,0x84,0xbe,0x38,0x37,0x39,0x4b,0xa4,0xa7,0x04,0xaf,0x36,0x7c,0x20,0x8d,
+ 0x04,0x20,0x71,0xc4,0xfe,0x0c,0xc1,0x70,0x42,0x4d,0xe3,0x7a,0xfd,0xaf,0x89,0x78,0xc3,0x72,0xd7,0x43,0x93,0x37,0xa8,0x5c,0x93,0xdb,0xa8,0xb9,0xc3,0x4a,0x37,0x51,0x66,0x5c,0x20,0x8d,
+ 0x04,0x20,0x71,0xcb,0xdc,0x4e,0x40,0x7c,0xea,0x92,0xb2,0x26,0x99,0x89,0x2c,0x3c,0x3b,0x74,0x81,0xec,0xeb,0xec,0x4f,0x7b,0x16,0xae,0xf2,0x64,0x51,0x2b,0xc4,0x2d,0xbf,0xab,0x20,0x8d,
+ 0x04,0x20,0x72,0xb4,0xeb,0x41,0x49,0x3c,0xa4,0xbc,0x5a,0xae,0xfb,0xf1,0x37,0x89,0x25,0xf7,0x39,0xb9,0x8e,0xa6,0x97,0x64,0x7e,0xd7,0x35,0x7c,0x1c,0x05,0x15,0x8e,0xe7,0x01,0x20,0x8d,
+ 0x04,0x20,0x72,0xdf,0xe7,0x72,0xa7,0xcb,0x40,0x59,0xad,0x8d,0x59,0xd0,0x14,0xdd,0xee,0xc0,0x1c,0xf1,0xd2,0x39,0x92,0x21,0x51,0x1c,0xfd,0xea,0x8f,0xb1,0x12,0x08,0x02,0x2c,0x20,0x8d,
+ 0x04,0x20,0x73,0x57,0x80,0x92,0x53,0x92,0x23,0xb9,0xa4,0x81,0xba,0x4f,0xa3,0xf7,0x50,0xd4,0x39,0x73,0x4f,0x51,0x7d,0xf7,0x9e,0xf8,0x03,0xca,0x73,0x87,0x7a,0x2a,0xf2,0x5d,0x20,0x8d,
+ 0x04,0x20,0x74,0x8a,0x0c,0xd6,0x3e,0xef,0xd3,0x45,0x1c,0x78,0x4f,0xe2,0xe9,0x4c,0xa6,0xef,0xd7,0x9c,0x78,0x5f,0x35,0x41,0x70,0x9f,0xf4,0x5e,0xd2,0x05,0x3d,0xea,0x9a,0x24,0x20,0x8d,
+ 0x04,0x20,0x74,0xd7,0x0e,0x8d,0xf4,0x71,0x2f,0x5a,0x6a,0x85,0xa6,0xb7,0x9d,0x45,0xb7,0xdd,0x42,0x49,0xb9,0x1b,0x56,0x27,0x75,0x82,0x6c,0x3f,0xd6,0xea,0x2a,0xce,0x5c,0x4e,0x20,0x8d,
+ 0x04,0x20,0x75,0xab,0x5b,0x79,0x2e,0xcd,0x4f,0x99,0x18,0xdd,0x0d,0x85,0x45,0x66,0xad,0x79,0x64,0xeb,0x02,0xdc,0x7b,0x33,0xb0,0xcf,0x24,0x9c,0x27,0x69,0x8e,0x7d,0x68,0x51,0x20,0x8d,
+ 0x04,0x20,0x75,0xf7,0xe4,0x5f,0x40,0x12,0xe0,0xb4,0x2e,0x0d,0x8f,0x53,0xeb,0xa7,0x64,0x88,0xc8,0xd8,0x87,0x1f,0xef,0x01,0xa8,0xf3,0x95,0xb7,0x6e,0xb4,0x06,0x0b,0xb0,0x48,0x20,0x8d,
+ 0x04,0x20,0x75,0xcb,0x04,0xb9,0x7e,0xde,0xfa,0x49,0x7b,0x20,0x0a,0x24,0x53,0xa5,0x69,0x06,0x14,0x3f,0xc9,0x1b,0x93,0x51,0xc6,0xa9,0x36,0x73,0x4d,0xd1,0xd3,0x36,0xfc,0xed,0x20,0x8d,
+ 0x04,0x20,0x76,0x70,0xda,0x9e,0xd4,0x27,0x5b,0xf5,0x41,0x48,0xad,0xff,0x8f,0x3b,0x49,0x81,0x3c,0x09,0xd2,0x51,0xa4,0xdf,0x4e,0x8b,0x94,0xd0,0xe9,0x81,0xe7,0x16,0x25,0x92,0x20,0x8d,
+ 0x04,0x20,0x7e,0xc4,0x76,0x1b,0x58,0x2c,0x41,0x8d,0xaa,0x87,0x1b,0x89,0xf6,0x9f,0x99,0x55,0xd9,0x0d,0x39,0xef,0xde,0x69,0xf8,0xe5,0xa1,0xfd,0x76,0x6c,0x40,0x11,0xc4,0x6e,0x20,0x8d,
+ 0x04,0x20,0x7e,0xef,0xe1,0x40,0x48,0x56,0xcf,0x61,0x9c,0x95,0x64,0x1b,0x68,0xd0,0xf2,0x40,0xcc,0x39,0x42,0xb7,0xb0,0x44,0xcc,0x2c,0x0e,0xa3,0xf9,0xfd,0x45,0xe2,0x74,0x5f,0x20,0x8d,
+ 0x04,0x20,0x7f,0x84,0x36,0x20,0xe6,0x4b,0xf1,0x4e,0x8e,0x5d,0x90,0x5e,0x5b,0x26,0x42,0x2e,0xad,0xd5,0xcf,0x10,0x34,0xec,0xe0,0x92,0x83,0xff,0x09,0xc8,0xdc,0x0c,0x98,0xd6,0x20,0x8d,
+ 0x04,0x20,0x78,0xae,0xba,0xa8,0xc0,0x0c,0x9d,0x66,0x46,0xfd,0xe0,0x7a,0x13,0x40,0xcb,0x24,0x64,0x73,0x14,0x47,0x8f,0xae,0x0a,0xc4,0xe1,0x2b,0x4d,0x14,0x0d,0xeb,0xc9,0xcb,0x20,0x8d,
+ 0x04,0x20,0x79,0x2b,0xc3,0x40,0x24,0x92,0x5a,0xc0,0x6b,0x46,0x69,0xcc,0x27,0xfb,0x87,0x48,0xc8,0xd9,0xb7,0xe2,0x2e,0xb3,0x4b,0x30,0x4b,0x29,0x39,0x6e,0xd4,0x67,0xa2,0x43,0x20,0x8d,
+ 0x04,0x20,0x79,0x61,0x1f,0xa8,0x0b,0xd9,0x0b,0x99,0xdd,0x06,0x88,0x62,0x30,0xf6,0x15,0x3b,0xb2,0xfc,0xde,0x10,0x05,0xa7,0xd1,0xe1,0x81,0x5b,0x90,0x20,0xc4,0x9a,0x63,0xfe,0x20,0x8d,
+ 0x04,0x20,0x7a,0xbb,0x69,0xc4,0xee,0x9f,0x60,0x0e,0x15,0x22,0x90,0xf9,0xbd,0xd3,0xc9,0xf5,0x59,0xf6,0xda,0x5a,0x52,0x0b,0xeb,0xd8,0x38,0xf8,0x1b,0x34,0x9f,0x3b,0x49,0xf6,0x20,0x8d,
+ 0x04,0x20,0x7b,0x50,0xc3,0x37,0x7d,0xc0,0x51,0x84,0x93,0x7f,0xfc,0x96,0xce,0xd9,0x1f,0x07,0x18,0x45,0x66,0x25,0x4a,0x1d,0x00,0xb9,0xcb,0x4f,0xca,0x77,0x03,0xc1,0x44,0xde,0x20,0x8d,
+ 0x04,0x20,0x7b,0xe8,0x9c,0x1b,0x85,0xf7,0xac,0xfc,0x6a,0x36,0x98,0xd1,0x4d,0x8d,0xd2,0x87,0x7d,0xb6,0x57,0xa7,0x12,0x18,0xc0,0x38,0x04,0xc3,0x7b,0x14,0x02,0x9c,0x54,0x39,0x20,0x8d,
+ 0x04,0x20,0x7b,0xeb,0x51,0x99,0xa7,0x44,0x53,0x31,0xc5,0x64,0x36,0xdb,0x89,0xe2,0x49,0x1f,0xfa,0x64,0xc9,0x52,0x1e,0xe5,0xc0,0xbe,0x16,0xaf,0xf9,0x08,0xb8,0x39,0x5f,0x41,0x20,0x8d,
+ 0x04,0x20,0x7c,0x6c,0xf5,0x11,0x69,0xbf,0xc8,0xc0,0xc8,0xe0,0x2b,0xcd,0x0e,0x42,0x25,0x50,0x1b,0x55,0xc0,0xa6,0xb6,0x6c,0xc3,0xe4,0xb2,0x1c,0x6b,0xbb,0xd6,0x56,0xd8,0x79,0x20,0x8d,
+ 0x04,0x20,0x7d,0xb4,0xe8,0x7e,0x95,0x2e,0xee,0x6d,0x08,0xdc,0xe7,0x38,0xea,0x43,0xc0,0x84,0x54,0xc2,0xea,0x60,0x85,0xba,0xe4,0x65,0xa6,0x39,0x02,0x88,0x50,0xf7,0xae,0x2d,0x20,0x8d,
+ 0x04,0x20,0x7e,0x29,0x06,0x05,0x28,0x59,0x42,0x9a,0x77,0xb5,0x08,0x21,0x73,0x88,0xc6,0xac,0xb5,0x16,0x5a,0x46,0x37,0x50,0xcd,0x18,0x41,0xb4,0x98,0xd0,0xd5,0x51,0x40,0xc9,0x20,0x8d,
+ 0x04,0x20,0x7e,0x57,0x37,0x18,0xa4,0x2b,0x39,0x91,0xc9,0x3f,0x64,0xee,0x38,0x74,0x4f,0xfc,0x6d,0xc7,0x7d,0xa8,0xce,0x1d,0x32,0x4c,0x1d,0xc8,0xc2,0x9f,0xbb,0x1f,0xd4,0x55,0x20,0x8d,
+ 0x04,0x20,0x87,0x2c,0x02,0x2d,0x34,0x0b,0x6c,0x29,0xfe,0x9c,0x72,0xed,0xcb,0x47,0xef,0x9d,0x07,0x4a,0x3e,0x39,0xb7,0x07,0x3a,0xdc,0x08,0x75,0xf0,0x74,0x9e,0x83,0x7b,0xfa,0x20,0x8d,
+ 0x04,0x20,0x87,0x51,0x10,0x09,0xff,0x9b,0x7b,0xf2,0xa8,0xe7,0x11,0x2c,0x03,0xd2,0xfc,0xab,0x8a,0xdc,0xaa,0x0c,0x2a,0x56,0x39,0xb8,0x12,0x87,0x8f,0xce,0xd6,0xf5,0xee,0xbc,0x20,0x8d,
+ 0x04,0x20,0x80,0x1a,0xd7,0x5b,0x43,0x0a,0xa4,0x41,0xd7,0xf6,0x32,0x38,0x9e,0x99,0xe6,0x79,0x75,0x02,0x98,0x09,0x4e,0x56,0x46,0xb0,0x5f,0xab,0x22,0x5c,0x7e,0xea,0xa6,0xba,0x20,0x8d,
+ 0x04,0x20,0x80,0xd1,0xd0,0xd7,0x2a,0x66,0x25,0x72,0x68,0x1f,0xa6,0xdb,0x6c,0x4e,0xd0,0x84,0x42,0xea,0x26,0xe6,0xf8,0xe4,0xca,0x2a,0x8a,0x29,0x74,0xc4,0x9c,0x50,0x92,0x59,0x20,0x8d,
+ 0x04,0x20,0x81,0xc1,0x1f,0x3f,0x74,0xf3,0xb0,0x47,0x85,0xa6,0x28,0x6e,0x29,0x5c,0x78,0xca,0xbe,0xd6,0x32,0xf6,0xfd,0xdb,0x85,0x72,0x49,0x45,0x26,0x96,0x36,0xff,0xcd,0x5b,0x20,0x8d,
+ 0x04,0x20,0x82,0x37,0xf9,0xfc,0x41,0x86,0x82,0xa2,0xb8,0xb0,0xab,0x10,0xc7,0x0c,0x2b,0x86,0xa0,0xc7,0x71,0x2c,0x6f,0xdb,0x44,0x57,0xa4,0xc1,0xe7,0x78,0x85,0x3a,0xda,0xf6,0x20,0x8d,
+ 0x04,0x20,0x82,0x16,0x72,0x68,0x80,0x31,0xf5,0x64,0xf1,0x13,0x72,0x4b,0xcb,0xfd,0x94,0x70,0x14,0x5d,0xcc,0x3f,0x6f,0x23,0x50,0xf6,0x77,0xe8,0x90,0x78,0x1e,0x3e,0x3a,0x8d,0x20,0x8d,
+ 0x04,0x20,0x83,0x59,0x75,0xc9,0x71,0x3b,0xa0,0xe9,0x36,0x85,0xd5,0x79,0xd8,0xc9,0x05,0x35,0x9b,0x21,0xa7,0x84,0xfe,0x6c,0xaa,0xad,0xc8,0xf4,0xe8,0x1a,0xa9,0xa3,0x37,0xc0,0x20,0x8d,
+ 0x04,0x20,0x83,0xaf,0xa3,0x57,0x29,0x66,0x82,0x7c,0xe5,0x7f,0xdf,0x95,0x53,0xaa,0x0e,0xe8,0xdb,0x1c,0x80,0x71,0xa6,0x0b,0x90,0x2c,0x59,0x3e,0xaf,0xc3,0x6c,0xb4,0xee,0x9d,0x20,0x8d,
+ 0x04,0x20,0x85,0x18,0x7c,0xc7,0x10,0xd3,0x8c,0x7b,0x86,0x34,0x90,0x17,0x31,0xbb,0x9e,0xf5,0xff,0x27,0xca,0x1e,0x39,0x86,0x4a,0xb0,0x79,0x82,0x0f,0x07,0x3c,0x44,0x82,0xa4,0x20,0x8d,
+ 0x04,0x20,0x85,0x4a,0x42,0xd1,0x75,0x04,0xf5,0xec,0x8d,0xaa,0x74,0xfb,0x7c,0x29,0x23,0x67,0xdb,0x27,0x50,0x2c,0x5c,0x4d,0xbb,0xc6,0x76,0xcc,0x19,0x2e,0xb6,0x5b,0xa1,0xb4,0x20,0x8d,
+ 0x04,0x20,0x85,0x4a,0x72,0x58,0xe4,0xc9,0x82,0x82,0x3c,0x22,0xf8,0x69,0xf7,0x2e,0x4c,0x70,0x5c,0x86,0xcf,0x6f,0x54,0x71,0xef,0xda,0x8c,0x3c,0x8f,0x88,0x3a,0x4d,0x78,0x66,0x20,0x8d,
+ 0x04,0x20,0x85,0xcd,0x65,0x5a,0xcc,0xa2,0xf6,0xbb,0x94,0x66,0x24,0xe5,0x5a,0xac,0x84,0x46,0x74,0x11,0x9d,0x10,0xe9,0xf9,0xdd,0x6e,0x30,0xfd,0xcb,0xe1,0x68,0x45,0xbd,0xc5,0x20,0x8d,
+ 0x04,0x20,0x86,0x75,0xea,0xd8,0xc4,0x81,0x2e,0x1c,0x91,0xe8,0xac,0xad,0x0f,0x87,0x02,0x7d,0x12,0x36,0x9e,0x63,0xe6,0xdf,0x19,0x33,0x9a,0xfc,0x4b,0x4f,0x13,0x60,0xad,0x8d,0x20,0x8d,
+ 0x04,0x20,0x8e,0xab,0x0f,0xe6,0x33,0x03,0xe5,0x2e,0x0e,0xfa,0x28,0x6f,0xf2,0xb3,0x77,0xc1,0xbe,0x6b,0x0c,0xd0,0xf3,0x23,0xbd,0x14,0x45,0xf5,0x1d,0x54,0x6c,0xb3,0xf1,0x46,0x20,0x8d,
+ 0x04,0x20,0x8f,0x1a,0xc8,0xcb,0x44,0xb5,0x74,0x12,0xcb,0xd9,0xe6,0x7e,0x0f,0x61,0xe2,0x26,0x3c,0xd1,0xb3,0x16,0x25,0x2d,0xd7,0xd1,0x53,0x6a,0xde,0x22,0x49,0x7b,0x26,0xba,0x20,0x8d,
+ 0x04,0x20,0x8f,0xf2,0x1b,0x6a,0x57,0xec,0x87,0xb3,0x29,0x4e,0x7e,0x9e,0xed,0x14,0x7d,0xde,0x3d,0x79,0x67,0xeb,0x68,0x9f,0x6c,0x88,0xd8,0xaf,0xbc,0x69,0xca,0x30,0xfe,0x00,0x20,0x8d,
+ 0x04,0x20,0x88,0xb7,0xdd,0x54,0x50,0xc3,0x99,0xd1,0xbf,0x4a,0xf2,0x61,0x0b,0x16,0xc1,0x27,0x89,0xaf,0xa6,0xc0,0xca,0xb6,0x89,0xb9,0x30,0xbc,0x73,0x41,0x0a,0x29,0x14,0x23,0x20,0x8d,
+ 0x04,0x20,0x88,0xb7,0xf5,0xf8,0x12,0xd3,0x33,0x5a,0x7a,0x32,0x91,0x9f,0x49,0x63,0x5b,0xa1,0xe6,0x3c,0x92,0x23,0xe8,0x87,0xb6,0xb8,0x04,0xac,0xd0,0xa9,0xd7,0xad,0x19,0xd3,0x20,0x8d,
+ 0x04,0x20,0x88,0x81,0x5e,0x13,0xd4,0xcf,0xfe,0xed,0xbb,0xd0,0xf4,0x6e,0x4b,0xc9,0x10,0x6a,0xeb,0x5f,0xcc,0xb9,0x90,0xb7,0x27,0x6a,0xc2,0xb7,0x2d,0x08,0xc9,0x0f,0x77,0xfc,0x20,0x8d,
+ 0x04,0x20,0x88,0xe9,0x14,0x02,0x7d,0x3f,0x24,0xa1,0x66,0x1f,0xc1,0x29,0x8f,0x8a,0xba,0x20,0xa1,0x1c,0x4b,0x3b,0x08,0x56,0x5a,0x3b,0xb9,0xfd,0x38,0xfd,0xfc,0xc0,0xfd,0x40,0x20,0x8d,
+ 0x04,0x20,0x89,0x14,0xf2,0x8c,0xe1,0x35,0x28,0x34,0x0b,0xd6,0x97,0x64,0x26,0xbd,0x04,0x45,0xd3,0x9f,0x61,0x1a,0x39,0x0d,0xf4,0x90,0xfb,0x5a,0x77,0x85,0x68,0x57,0x66,0xbe,0x20,0x8d,
+ 0x04,0x20,0x89,0x1f,0xbc,0xcc,0x1c,0xd9,0xa9,0x09,0x5e,0x80,0x23,0x3b,0xc4,0xa9,0x38,0xf6,0x22,0x69,0x21,0xf7,0x45,0xf7,0x03,0x9e,0xad,0x9e,0x94,0x82,0x2b,0xe5,0x71,0xd2,0x20,0x8d,
+ 0x04,0x20,0x89,0x7d,0x5f,0x12,0xdf,0x32,0x76,0x19,0xad,0x7a,0x39,0xc3,0x12,0xd7,0x25,0x0c,0x15,0xb0,0x46,0xa4,0xea,0x2c,0x3d,0xe1,0x2c,0x16,0x18,0xcb,0xe2,0xc4,0x46,0x7c,0x20,0x8d,
+ 0x04,0x20,0x89,0x8a,0x59,0xb2,0x6e,0x02,0x31,0x1a,0x07,0x7d,0x1d,0x28,0x0e,0x61,0xd5,0xca,0x54,0x5a,0x32,0x96,0xa2,0x8a,0x69,0x80,0xd8,0x57,0xf7,0x87,0x42,0x44,0x59,0x32,0x20,0x8d,
+ 0x04,0x20,0x8a,0x65,0x55,0xdb,0x7c,0x38,0x17,0xff,0x71,0x50,0xac,0xb4,0xc2,0x78,0x03,0xbf,0x68,0x2b,0x17,0x84,0xed,0x3f,0xf4,0x2e,0x1d,0x06,0x60,0xbd,0x54,0x24,0x98,0x90,0x20,0x8d,
+ 0x04,0x20,0x8b,0x7f,0x0b,0xa8,0x27,0xe3,0xe8,0xaf,0x7a,0x2d,0x0d,0xce,0x7b,0xec,0xbe,0x6c,0xca,0x2f,0x55,0x39,0x5f,0x40,0xd5,0x37,0x28,0x11,0xec,0xf3,0x43,0x74,0x5e,0x7c,0x20,0x8d,
+ 0x04,0x20,0x8b,0xb4,0xb4,0x40,0xa6,0x0a,0x5f,0x80,0x8b,0xdd,0x05,0x30,0xf8,0x89,0x87,0xb1,0x4a,0x8f,0x59,0x1f,0x50,0x98,0x34,0x08,0x79,0xae,0xf1,0xea,0x12,0x91,0x56,0x39,0x20,0x8d,
+ 0x04,0x20,0x8c,0x38,0xca,0xb7,0x97,0xab,0x66,0xd6,0x5b,0xf2,0x73,0x23,0xa0,0xa2,0x92,0xb4,0xd0,0xad,0xf6,0xb7,0x71,0x9a,0x40,0xea,0x36,0x87,0xa4,0xf7,0x53,0xa5,0xc6,0xdb,0x20,0x8d,
+ 0x04,0x20,0x8c,0x3a,0x05,0xa8,0x77,0xa0,0xd2,0x41,0xc9,0x6e,0x22,0x3b,0x4e,0xdf,0x7f,0xe1,0x01,0x29,0x82,0x0e,0xbd,0x87,0xc7,0xf6,0x43,0x4e,0xc9,0x69,0x13,0xbc,0x89,0x94,0x20,0x8d,
+ 0x04,0x20,0x8c,0x6e,0x97,0xbe,0x70,0xbd,0x71,0x72,0x43,0xd0,0xf9,0x11,0xf2,0x7a,0x1e,0x7f,0x03,0x03,0xff,0xb5,0x99,0xdc,0xb1,0x4c,0x9b,0x97,0x3a,0xb3,0x68,0xf1,0xb3,0xa1,0x20,0x8d,
+ 0x04,0x20,0x8d,0x5f,0x62,0x56,0x46,0x78,0xd0,0xfc,0xe8,0x96,0x33,0x28,0x92,0x15,0x6d,0x46,0xce,0xbf,0x94,0x37,0x5f,0x16,0xa5,0xcd,0x22,0xba,0x65,0x92,0xc4,0x59,0x1d,0xf1,0x20,0x8d,
+ 0x04,0x20,0x8d,0xc8,0x9a,0x06,0xd6,0xf7,0xc8,0x61,0x5b,0xd2,0x79,0x29,0xc4,0xd5,0xbb,0xa1,0xf8,0x7e,0x8c,0x51,0x72,0x87,0xb0,0x90,0x6e,0xb8,0x35,0x00,0xf2,0xda,0xb6,0xbe,0x20,0x8d,
+ 0x04,0x20,0x96,0x8f,0xa3,0x0d,0x59,0xeb,0x15,0xc8,0x44,0xa2,0x32,0x08,0x27,0x08,0x2a,0x53,0x80,0xf9,0x1e,0x99,0x91,0x7a,0xcb,0xb7,0xa2,0x5f,0xbe,0xf9,0xe4,0xd3,0x8c,0x2b,0x20,0x8d,
+ 0x04,0x20,0x96,0xd4,0x2a,0xb8,0x45,0x35,0x4e,0x55,0x83,0x3c,0x73,0x95,0xbc,0xdf,0x07,0x82,0xe7,0xb5,0x0b,0x3d,0xcd,0x9a,0x49,0x5e,0x9b,0x85,0x35,0xab,0xb1,0x4c,0xba,0x80,0x20,0x8d,
+ 0x04,0x20,0x97,0x24,0x0c,0xbd,0xa4,0x97,0xbf,0x18,0x1a,0xea,0x59,0x7a,0xbf,0x42,0x26,0xca,0x32,0x0c,0x53,0x0c,0x80,0xf4,0x22,0x1e,0x3d,0xce,0xc6,0xdb,0x41,0x3a,0x9b,0x9a,0x20,0x8d,
+ 0x04,0x20,0x97,0x27,0xe2,0x3a,0x34,0xf0,0x79,0x79,0x7e,0x98,0x4f,0x1f,0xf0,0x9e,0x0e,0x0e,0xff,0xb0,0x6a,0x54,0x3c,0xfe,0x63,0x04,0x80,0x11,0x2a,0x85,0xd9,0x3f,0xee,0x97,0x20,0x8d,
+ 0x04,0x20,0x97,0xe8,0xe3,0x19,0x4c,0x95,0x68,0x72,0x97,0x8a,0xd4,0x7a,0x96,0xcc,0x42,0x47,0x53,0x68,0xd9,0xa9,0x31,0x83,0xa5,0x6b,0x36,0x36,0xe5,0xc2,0x33,0xf7,0x3f,0x51,0x20,0x8d,
+ 0x04,0x20,0x90,0x13,0x63,0xb6,0xb1,0x06,0x9f,0x80,0xee,0x5e,0xdb,0xd0,0xda,0x19,0x60,0x5a,0x28,0xdf,0xfa,0xc2,0xbd,0xcf,0x92,0xd0,0x1d,0x4f,0x7e,0x8c,0x37,0x77,0xfd,0x85,0x20,0x8d,
+ 0x04,0x20,0x90,0x30,0x0a,0x03,0xdd,0x3a,0x00,0x24,0xa6,0xd5,0xbd,0xd4,0x9b,0x35,0xe3,0xf1,0x04,0x9b,0x3a,0xda,0x9d,0x7c,0xaf,0xa2,0x8f,0xdd,0x77,0x28,0x92,0x00,0xe8,0xa1,0x20,0x8d,
+ 0x04,0x20,0x93,0x38,0xc2,0x74,0x27,0xa6,0xad,0x8f,0x06,0x9c,0xb7,0x76,0x4d,0x58,0xa5,0x52,0x00,0xb0,0x48,0x27,0xf1,0x5a,0x94,0x54,0xbb,0xd0,0x60,0x93,0xa5,0xa9,0x58,0x7d,0x20,0x8d,
+ 0x04,0x20,0x93,0xf3,0x65,0x80,0x66,0x54,0xcd,0xe9,0xc0,0x3c,0x65,0x1f,0x3c,0x2c,0xb4,0x1b,0xa0,0x0b,0xcb,0x26,0xcf,0x0e,0xe5,0xaa,0x45,0x9c,0x71,0x86,0x35,0x93,0x74,0x3d,0x20,0x8d,
+ 0x04,0x20,0x94,0x58,0x2a,0xc3,0x0c,0x25,0x8a,0x4c,0x35,0x63,0x33,0x8e,0xaa,0x71,0xf1,0xf5,0xa3,0x77,0x4e,0x83,0x2e,0x37,0xc5,0x96,0x29,0x93,0x9c,0x49,0xea,0x75,0x94,0x68,0x20,0x8d,
+ 0x04,0x20,0x94,0xfc,0x29,0xc9,0x1d,0xa6,0x6a,0xe0,0x96,0x10,0xfc,0x41,0x01,0x6a,0xc1,0xca,0xbf,0x37,0xb4,0x86,0x95,0x56,0x41,0xd9,0xcf,0x60,0x48,0x6c,0x16,0xe7,0x7a,0xb4,0x20,0x8d,
+ 0x04,0x20,0x95,0x2c,0x3a,0xf4,0x20,0x3f,0x68,0x36,0x4e,0x68,0x8e,0xfb,0x76,0x62,0xd2,0xd7,0x80,0x63,0x94,0xb8,0xf3,0x87,0xc2,0x25,0xd2,0xb9,0x4f,0xd5,0xfc,0xc6,0x81,0x03,0x20,0x8d,
+ 0x04,0x20,0x95,0x5d,0xcb,0x45,0x86,0x7f,0x99,0x61,0x7b,0x89,0x58,0xb3,0xb6,0x38,0x17,0x39,0xc5,0x9b,0x04,0x7c,0xc5,0x2c,0xc8,0xa1,0x5c,0x94,0x82,0x09,0x06,0x4b,0x7f,0xba,0x20,0x8d,
+ 0x04,0x20,0x96,0x2d,0x61,0x8b,0xf8,0x6f,0x35,0x07,0x1d,0xf0,0xa2,0x82,0x71,0xb6,0xed,0xd3,0xe6,0xca,0xfb,0x9b,0xe2,0xe9,0xd2,0xdd,0x04,0xa3,0xa1,0x0d,0xfc,0x55,0x87,0xe6,0x20,0x8d,
+ 0x04,0x20,0x96,0x47,0xa6,0xe0,0x3d,0xae,0xed,0x69,0x1c,0x3e,0x4c,0x06,0xa0,0x17,0x3c,0x55,0x1d,0x4a,0xd0,0x70,0xde,0x5b,0xb6,0x6e,0xa2,0xdf,0xbf,0x10,0x0e,0xe3,0x47,0x86,0x20,0x8d,
+ 0x04,0x20,0x9e,0xfb,0x9b,0xe5,0x1e,0x0b,0x27,0x0d,0x69,0x96,0x1b,0x30,0x6c,0x25,0xcf,0x3b,0x6b,0x3f,0xd8,0x95,0xac,0x6e,0x26,0x34,0x5a,0x7f,0x8d,0xc7,0x25,0xf6,0x3c,0xdc,0x20,0x8d,
+ 0x04,0x20,0x98,0x9d,0x1a,0xcb,0x18,0x3a,0x33,0x46,0x13,0x9d,0xf2,0x6e,0x89,0xf1,0x96,0xbc,0x35,0x33,0x41,0x4a,0xd6,0xb5,0x26,0xb2,0x39,0xe3,0xd0,0x4c,0x81,0x64,0x4f,0x6a,0x20,0x8d,
+ 0x04,0x20,0x99,0x27,0xc2,0x11,0x1d,0xa2,0x17,0x31,0x0c,0x7b,0x9f,0x8d,0x64,0x12,0x9d,0x3c,0x4a,0xc2,0xeb,0x49,0x22,0xbb,0x77,0xb7,0x31,0xa4,0x88,0xa4,0x9d,0x39,0x98,0x23,0x20,0x8d,
+ 0x04,0x20,0x99,0x8c,0x16,0x01,0x57,0xcc,0x47,0xf4,0xb1,0xc5,0x9f,0x54,0xda,0xa8,0xd1,0x87,0x6a,0x68,0x1b,0xa8,0x04,0x78,0x32,0x9c,0x30,0x4f,0x36,0x43,0xd5,0x0c,0xb8,0x6a,0x20,0x8d,
+ 0x04,0x20,0x99,0xe7,0x94,0xd3,0x88,0xcf,0x6b,0x89,0x89,0x3d,0x56,0xf4,0x64,0x5e,0x7b,0xc8,0x0d,0x09,0x02,0x98,0x56,0xcd,0x58,0x0a,0xd7,0xc3,0x04,0x12,0xea,0x87,0xd0,0xda,0x20,0x8d,
+ 0x04,0x20,0x99,0xee,0xe0,0x4b,0xc9,0x44,0x7a,0x96,0x2a,0x2e,0x46,0x51,0x66,0x20,0x82,0xac,0x55,0x3a,0x00,0x71,0xf2,0xf6,0x4e,0xa9,0x0f,0x3d,0xfe,0x4f,0x02,0xc7,0xea,0x12,0x20,0x8d,
+ 0x04,0x20,0x9a,0x0c,0xb7,0x33,0x0e,0x64,0x67,0x64,0x19,0x8e,0xbf,0x16,0x0c,0x8e,0xbd,0x09,0x60,0x2a,0x0a,0x50,0xd5,0xd2,0x86,0x22,0x6b,0x97,0xeb,0x5d,0x0b,0xeb,0x1b,0x8a,0x20,0x8d,
+ 0x04,0x20,0x9a,0xaf,0x7d,0x16,0xb9,0xe0,0xec,0x86,0x6d,0x52,0x87,0xb8,0x90,0x8b,0x84,0xcb,0xa6,0x36,0xfe,0x6c,0x01,0xde,0x23,0x1a,0x95,0x1b,0x5f,0x11,0xdd,0x26,0x66,0xbe,0x20,0x8d,
+ 0x04,0x20,0x9b,0xd2,0xbc,0x32,0x43,0x02,0xf0,0x0b,0x2f,0xd0,0xc5,0xb8,0xa9,0x88,0x09,0xe7,0x98,0xd0,0xf6,0x4b,0xc9,0x90,0xb7,0x79,0x8e,0x45,0x8e,0xaf,0x60,0xf2,0x92,0x69,0x20,0x8d,
+ 0x04,0x20,0x9d,0xc0,0x03,0xc0,0xea,0xf7,0x58,0xdb,0xe4,0x6d,0x0b,0xa1,0xe3,0xdb,0xe1,0xf9,0xa0,0xd4,0xd6,0x7c,0x04,0x9f,0x07,0x69,0x0a,0xa7,0x76,0xb5,0x77,0xf5,0x50,0xfe,0x20,0x8d,
+ 0x04,0x20,0x9e,0x6e,0x55,0x14,0x89,0x66,0x57,0xed,0xf2,0x10,0xc0,0x44,0xff,0x08,0xaa,0xb7,0xf8,0x7c,0xc7,0x1e,0x28,0x77,0xfd,0x06,0x58,0xf2,0xc5,0xbf,0xc8,0x8c,0x24,0x0c,0x20,0x8d,
+ 0x04,0x20,0xa6,0xb9,0xb0,0xb4,0xbb,0x7f,0x79,0x45,0x93,0x94,0x6f,0x54,0x39,0x64,0x5b,0x6f,0x46,0x2a,0xbd,0x3c,0x73,0x8a,0x33,0x06,0x9d,0xcc,0x15,0x68,0x44,0x4a,0x22,0x64,0x20,0x8d,
+ 0x04,0x20,0xa6,0x9a,0x97,0xdd,0x94,0xcc,0xa6,0x4c,0x61,0x8f,0xbc,0x33,0xdc,0xbd,0x9f,0x06,0xa3,0xb1,0x05,0xb6,0x78,0xbf,0x46,0x94,0xca,0xec,0x35,0x8d,0xae,0x76,0xc7,0x14,0x20,0x8d,
+ 0x04,0x20,0xa6,0xc8,0x38,0xcf,0x24,0x1d,0x7b,0x36,0x65,0x19,0x03,0x16,0x9f,0x37,0x8a,0x63,0xcb,0x16,0xf0,0x8a,0xad,0xca,0x97,0xe4,0x14,0xbb,0xb1,0xc4,0xbe,0x5b,0x74,0x72,0x20,0x8d,
+ 0x04,0x20,0xa6,0xe0,0x7b,0xd8,0x61,0x62,0x55,0x2d,0x1c,0x25,0x75,0x20,0x2a,0xb8,0x96,0x09,0x40,0x34,0xba,0x62,0x31,0x5a,0xbf,0x77,0xc0,0x38,0x77,0xb4,0x33,0x1c,0x03,0x41,0x20,0x8d,
+ 0x04,0x20,0xa7,0x04,0x38,0x9a,0x21,0x60,0xdb,0x7c,0xd8,0x51,0x28,0x88,0x90,0x89,0xea,0x70,0xb7,0x43,0x50,0x8e,0xa2,0xfb,0xa0,0xa2,0x22,0x97,0x8e,0x52,0x25,0x66,0x2b,0xd5,0x20,0x8d,
+ 0x04,0x20,0xa0,0xa6,0x1a,0xaa,0x6d,0xf4,0x5f,0x11,0xf6,0x20,0xd8,0x72,0xb6,0x5f,0x4d,0x59,0x9d,0x1d,0xb1,0xa4,0x5e,0x93,0x4f,0x79,0x04,0x4e,0x14,0x59,0xae,0x2e,0x2a,0xf1,0x20,0x8d,
+ 0x04,0x20,0xa1,0x0c,0x9c,0x3d,0x58,0x98,0x3b,0xda,0x68,0xfd,0x7c,0x81,0x05,0xd0,0x4f,0x76,0xe4,0xcd,0x9e,0x34,0x64,0xb0,0x6e,0x63,0xf0,0xd7,0x15,0x7b,0x6d,0x77,0x9a,0x95,0x20,0x8d,
+ 0x04,0x20,0xa1,0x95,0x0d,0xa9,0x7e,0xa3,0x52,0xce,0xd4,0xbf,0x9e,0xd7,0xc1,0x11,0xa9,0x97,0xf6,0x24,0x02,0x50,0x85,0x22,0x38,0x33,0x02,0xe6,0x51,0xd4,0xcc,0x3d,0xfd,0xf4,0x20,0x8d,
+ 0x04,0x20,0xa2,0x38,0x8d,0x2e,0x64,0x39,0x44,0x75,0x6c,0xaa,0x6f,0x8b,0x29,0x02,0x3c,0x83,0xb7,0xba,0xfe,0x18,0x26,0xe6,0x47,0x65,0x4c,0xc1,0x8e,0x9a,0x9a,0x01,0xb0,0x74,0x20,0x8d,
+ 0x04,0x20,0xa3,0x7e,0x09,0x5b,0x37,0xe1,0x92,0x4c,0x33,0x49,0x37,0x1b,0xee,0x9d,0xfb,0x6b,0x0c,0x5a,0x9f,0xbc,0x79,0xd4,0x87,0xfe,0x09,0x7d,0x06,0x40,0x25,0x83,0x50,0xcf,0x20,0x8d,
+ 0x04,0x20,0xa4,0x95,0xe9,0x6f,0x0a,0x2e,0x61,0xa6,0x3a,0xdf,0x13,0x2f,0xee,0xe7,0x00,0x81,0x44,0xa1,0xa4,0x59,0x52,0xbc,0x06,0x33,0x6e,0x24,0x05,0x28,0xa1,0x78,0xf5,0x6d,0x20,0x8d,
+ 0x04,0x20,0xa4,0x96,0xa4,0x92,0xd0,0x3f,0x70,0x08,0x3e,0x71,0x2e,0xd6,0x36,0x19,0x09,0xb5,0x1b,0x7d,0x5f,0x38,0x78,0x01,0x3c,0x62,0x4e,0x51,0x64,0x13,0x95,0x4d,0x83,0xa3,0x20,0x8d,
+ 0x04,0x20,0xa4,0xa7,0xfd,0x67,0x76,0x91,0x88,0x51,0x25,0x45,0xc0,0x43,0xa0,0x84,0xf8,0xa3,0xf5,0x91,0x0d,0x03,0xc8,0xef,0x99,0x70,0x0c,0x9a,0xf1,0xfa,0x06,0xba,0x5a,0x4c,0x20,0x8d,
+ 0x04,0x20,0xa6,0x6e,0x88,0x1c,0x92,0xf2,0xa4,0x50,0xb1,0x7d,0xbf,0xf9,0xc9,0xd7,0xa1,0x7a,0xa6,0x92,0x1d,0xc4,0x1f,0xbe,0xbd,0x94,0x24,0x23,0x8b,0xbb,0xc3,0x17,0x87,0x1f,0x20,0x8d,
+ 0x04,0x20,0xae,0xf5,0xf1,0x37,0x32,0xb7,0xca,0x72,0x21,0x9e,0xd9,0x89,0xa7,0x77,0x95,0x74,0xcd,0x90,0x47,0x0f,0x8d,0x49,0xca,0x4a,0xf9,0x80,0x2a,0xec,0x90,0x56,0x15,0x1b,0x20,0x8d,
+ 0x04,0x20,0xa8,0x02,0x67,0xf1,0x1f,0x5d,0x19,0xe5,0x09,0x57,0xf4,0xda,0x10,0xf4,0xc1,0x68,0xb5,0x2a,0x8f,0x65,0x29,0x1c,0x1d,0x8c,0x4e,0x8d,0x62,0xe8,0x0a,0xec,0x26,0xde,0x20,0x8d,
+ 0x04,0x20,0xa8,0x14,0xc8,0x00,0x55,0x8a,0xab,0xba,0x95,0xce,0x87,0xa5,0xf9,0x13,0x70,0xf4,0x67,0x89,0xd2,0xbd,0x7a,0xbe,0xe3,0xbb,0xbe,0x8f,0x83,0xc8,0x1d,0x7c,0x64,0x0a,0x20,0x8d,
+ 0x04,0x20,0xa8,0x9c,0x2f,0xac,0x6b,0x58,0xbd,0x83,0x60,0x6a,0x40,0x09,0xe6,0x39,0xf7,0x29,0xe8,0xd2,0x0c,0xc2,0x7a,0x42,0x79,0x7b,0x6c,0x53,0x3d,0x5f,0xce,0x28,0xa8,0xf8,0x20,0x8d,
+ 0x04,0x20,0xa8,0xb3,0x7b,0x4d,0x2b,0x52,0x16,0x49,0x9e,0x96,0xfe,0x23,0x02,0xb4,0x43,0xea,0xd4,0x5c,0xf9,0x25,0x91,0x14,0xbb,0x8a,0x1b,0x0f,0x31,0x82,0x1b,0xd7,0x5d,0x56,0x20,0x8d,
+ 0x04,0x20,0xa9,0x0c,0xbf,0x09,0x88,0xca,0xdc,0x38,0x52,0xc0,0xb5,0x9b,0xa3,0x26,0x65,0xba,0xdc,0x07,0xe8,0xed,0x81,0xc5,0xcc,0x3e,0xdc,0x64,0x33,0x3f,0xc1,0x67,0x52,0xdc,0x20,0x8d,
+ 0x04,0x20,0xa9,0x40,0x1a,0xbc,0x3d,0x96,0xc4,0x18,0xfd,0x65,0x13,0x50,0xce,0x8b,0xc9,0x7d,0x57,0x2e,0xed,0xfd,0x2f,0x2a,0xdc,0x91,0x61,0xa7,0xfb,0x73,0x51,0x86,0xec,0x29,0x20,0x8d,
+ 0x04,0x20,0xa9,0x63,0xba,0xbf,0x68,0x2c,0x65,0x80,0x76,0x99,0x2d,0xa3,0xe5,0x39,0xee,0x5b,0x8e,0x65,0x9e,0x3c,0x04,0x9d,0xd3,0xcd,0x8e,0xfa,0x65,0xd2,0x61,0xae,0xd9,0x63,0x20,0x8d,
+ 0x04,0x20,0xa9,0xa4,0x0d,0x47,0x4b,0x73,0xa8,0x41,0x93,0x86,0x8f,0xc7,0x52,0x8d,0x72,0x87,0x75,0x1a,0x85,0xe3,0x1a,0x17,0x3c,0xfa,0x3d,0x8d,0x9e,0x98,0x59,0xe3,0x66,0x59,0x20,0x8d,
+ 0x04,0x20,0xab,0x3d,0x24,0x57,0xa9,0x5f,0x6c,0x70,0xeb,0x50,0x84,0x6e,0x4f,0x74,0x4d,0xa4,0xf7,0x49,0x89,0x86,0x03,0xbf,0x30,0x25,0x4d,0x28,0xd9,0x3e,0x40,0x2a,0x90,0xe9,0x20,0x8d,
+ 0x04,0x20,0xab,0x1c,0x14,0x86,0x08,0xe0,0x9d,0x2d,0x7a,0x87,0xe3,0xdb,0x33,0x20,0x8b,0xbe,0x64,0xcf,0x4a,0xdb,0xe6,0x4f,0x05,0xa2,0xa9,0x01,0x0d,0x96,0xbd,0x70,0x4a,0xe5,0x20,0x8d,
+ 0x04,0x20,0xab,0x31,0x92,0xae,0x37,0x27,0x76,0xb8,0xe5,0x25,0x47,0x84,0xd9,0x17,0xbf,0x47,0x06,0xea,0xb5,0x13,0xc3,0xd2,0x7c,0x3a,0xaa,0x3f,0x67,0xe9,0xfd,0x6d,0xda,0xfc,0x20,0x8d,
+ 0x04,0x20,0xab,0xbd,0xfd,0xa9,0x19,0x3d,0x55,0xed,0x5a,0xe3,0x92,0x29,0xe1,0x17,0xb1,0x33,0x00,0xf5,0x4e,0xf7,0xd2,0xff,0x99,0xde,0xb9,0x2c,0x9a,0x3a,0x7a,0x4f,0x0f,0x68,0x20,0x8d,
+ 0x04,0x20,0xab,0x94,0xc5,0xf5,0xfd,0xe1,0x9d,0x0f,0xec,0xb4,0x1b,0xdd,0xa8,0xe6,0x30,0xd1,0x4d,0x72,0x29,0xae,0x02,0x7d,0xc0,0xfb,0x8b,0x80,0xb8,0x7a,0xc1,0xc7,0x22,0xe4,0x20,0x8d,
+ 0x04,0x20,0xac,0x2f,0xa9,0x9f,0xf3,0x9f,0x9a,0x63,0x6d,0xb4,0x12,0x2e,0x3c,0xae,0xb6,0xe7,0x43,0xf6,0x83,0x89,0xec,0xa2,0xab,0x0a,0x0b,0x33,0xb9,0x54,0x5e,0xbd,0x52,0x3b,0x20,0x8d,
+ 0x04,0x20,0xac,0xce,0x37,0xc9,0x6e,0x77,0x03,0x51,0xc1,0x66,0xc3,0x0f,0x9f,0xc6,0x05,0x71,0x6d,0xed,0xa6,0xba,0x41,0x28,0x48,0x02,0xde,0x43,0x6f,0x19,0xf5,0xc2,0x3f,0xc6,0x20,0x8d,
+ 0x04,0x20,0xad,0x12,0xd2,0x90,0xbe,0xdb,0x4f,0x56,0x6c,0xa3,0xc1,0x74,0x5b,0x2a,0x26,0xb0,0xc2,0x6b,0xf1,0x8e,0xaf,0x56,0x57,0xca,0x56,0x6b,0xd0,0xc0,0x9f,0x15,0xd4,0x31,0x20,0x8d,
+ 0x04,0x20,0xad,0x52,0xf0,0x0c,0xac,0x35,0x9c,0x25,0x6e,0x07,0x57,0x98,0x3c,0x66,0x28,0x12,0x16,0x69,0x04,0xc0,0xca,0x8d,0x5b,0x4f,0xfd,0x69,0x70,0x7b,0xa1,0x7d,0xb3,0x8d,0x20,0x8d,
+ 0x04,0x20,0xad,0xf1,0x28,0x47,0xa5,0xdd,0x98,0x26,0xb5,0x6a,0x14,0xf6,0x9f,0xad,0xef,0x4a,0x1b,0x8c,0x7e,0xac,0x43,0x4b,0xf8,0x13,0x53,0x9d,0x9f,0x22,0xde,0x37,0x9a,0x43,0x20,0x8d,
+ 0x04,0x20,0xae,0x56,0x40,0x4d,0xa2,0xb9,0x96,0x0c,0x97,0x16,0xf1,0x7c,0xa2,0x41,0x1b,0xd7,0xfc,0x5d,0x1c,0x96,0x32,0x24,0xe7,0xa0,0x77,0x3e,0x99,0x7d,0xd2,0xf4,0xe2,0x0a,0x20,0x8d,
+ 0x04,0x20,0xb6,0xa1,0x54,0xdd,0xba,0x22,0xd3,0x1e,0x9b,0x52,0xf3,0x78,0xf6,0xe2,0x1a,0xfa,0x6d,0x8c,0x0e,0x64,0x91,0x46,0x9d,0x65,0x7e,0x54,0xb3,0xb1,0x02,0x0e,0x83,0x11,0x20,0x8d,
+ 0x04,0x20,0xb6,0xc2,0xaf,0x27,0xaa,0xee,0xca,0xcb,0xf3,0x05,0xe7,0xd0,0x8f,0x2d,0x20,0xf5,0x65,0x33,0x2b,0x5e,0xea,0x2f,0x4c,0x44,0xcb,0x3b,0xd0,0xbe,0xf0,0x48,0x88,0x9d,0x20,0x8d,
+ 0x04,0x20,0xb7,0x1e,0x2b,0xd4,0x90,0xf3,0x25,0x26,0xab,0xe4,0x31,0xbc,0x3a,0x46,0xdf,0x68,0xf2,0xd9,0xfc,0x43,0xfb,0xca,0xde,0xc3,0x65,0xf5,0x25,0x0e,0xc0,0xcc,0xbf,0x26,0x20,0x8d,
+ 0x04,0x20,0xb7,0xe9,0x76,0x85,0xee,0xfb,0x7a,0x45,0x45,0x69,0x9b,0x7e,0x0c,0x1e,0x2c,0x88,0x53,0x02,0x0c,0xbf,0xca,0x2e,0xfc,0x2d,0x32,0x8d,0xb4,0x13,0xfb,0xe5,0xa8,0x4b,0x20,0x8d,
+ 0x04,0x20,0xb0,0x12,0x68,0x3f,0x4a,0xbe,0xf4,0x7d,0x58,0x81,0xdc,0x06,0x19,0x03,0x91,0xa2,0x1b,0xcc,0xed,0xeb,0xb8,0x8d,0xfb,0x8e,0x65,0x27,0xfb,0x47,0x48,0xcc,0xb6,0xde,0x20,0x8d,
+ 0x04,0x20,0xb0,0x5f,0xab,0x43,0x1b,0x87,0x29,0x9c,0xbd,0x12,0xd7,0x8b,0xf3,0xd4,0x80,0x72,0xaa,0x12,0xf5,0x2d,0x56,0xf3,0xcd,0x49,0x21,0xaf,0xa8,0x0a,0x5a,0x1e,0x76,0x36,0x20,0x8d,
+ 0x04,0x20,0xb0,0xe5,0x84,0x11,0xd5,0x9c,0xe6,0x97,0x1b,0x47,0x18,0xc2,0x2e,0x35,0xd0,0xdd,0xc6,0x8c,0x4d,0x12,0xfb,0x4f,0x45,0xf5,0x52,0xd4,0x50,0x4e,0x3d,0x64,0x29,0x37,0x20,0x8d,
+ 0x04,0x20,0xb1,0x68,0x51,0x13,0xfa,0x0b,0x54,0x70,0x13,0xfd,0x46,0x1a,0x37,0x85,0x07,0xcc,0x7f,0xeb,0x8b,0xcd,0x59,0x0e,0x7c,0xa0,0xf1,0x6b,0x20,0x38,0x63,0x57,0x64,0x69,0x20,0x8d,
+ 0x04,0x20,0xb1,0xf6,0x21,0xc9,0xa9,0xc2,0xeb,0x18,0x9c,0x2d,0x44,0xbf,0xb2,0xe2,0x32,0xc7,0x76,0x5c,0x15,0x40,0x49,0xc2,0x5f,0x8d,0x6e,0x0a,0x44,0x24,0xbf,0xa9,0xe9,0x2b,0x20,0x8d,
+ 0x04,0x20,0xb1,0xfa,0x87,0xad,0xc8,0x91,0x27,0x8b,0xa2,0x19,0xa4,0xca,0x3e,0xa8,0x1a,0xb9,0x5e,0xd2,0xca,0x59,0x99,0xec,0x41,0x59,0xcc,0x66,0x24,0x87,0xed,0x22,0x08,0x37,0x20,0x8d,
+ 0x04,0x20,0xb3,0x4f,0x12,0xa7,0x69,0xab,0xca,0xeb,0x40,0x1c,0xc1,0x78,0xcd,0xf4,0xe0,0x12,0x34,0x9b,0x9a,0xf0,0xd4,0xe8,0x64,0xc5,0x07,0xfc,0xf4,0xaf,0xa3,0x29,0xdf,0xbf,0x20,0x8d,
+ 0x04,0x20,0xb3,0x84,0xa5,0x22,0x4e,0xe8,0x0a,0x7e,0x7c,0xcf,0x78,0x17,0x05,0xe2,0x30,0x18,0xde,0x90,0x14,0xd3,0x87,0x65,0x89,0x51,0xea,0x1a,0x2d,0x69,0x41,0xbe,0x39,0xa1,0x20,0x8d,
+ 0x04,0x20,0xb4,0x4e,0x85,0x5d,0x4f,0xb4,0xa4,0x7d,0x25,0xbb,0x13,0x10,0x28,0x9b,0x2f,0x45,0x80,0x6a,0xdf,0x76,0x2d,0x62,0x18,0xb9,0x20,0x88,0x36,0xd2,0x05,0x76,0x06,0x8e,0x20,0x8d,
+ 0x04,0x20,0xb4,0xbb,0xa3,0xe9,0xa1,0x53,0x68,0x19,0x74,0xf6,0x8a,0xd4,0x01,0xfe,0x71,0x9c,0x5f,0x4d,0x83,0xaa,0x84,0x13,0x34,0x20,0xdf,0x25,0x17,0x65,0x1b,0xff,0xff,0x6b,0x20,0x8d,
+ 0x04,0x20,0xb4,0xc7,0x93,0x5b,0x9e,0xb8,0x70,0x34,0x53,0xe2,0xe5,0xfa,0xe4,0xe2,0xa2,0xe6,0x7d,0x47,0xb3,0x13,0xa0,0x0c,0x72,0x63,0xea,0xf3,0x4e,0xf0,0x01,0xb3,0x63,0x2c,0x20,0x8d,
+ 0x04,0x20,0xb5,0xdb,0x05,0x00,0x68,0xfb,0x22,0x70,0x05,0x33,0xfe,0xb4,0xb9,0xd5,0x3b,0x77,0x73,0x46,0x0d,0x69,0x20,0x2c,0x45,0x17,0xe6,0x57,0x64,0xb1,0x40,0x5a,0x28,0xc2,0x20,0x8d,
+ 0x04,0x20,0xbe,0x99,0x8f,0x18,0xc6,0x26,0x21,0xa5,0x0c,0x77,0x8e,0x82,0x01,0xef,0x57,0xf2,0xe8,0x00,0xd2,0x57,0xb0,0xc2,0x01,0x75,0x34,0x83,0xf9,0x9b,0x65,0x30,0xbe,0x1d,0x20,0x8d,
+ 0x04,0x20,0xbe,0x9b,0xf9,0x28,0x32,0x00,0xa8,0x18,0xe6,0x4d,0xa8,0xd3,0xdc,0xca,0x71,0xf4,0x93,0x23,0x66,0xad,0xf7,0x9e,0x3d,0x4d,0x4c,0xc8,0x47,0x9c,0xff,0x3d,0x79,0xd9,0x20,0x8d,
+ 0x04,0x20,0xbe,0xe4,0x29,0x2b,0xd7,0xe9,0x5d,0x2f,0x1d,0xae,0x42,0xfb,0xa6,0x6e,0xc4,0x21,0xcf,0xb2,0x90,0x85,0x85,0x93,0x5f,0xce,0x11,0x2a,0x49,0x17,0x49,0xd0,0x1d,0x46,0x20,0x8d,
+ 0x04,0x20,0xbf,0x19,0x64,0x59,0x52,0x4f,0x5e,0x45,0xfb,0xfa,0x59,0x86,0xc9,0x5c,0x53,0x5c,0xda,0x40,0x2c,0x39,0x18,0x37,0xc1,0x0f,0x54,0x8f,0xae,0xd6,0x1f,0x8e,0xd9,0xcc,0x20,0x8d,
+ 0x04,0x20,0xb8,0x60,0x1c,0x77,0xc4,0x14,0x0f,0x98,0x5b,0xa4,0xd7,0x41,0x04,0xf9,0x23,0xf8,0x77,0x3f,0x85,0x57,0x77,0xd4,0x7a,0x9f,0x7f,0x49,0x8c,0x92,0x1e,0x4f,0xc1,0xfe,0x20,0x8d,
+ 0x04,0x20,0xb8,0x6e,0x79,0xd4,0xd9,0xc7,0x10,0xac,0x59,0x0c,0xfe,0x56,0x4a,0x0a,0x81,0x93,0x57,0xf2,0x16,0x0e,0xb0,0xdd,0x0a,0x28,0xa9,0x37,0x18,0xac,0xcb,0x92,0x8f,0xaa,0x20,0x8d,
+ 0x04,0x20,0xba,0x19,0x26,0xb6,0x08,0x2c,0x9f,0x05,0x46,0xaa,0x19,0x03,0x28,0xdd,0x86,0x36,0x57,0x4f,0x70,0xf2,0xba,0x5f,0xb8,0x5b,0xbd,0xa3,0xa4,0x55,0xd4,0x26,0x7f,0x55,0x20,0x8d,
+ 0x04,0x20,0xba,0xf7,0x25,0xa5,0x9b,0x7b,0x68,0xb0,0xa7,0xed,0x8e,0x5e,0xf5,0x0b,0x85,0x6d,0xa7,0x72,0x4d,0x8f,0xc6,0xb9,0x1c,0xae,0x90,0xbc,0x79,0x4c,0x3f,0x60,0xa3,0x66,0x20,0x8d,
+ 0x04,0x20,0xbb,0x23,0xd2,0x3c,0x76,0xa5,0x70,0xbb,0x48,0x95,0xcc,0x37,0xa7,0x59,0x07,0x55,0xd5,0x60,0x23,0x06,0x3c,0x43,0xc6,0x26,0x92,0x2b,0x83,0xf1,0x80,0x0c,0x4b,0x30,0x20,0x8d,
+ 0x04,0x20,0xbb,0x78,0x28,0x84,0xe9,0xc6,0x04,0x14,0xe9,0xe0,0xdc,0x29,0x5f,0x6f,0x7b,0x46,0xae,0xf6,0x48,0x41,0xcc,0x8e,0xc9,0x48,0x27,0xa0,0x8e,0x2f,0xf0,0x7e,0xa3,0xce,0x20,0x8d,
+ 0x04,0x20,0xbb,0xc7,0x29,0xf9,0x7a,0x10,0x56,0x07,0x86,0x3c,0xa0,0x51,0xaa,0x86,0xad,0xd1,0xc3,0x18,0xf5,0x9c,0x92,0x57,0xd1,0xfd,0x11,0x7e,0x43,0xdc,0x2f,0x2e,0xd6,0x94,0x20,0x8d,
+ 0x04,0x20,0xbc,0x47,0xc7,0x7c,0x32,0xfe,0xbf,0xa7,0x84,0xf0,0x9c,0xe1,0x9c,0xd0,0x65,0x78,0xf2,0x9a,0xe5,0xcf,0x10,0x66,0x35,0x5c,0x97,0x22,0x49,0x40,0x9e,0x68,0x32,0x26,0x20,0x8d,
+ 0x04,0x20,0xbc,0xfa,0xf9,0xe8,0xcd,0xd4,0x1a,0xf8,0xe7,0xb5,0xa8,0xc2,0x49,0xf1,0xfc,0xb1,0x8b,0xb2,0x24,0x30,0xff,0xcd,0x40,0x63,0xa5,0xca,0x57,0x73,0x37,0xe3,0x63,0x73,0x20,0x8d,
+ 0x04,0x20,0xbc,0xd1,0xc5,0x0d,0x7c,0x72,0x65,0x2e,0x75,0xc8,0x77,0x4e,0x08,0xe4,0xc7,0x21,0x3f,0x98,0xea,0xc7,0xcb,0xba,0x66,0xf3,0xe5,0xff,0x22,0x63,0xf0,0xfb,0xaa,0xe1,0x20,0x8d,
+ 0x04,0x20,0xbe,0x79,0xed,0xa8,0xc3,0x91,0xc8,0xf4,0x97,0xe6,0x9b,0x65,0x74,0x05,0x20,0x73,0x26,0x1a,0x2a,0x47,0xd5,0x85,0xce,0x7e,0xe6,0x05,0x99,0x15,0xf0,0x21,0x28,0x72,0x20,0x8d,
+ 0x04,0x20,0xc0,0x52,0x8d,0x4a,0x55,0x17,0x12,0x4e,0x0a,0x19,0x08,0x07,0xa7,0x8b,0x31,0x38,0x1a,0x27,0x1d,0xb8,0xc7,0xbc,0xe3,0x48,0x2f,0x36,0xc7,0xe0,0xc9,0xf5,0x3f,0x81,0x20,0x8d,
0x04,0x20,0xc1,0x4c,0xed,0xee,0x68,0xa7,0xad,0xb6,0xc6,0xad,0x2e,0x2d,0xa6,0xb1,0xe2,0xb4,0xca,0xec,0xa1,0xa2,0x9b,0x7b,0xfe,0xfb,0xd8,0xea,0xf8,0x72,0x8a,0x73,0xa5,0x4c,0x20,0x8d,
- 0x04,0x20,0xc1,0x59,0x44,0x81,0x9e,0x78,0x3f,0xda,0xb3,0xef,0xec,0x3e,0x6a,0x99,0x4e,0x14,0x32,0x2b,0x33,0xeb,0x30,0x5a,0xe1,0xda,0x6c,0xc9,0x6d,0xfa,0x4b,0x1d,0x1d,0x56,0x20,0x8d,
- 0x04,0x20,0xc1,0x5f,0x0b,0x67,0x90,0x71,0x8d,0xa8,0xf6,0x43,0xb1,0x0c,0x63,0x1b,0x3f,0xf3,0xd8,0x7b,0xcc,0x86,0x6a,0x25,0x9e,0xf6,0x91,0xb6,0xc8,0x6a,0x8a,0x1a,0x26,0xc0,0x20,0x8d,
- 0x04,0x20,0xc1,0x5f,0x41,0x32,0xbc,0xcc,0x9f,0x89,0xd0,0x32,0xe9,0x1e,0xdc,0x93,0x97,0x17,0x12,0xe8,0x37,0x1d,0xd4,0xbe,0x82,0xa5,0x5b,0xad,0x3d,0xce,0x02,0xf6,0x51,0x70,0x20,0x8d,
- 0x04,0x20,0xc1,0x61,0xb9,0x12,0xe9,0xbe,0x69,0x6b,0x7e,0x6d,0xb0,0xbe,0x94,0xe8,0x93,0x3a,0x29,0xd2,0xf6,0x3e,0xe9,0x2c,0xfc,0x7b,0xce,0x96,0xdd,0x93,0xb8,0x89,0x27,0xda,0x20,0x8d,
0x04,0x20,0xc1,0x67,0x44,0x50,0x1f,0xe1,0x64,0xf6,0xc0,0x0d,0xa8,0x11,0x3d,0x73,0xd0,0x6f,0xaa,0xc0,0x07,0x80,0x76,0x18,0xf4,0x8f,0x6e,0x63,0xdf,0x4e,0x79,0x2a,0x87,0xff,0x20,0x8d,
- 0x04,0x20,0xc1,0x6f,0x9e,0xec,0xc3,0x0d,0xe9,0xd3,0x81,0xe6,0xd9,0x3a,0xa0,0x03,0xaf,0xc5,0xde,0x18,0xbd,0x10,0x5f,0x93,0xf9,0x14,0x9c,0x47,0xcb,0x04,0xf0,0x2b,0x7c,0x1f,0x20,0x8d,
- 0x04,0x20,0xc1,0xbb,0x70,0x92,0x59,0x45,0x10,0x04,0x1a,0xd8,0xba,0x62,0xde,0x8b,0xa7,0xaa,0x7c,0x5b,0x90,0xbc,0xe9,0x06,0xbf,0xbd,0x11,0xfc,0x51,0x26,0xc7,0xd4,0x6f,0x89,0x20,0x8d,
- 0x04,0x20,0xc1,0xbf,0xd2,0x8b,0xbb,0x12,0x04,0x19,0x02,0x31,0x79,0x6b,0xa9,0x70,0x51,0x7a,0xaf,0xea,0x8d,0x34,0x0f,0x2a,0x0f,0x8a,0xa1,0x1d,0x05,0x6c,0x9e,0x45,0xf4,0x08,0x20,0x8d,
- 0x04,0x20,0xc1,0x85,0x96,0xe9,0x6b,0x81,0xd5,0x2d,0xb8,0xf7,0xa9,0x44,0xae,0x2a,0x5c,0xe9,0x14,0x6e,0x5e,0x3b,0x5b,0xa2,0x8c,0x61,0xad,0x22,0x6d,0xa4,0x95,0x88,0xf9,0xd3,0x20,0x8d,
- 0x04,0x20,0xc1,0x86,0x5b,0x44,0xdb,0xdc,0xb7,0x0b,0x20,0x11,0xb5,0xc2,0x44,0x81,0x6a,0x44,0x59,0x0a,0x23,0x76,0x4e,0x7f,0x62,0x88,0x4f,0x8a,0x63,0x8f,0x05,0x9d,0x58,0x3d,0x20,0x8d,
- 0x04,0x20,0xc1,0x8f,0xc3,0xdf,0x94,0x30,0x1e,0x81,0xda,0xee,0x1a,0x93,0x1f,0x54,0xcb,0xf5,0x54,0x08,0x55,0x04,0xaa,0xb4,0x44,0x20,0x9f,0xae,0xc9,0x6a,0x55,0x35,0x36,0x99,0x20,0x8d,
- 0x04,0x20,0xc1,0x97,0x5a,0xb4,0x3b,0x1a,0xb5,0x53,0xea,0xd6,0x33,0xc4,0xda,0xb3,0xd3,0xe2,0xcc,0x11,0x9d,0xb5,0x7e,0x38,0x92,0xa7,0x64,0x27,0x28,0x60,0xf2,0xf9,0xaa,0x63,0x20,0x8d,
- 0x04,0x20,0xc1,0x9d,0x27,0x85,0xbf,0x18,0xba,0x0f,0x1c,0x10,0xa4,0x78,0x47,0x13,0x4e,0x4f,0x93,0x39,0xa5,0xc7,0x97,0x37,0x13,0xaf,0xac,0xd6,0x97,0x38,0xd0,0xfc,0x2e,0x7a,0x20,0x8d,
- 0x04,0x20,0xc1,0x9d,0x6b,0x67,0xdf,0x55,0x6b,0x14,0x69,0x62,0xb2,0x9b,0x21,0x76,0xe9,0x1e,0x7e,0x52,0x82,0x7d,0x9c,0x14,0xcf,0x95,0x97,0x8c,0x72,0x53,0x56,0x0d,0xbb,0xae,0x20,0x8d,
- 0x04,0x20,0xc1,0xad,0x4b,0x67,0xa0,0xa4,0xca,0x2e,0x4e,0x0b,0xa6,0x28,0xe2,0x04,0xc7,0x17,0xcb,0xe5,0x99,0x38,0x53,0x3c,0xe7,0xc7,0x0d,0x3e,0xcf,0xaa,0x95,0xfc,0xbb,0x0e,0x20,0x8d,
- 0x04,0x20,0xc1,0xf8,0x41,0xa6,0xaf,0x0b,0xbb,0xda,0xc8,0x0d,0x51,0xfe,0x4d,0xee,0x9f,0xf9,0x1f,0xf2,0x00,0xfd,0x3f,0x4d,0x52,0x9a,0x9f,0x9f,0xd8,0x10,0xfd,0x4a,0x62,0x6a,0x20,0x8d,
- 0x04,0x20,0xc1,0xf9,0x47,0x60,0xb9,0x26,0x3b,0xb1,0xb5,0xc9,0xf6,0x59,0xb2,0xc5,0x07,0x39,0xac,0xf8,0x16,0x0a,0xb6,0xfd,0x24,0xb2,0x12,0xa9,0x5a,0xbd,0xc6,0x0e,0x3c,0xbb,0x20,0x8d,
- 0x04,0x20,0xc1,0xfb,0x49,0x7c,0x6a,0xd7,0x67,0x3b,0xaa,0x7e,0x62,0x09,0x19,0x6c,0x20,0xca,0xd9,0xb4,0xa2,0x8c,0x97,0x5b,0x6c,0xf9,0x99,0x1f,0x11,0xe5,0x37,0xae,0x46,0x52,0x20,0x8d,
- 0x04,0x20,0xc1,0xc6,0x3c,0x05,0xef,0xf2,0xcd,0x4d,0xf1,0x1f,0xa5,0x22,0x38,0x1b,0xa9,0xcb,0x4a,0x30,0x26,0xd1,0xf8,0x9d,0xb9,0xd9,0x10,0x2f,0xde,0x66,0xa7,0x98,0x49,0xb2,0x20,0x8d,
- 0x04,0x20,0xc1,0xd1,0x2b,0x2e,0x6a,0x8c,0xb7,0x47,0xd5,0x51,0xc1,0xa5,0x44,0x3a,0x9d,0x46,0x9a,0x96,0xe2,0xea,0xd9,0xad,0x39,0x30,0x51,0xee,0x1b,0xc5,0x95,0x0d,0xca,0x0a,0x20,0x8d,
- 0x04,0x20,0xc1,0xd2,0xac,0x2c,0x53,0x2f,0x7f,0xf1,0x90,0xc2,0xfd,0x0a,0x52,0xd4,0xdb,0x34,0x87,0x73,0x36,0xfe,0xe3,0xc6,0x7c,0x96,0x89,0xba,0x4c,0x53,0x86,0x8b,0x64,0xc5,0x20,0x8d,
- 0x04,0x20,0xc1,0xdb,0x90,0xf5,0xec,0x10,0x48,0x88,0x4b,0xc1,0xbb,0x37,0x7a,0xe4,0x78,0xd0,0xcc,0x15,0xcc,0x88,0x95,0xab,0x59,0x9b,0xd5,0x3a,0xa8,0xce,0x99,0x29,0xb7,0xc0,0x20,0x8d,
- 0x04,0x20,0xc1,0xe1,0x89,0xd1,0x66,0xb0,0xe7,0x57,0x65,0x27,0xa6,0x1c,0x3d,0x0a,0x85,0x6a,0x82,0x7f,0xf5,0x86,0xc5,0xb9,0xb5,0x7a,0xde,0xd8,0x0f,0xa2,0xe6,0x8b,0x92,0x8b,0x20,0x8d,
- 0x04,0x20,0xc1,0xe7,0x72,0xd0,0xbd,0xcd,0xe0,0xe8,0x2a,0x8e,0x19,0x5e,0xcc,0xc9,0xad,0x64,0xd9,0xbe,0xf3,0x1d,0x8c,0xc9,0x78,0x3d,0x73,0xea,0xf6,0x55,0x67,0x2a,0x92,0x54,0x20,0x8d,
- 0x04,0x20,0xc1,0xeb,0x8b,0xa4,0xa0,0xa3,0xe6,0xf9,0x26,0x37,0x89,0x76,0xeb,0xce,0xbd,0xca,0xd3,0x4d,0x18,0x6f,0x44,0xed,0x20,0x04,0x4c,0x4f,0x4c,0x37,0xa6,0x3e,0x47,0x33,0x20,0x8d,
- 0x04,0x20,0xc1,0xee,0x23,0x3f,0x1a,0x0d,0xac,0x73,0xbd,0x86,0x22,0xd7,0x83,0x1d,0x2f,0x55,0xbe,0x22,0xc5,0x2b,0x87,0xa7,0x18,0x6b,0x0b,0xdf,0xb7,0xa8,0xdc,0x91,0xb0,0x58,0x20,0x8d,
- 0x04,0x20,0xc2,0x34,0xae,0x3a,0x6c,0xb5,0x12,0x6f,0x85,0x1d,0x45,0xbe,0x4b,0x41,0xb3,0x6d,0xc3,0xaf,0x27,0x0f,0x5d,0xfb,0x7c,0x2b,0xe1,0x4d,0x6a,0x0a,0x4f,0x58,0xd3,0x0e,0x20,0x8d,
- 0x04,0x20,0xc2,0x37,0xa7,0x30,0xff,0x39,0xfb,0xc7,0x11,0xd3,0xe2,0x35,0x92,0x6a,0x68,0x2f,0x17,0xc1,0x58,0x67,0xcd,0xee,0xde,0x07,0x2c,0x9c,0x22,0xe9,0x96,0xf1,0x23,0xe7,0x20,0x8d,
- 0x04,0x20,0xc2,0x38,0x6b,0xc3,0x1e,0xd8,0xa5,0x49,0xa8,0x80,0xde,0x65,0x2d,0x3a,0x38,0xcf,0x0c,0x49,0xeb,0x47,0x11,0x4c,0x86,0xd8,0x44,0x4e,0x3d,0xd3,0x6f,0xa4,0x17,0x67,0x20,0x8d,
- 0x04,0x20,0xc2,0x38,0xda,0x98,0xee,0xaa,0x47,0xd0,0xe4,0x41,0x3a,0x27,0x52,0x64,0xfc,0xa5,0x8d,0xbd,0x37,0xd1,0xd6,0xc9,0x3f,0x6f,0x6e,0x1a,0xc0,0x2a,0x70,0x80,0x61,0x70,0x20,0x8d,
- 0x04,0x20,0xc2,0x3b,0x7f,0x22,0x4d,0x32,0x7e,0xf4,0x56,0x3d,0xb4,0xfc,0x8d,0x8e,0x2d,0x9a,0xe1,0x2a,0x87,0x28,0x4b,0xc7,0x8d,0x77,0x8b,0x0a,0x46,0xd4,0x1e,0xec,0x2e,0x34,0x20,0x8d,
- 0x04,0x20,0xc2,0x3d,0x46,0x29,0x4b,0x08,0x7d,0x58,0xf1,0x3f,0xe8,0x68,0xe9,0x4b,0xea,0x82,0x8c,0x29,0x0e,0x57,0xe9,0x6a,0x64,0x77,0xe7,0xfa,0x7a,0x1c,0xd1,0x64,0x71,0x36,0x20,0x8d,
- 0x04,0x20,0xc2,0x02,0x62,0x95,0xee,0xf8,0xd0,0xcc,0x55,0x2b,0x0e,0x4b,0x1d,0x8d,0xac,0x6a,0xf5,0x1e,0x9c,0x31,0x7d,0xc3,0x31,0x3d,0x52,0x99,0xe4,0xa7,0x7a,0x83,0x94,0x55,0x20,0x8d,
- 0x04,0x20,0xc2,0x11,0x84,0x52,0xcd,0x97,0x3b,0x93,0xb1,0x56,0x46,0xec,0x9a,0x32,0x07,0x6e,0x0a,0xab,0x28,0x07,0x09,0x8c,0x3f,0x1e,0x37,0x9b,0x63,0x72,0xc2,0xcd,0xd5,0x47,0x20,0x8d,
- 0x04,0x20,0xc2,0x12,0x3b,0xb1,0x66,0x69,0x45,0x68,0x87,0xb9,0xbd,0x44,0x74,0x9c,0xd3,0x17,0x77,0xdf,0xb0,0x82,0xa3,0x9e,0xc4,0x36,0x89,0x53,0x9a,0xef,0x86,0xc9,0x34,0x29,0x20,0x8d,
- 0x04,0x20,0xc2,0x24,0x4f,0xf5,0x2a,0x91,0xb5,0xf9,0x9f,0xfc,0x0d,0xdd,0xb0,0x7a,0x22,0x8e,0xcf,0x4a,0xc5,0xcc,0x3b,0x28,0x76,0xb3,0x1b,0x6e,0xda,0x61,0x18,0xaf,0x01,0xa1,0x20,0x8d,
- 0x04,0x20,0xc2,0x24,0x41,0xfe,0x45,0xdd,0xf3,0x26,0xac,0xc6,0x25,0x10,0xe0,0x4b,0x4e,0x2f,0x05,0x18,0xad,0x6a,0x7e,0x74,0x62,0x84,0x78,0xf8,0xba,0x2c,0x48,0x1d,0x95,0xd1,0x20,0x8d,
- 0x04,0x20,0xc2,0x25,0x5a,0x55,0x90,0x9b,0x7f,0x63,0xcf,0xc3,0x68,0xe3,0x0c,0xc8,0x6b,0xfd,0x69,0x27,0xde,0xd1,0x61,0x6d,0x6a,0x75,0xdf,0xb2,0xc6,0xdc,0xb7,0x8c,0x0e,0x48,0x20,0x8d,
- 0x04,0x20,0xc2,0x26,0x22,0x61,0xdb,0xb5,0x74,0xc5,0x77,0xce,0x65,0x7c,0xc7,0x37,0x6d,0xf8,0xc4,0x58,0xfd,0x28,0x31,0x86,0xcc,0xad,0x93,0x42,0x9e,0xe0,0x33,0x4e,0x9a,0x09,0x20,0x8d,
- 0x04,0x20,0xc2,0x28,0x49,0x42,0x02,0xfe,0xda,0xdf,0xaa,0xe0,0x18,0x2a,0xc5,0xd8,0x5f,0xc3,0x04,0x89,0x67,0x2a,0xf8,0x6f,0x2d,0x84,0x7c,0x2d,0xa8,0x20,0x38,0x4c,0x27,0xa0,0x20,0x8d,
- 0x04,0x20,0xc2,0x33,0xf1,0xe9,0x6a,0x32,0xb4,0xc2,0xcd,0xfe,0x47,0x49,0xa9,0xc0,0xee,0x9c,0x15,0x04,0x9a,0xe1,0x1b,0x32,0x16,0x95,0x76,0xac,0x90,0xec,0x17,0x03,0x84,0x6a,0x20,0x8d,
0x04,0x20,0xc2,0x76,0x69,0x71,0xb5,0xa3,0x24,0x5c,0xcc,0x16,0x6f,0xd5,0x4e,0x09,0x8d,0x24,0x75,0x95,0xb0,0x4d,0xea,0x94,0x4d,0xec,0xdc,0x4e,0xab,0x8b,0x5e,0x51,0x83,0x02,0x20,0x8d,
- 0x04,0x20,0xc2,0x77,0x0e,0x22,0x92,0x9d,0xca,0x28,0x70,0x28,0x90,0x69,0x6d,0xa6,0xb0,0x17,0xde,0x7d,0x18,0xcb,0x1f,0x7c,0xca,0xe2,0xf0,0xa9,0xad,0xa9,0xb2,0x48,0x68,0x6c,0x20,0x8d,
- 0x04,0x20,0xc2,0x7d,0xef,0x16,0xe9,0x18,0xeb,0x9e,0x5f,0x2a,0x3c,0xf2,0x73,0xf7,0x76,0xaa,0x90,0xe0,0xd5,0x0b,0x18,0xb3,0x9b,0x87,0x6c,0x45,0xd2,0x87,0xc2,0x08,0x80,0x33,0x20,0x8d,
- 0x04,0x20,0xc2,0x46,0x71,0xd2,0x27,0xf5,0x61,0x7a,0x61,0x46,0x65,0x24,0xa7,0x80,0x29,0xca,0x5a,0x8d,0x90,0xf7,0xb9,0xf7,0x98,0x76,0x24,0x1d,0x3a,0x78,0x0d,0x87,0x1d,0xba,0x20,0x8d,
- 0x04,0x20,0xc2,0x54,0xe4,0xd5,0x32,0x37,0xb0,0x72,0xa7,0x4b,0x6e,0x82,0xf1,0x44,0xfa,0x27,0x8b,0x1e,0x6a,0x8b,0xde,0x33,0x22,0x04,0x39,0xd2,0x95,0x89,0x9b,0xef,0x2e,0xb3,0x20,0x8d,
- 0x04,0x20,0xc2,0x68,0x3c,0xca,0x56,0xc5,0x4b,0x0c,0x12,0x67,0xd1,0x0c,0x72,0xd4,0x86,0xb9,0xbd,0x9f,0x50,0x2d,0xbf,0xf4,0xa6,0x41,0x2b,0x49,0xc6,0x4b,0x44,0x4a,0xb7,0x7c,0x20,0x8d,
- 0x04,0x20,0xc2,0xb4,0x57,0x38,0xae,0x41,0x6e,0x60,0xc5,0xfd,0x07,0x3a,0xe5,0x58,0x24,0x5c,0x65,0x5c,0x08,0xd0,0x35,0xb5,0xcb,0xd7,0xbe,0x3b,0x29,0x0b,0xad,0xec,0xb7,0x99,0x20,0x8d,
- 0x04,0x20,0xc2,0xb9,0x22,0x44,0x55,0xc6,0x6b,0x0b,0x98,0x26,0x6f,0xe5,0x16,0x78,0x84,0x45,0x57,0x97,0x03,0x73,0xe4,0xb3,0xbf,0x6c,0x18,0x30,0xb0,0x24,0x50,0x22,0x41,0x10,0x20,0x8d,
0x04,0x20,0xc2,0x8f,0xb9,0xf3,0x99,0x4b,0x92,0xf4,0xff,0xce,0xa4,0x08,0xef,0x7b,0x4b,0x49,0xf0,0x2d,0x4f,0xc4,0xdb,0x10,0xa2,0x7f,0xc8,0x83,0xc8,0xb1,0x0f,0x33,0x30,0x2f,0x20,0x8d,
- 0x04,0x20,0xc2,0x94,0x75,0xb7,0xd7,0xf1,0xc4,0xc3,0xe2,0x37,0xec,0x6e,0x02,0xec,0x5d,0x05,0x0f,0xd5,0x71,0xeb,0x8b,0xc0,0x89,0x22,0x72,0xf6,0xe3,0xbd,0x90,0x56,0x53,0x26,0x20,0x8d,
- 0x04,0x20,0xc2,0xa0,0x43,0xd9,0x7c,0xf9,0xed,0x87,0xd0,0xe7,0xa5,0x2e,0xa7,0xb8,0x97,0x70,0x96,0x3a,0xad,0x68,0xbc,0x0e,0xf5,0xbe,0x58,0xf6,0x19,0xee,0xd4,0x29,0x28,0x37,0x20,0x8d,
- 0x04,0x20,0xc2,0xa9,0xa1,0x2e,0xd1,0xdd,0xf6,0xd1,0xe4,0xa9,0x1a,0xb6,0xee,0x49,0xee,0xcc,0xdd,0x0c,0x79,0xa3,0x04,0xd4,0x46,0xf6,0xce,0x79,0x80,0xf3,0x7e,0x0a,0xae,0x1f,0x20,0x8d,
- 0x04,0x20,0xc2,0xad,0x1b,0x50,0xa5,0xb5,0x41,0x75,0xd9,0x15,0x9e,0xce,0xb3,0xe3,0x3a,0xc3,0xbb,0x71,0x93,0xe3,0xb7,0x2f,0xef,0xe0,0xc2,0xe5,0xcf,0xa9,0xf9,0x9c,0x47,0x44,0x20,0x8d,
- 0x04,0x20,0xc2,0xf4,0xf8,0x90,0x01,0xc6,0xb1,0x0c,0x1d,0x95,0x46,0x21,0xcf,0x45,0xc0,0x7d,0x1e,0xc6,0xa1,0x33,0xd1,0xb6,0xcc,0xb2,0xb6,0x9d,0xdf,0x3a,0xe0,0x39,0xfc,0x43,0x20,0x8d,
- 0x04,0x20,0xc2,0xf5,0x29,0xc8,0xe0,0x76,0x5f,0x88,0x4e,0x93,0xfb,0x3c,0xb6,0xf3,0xf9,0xd4,0x0e,0xb2,0x0d,0x4d,0xa5,0x8e,0x84,0xf9,0x55,0xbc,0xa8,0x00,0x23,0x8d,0xb6,0x3c,0x20,0x8d,
- 0x04,0x20,0xc2,0xf7,0xf6,0xe0,0xfb,0xad,0x13,0x9d,0x17,0x11,0xce,0xc8,0xe8,0x3a,0x64,0x45,0xf0,0x8c,0xec,0x69,0xec,0x4a,0xd6,0xb2,0x26,0x58,0x8c,0x29,0x5b,0x21,0x24,0x02,0x20,0x8d,
- 0x04,0x20,0xc2,0xf6,0x17,0x77,0x36,0xb4,0x8d,0xd1,0x84,0xf1,0x88,0x92,0xaa,0xbb,0x15,0xb5,0xae,0xfd,0xa8,0x23,0x33,0xe2,0x72,0x79,0x83,0xee,0x9c,0x1d,0x2e,0x20,0xfe,0x1b,0x20,0x8d,
- 0x04,0x20,0xc2,0xc0,0xec,0x59,0xce,0x22,0x6a,0xf2,0xba,0x44,0xb5,0xd9,0x8b,0xa4,0xe2,0xd0,0x0e,0x52,0x3d,0x21,0xad,0x30,0x91,0x71,0xff,0x0e,0x19,0x64,0x44,0x97,0x5a,0x86,0x20,0x8d,
0x04,0x20,0xc2,0xc0,0xf8,0x9a,0xd3,0x47,0x07,0x2a,0x32,0xfd,0xbd,0x56,0x7a,0x2f,0x64,0x91,0x77,0x84,0x6c,0x81,0xc6,0x28,0x10,0xe8,0x76,0x29,0xac,0x4d,0xe7,0x12,0xae,0xc9,0x20,0x8d,
- 0x04,0x20,0xc2,0xc2,0xb6,0xc4,0x7a,0x4b,0x4a,0x99,0xd2,0x53,0x5f,0xb1,0x3f,0x3d,0x17,0xe3,0x0d,0x08,0xf6,0x10,0x71,0x2b,0x46,0xb2,0xca,0xde,0x89,0xe2,0xde,0x1e,0xa2,0x76,0x20,0x8d,
- 0x04,0x20,0xc2,0xc7,0x3b,0xfd,0xdd,0xc7,0x52,0x5d,0x52,0x71,0x8c,0xe0,0x5e,0xe0,0xbd,0xf0,0x14,0xe5,0xf7,0xb6,0x04,0x65,0xaa,0x5a,0xf4,0xaa,0x5d,0x40,0xd2,0x53,0x8c,0xd9,0x20,0x8d,
- 0x04,0x20,0xc2,0xcf,0xba,0xad,0x14,0x7f,0x95,0xaf,0xbe,0x7a,0x99,0xed,0xcb,0x98,0xa6,0xa2,0x32,0x80,0x3a,0x41,0xee,0x36,0xea,0x90,0x9c,0xb7,0x87,0x9b,0x08,0x3e,0x38,0xbc,0x20,0x8d,
- 0x04,0x20,0xc2,0xe5,0x56,0xa6,0x11,0x11,0x81,0x35,0x65,0x3d,0x31,0x55,0x69,0xf8,0x59,0xd6,0xfd,0x9f,0xfb,0x15,0x33,0xc9,0x45,0x98,0xd9,0x62,0xf7,0x70,0xfe,0x6d,0x0c,0xa7,0x20,0x8d,
- 0x04,0x20,0xc2,0xe9,0x62,0x0a,0xcb,0x40,0x4b,0xd1,0xdb,0x52,0xa3,0xfd,0xc1,0xc3,0x86,0x97,0x04,0x51,0x9e,0x6a,0x29,0xdd,0x8e,0x8a,0x59,0x8d,0x69,0xfe,0xd9,0x69,0x24,0x00,0x20,0x8d,
- 0x04,0x20,0xc2,0xf1,0x43,0x2d,0xfd,0x0e,0x9f,0xee,0x99,0x88,0x71,0x4e,0x4d,0x22,0x2f,0xbc,0xac,0xb3,0x90,0x43,0x20,0x8d,0xf1,0xeb,0xf0,0x38,0xac,0x43,0x90,0xd1,0xd1,0x0a,0x20,0x8d,
- 0x04,0x20,0xc3,0x0d,0x87,0x0e,0xb9,0x99,0x65,0xc6,0xb5,0x09,0x4b,0x6c,0x8a,0xf8,0x80,0x19,0x27,0x74,0xb3,0xfe,0xea,0x2b,0xb8,0xe2,0x98,0x3c,0xa1,0xca,0x3d,0xa9,0xb3,0x44,0x20,0x8d,
- 0x04,0x20,0xc3,0x11,0x6d,0x8f,0x8a,0x59,0x1e,0x7b,0x52,0xc1,0x51,0x86,0xf5,0xae,0x32,0xf1,0xe5,0x20,0xf2,0x55,0x11,0xb5,0x46,0x7e,0x43,0x66,0xcf,0x26,0xb5,0x52,0x0b,0x6a,0x20,0x8d,
- 0x04,0x20,0xc3,0x1b,0x87,0x8f,0xf7,0x66,0x74,0x55,0x03,0x51,0xe6,0x2f,0x58,0x69,0x01,0x2f,0xe3,0x51,0xe1,0x7e,0x21,0x18,0xf7,0xbb,0xfc,0x89,0x48,0x7a,0x68,0x7a,0x74,0x14,0x20,0x8d,
- 0x04,0x20,0xc3,0x1e,0xfe,0xa5,0x60,0x55,0x8a,0x74,0xe8,0x2e,0xcd,0xbd,0x6d,0xee,0x00,0x42,0xd5,0x18,0x06,0x2e,0x46,0x6e,0xcd,0xbc,0x65,0xbd,0x52,0x30,0xc5,0x56,0x9e,0x2f,0x20,0x8d,
- 0x04,0x20,0xc3,0x23,0x46,0xb3,0x55,0x3b,0x81,0x1b,0x7e,0x2f,0x77,0x92,0x36,0x43,0x8c,0x25,0x7a,0x7c,0xfb,0x74,0x62,0xd2,0xa4,0x7b,0xb0,0xd5,0x77,0xaf,0xd5,0x8d,0xb7,0xac,0x20,0x8d,
0x04,0x20,0xc3,0x27,0xa3,0x8c,0xa6,0x1d,0xdd,0xa0,0x5a,0xa9,0xd2,0xb9,0x8e,0xcc,0x2f,0xa8,0x1e,0x9f,0xf5,0x3f,0xae,0xf9,0x3a,0xd5,0x71,0x86,0x39,0xc5,0xca,0xb5,0x18,0x9a,0x20,0x8d,
- 0x04,0x20,0xc3,0x29,0x42,0x83,0xa1,0x8f,0xfa,0xb4,0x4a,0xc5,0x88,0x7c,0xf3,0x33,0x67,0x17,0x9d,0xef,0x99,0xb9,0x3e,0x0d,0xfa,0xbc,0xae,0xd4,0x25,0x6d,0xbb,0x16,0xfb,0x3e,0x20,0x8d,
- 0x04,0x20,0xc3,0x2e,0x40,0x7f,0x92,0x95,0x93,0x88,0x56,0xbf,0x4c,0x8f,0xfe,0x0d,0xb5,0x43,0x05,0x28,0x72,0x2d,0x03,0xbb,0x7e,0x9b,0xe3,0x2a,0x5a,0x12,0xe3,0xdf,0x72,0x77,0x20,0x8d,
- 0x04,0x20,0xc3,0x76,0x0a,0xba,0xc3,0x57,0x44,0xeb,0xfe,0x19,0xdf,0x25,0xb8,0x23,0x3a,0xa7,0x53,0xab,0x9b,0x68,0x8d,0xc4,0xa3,0xe5,0x0a,0x2a,0x6b,0xd1,0x09,0x30,0x88,0xd1,0x20,0x8d,
- 0x04,0x20,0xc3,0x41,0xcc,0xba,0x30,0xef,0xc8,0x73,0x1c,0x96,0x59,0x0c,0x0f,0xac,0x3c,0xc9,0xaf,0xb9,0xf1,0x66,0xaf,0x55,0xae,0x3a,0x35,0xf8,0x79,0x01,0x1b,0x5f,0x95,0x70,0x20,0x8d,
- 0x04,0x20,0xc3,0x45,0xf2,0x8b,0xe3,0xce,0xb9,0x2d,0xe9,0x4f,0xf3,0x9e,0x35,0x06,0xae,0x38,0x7f,0xc7,0x05,0x84,0xe2,0x4c,0xed,0xc5,0x4a,0xaa,0x73,0x8b,0x49,0x77,0x21,0x91,0x20,0x8d,
- 0x04,0x20,0xc3,0x50,0xba,0xe6,0x94,0x59,0x81,0xa9,0xae,0xba,0x38,0x90,0x2f,0x83,0x02,0xec,0x1e,0x3e,0x37,0x3f,0x8f,0xe4,0xd9,0x60,0x89,0x7f,0x2b,0x7b,0x36,0xeb,0x73,0x4b,0x20,0x8d,
- 0x04,0x20,0xc3,0x55,0x5f,0xb5,0x27,0xf1,0xd3,0xdb,0x92,0xd7,0xbe,0x36,0x6a,0xcd,0xb4,0xf3,0x85,0x8a,0xd3,0x93,0x34,0x57,0xb3,0x36,0xdd,0xbd,0xd4,0x37,0x96,0x47,0x02,0xde,0x20,0x8d,
- 0x04,0x20,0xc3,0x60,0x6c,0xb9,0x35,0x1d,0xab,0xa8,0xd1,0x1a,0x8a,0xc8,0x23,0x87,0x5a,0x27,0x4f,0x68,0x21,0xeb,0x9d,0x24,0x36,0x95,0x55,0xfc,0xbd,0xd4,0x67,0xc5,0x34,0x5b,0x20,0x8d,
- 0x04,0x20,0xc3,0xb9,0x85,0x4f,0xe7,0x69,0x9e,0xf0,0x55,0xd6,0xf9,0x75,0x2c,0xef,0xc0,0x4a,0xfd,0x6d,0xf0,0x36,0xf4,0x22,0x22,0x90,0x9e,0x46,0xe5,0xe4,0xa9,0x9e,0x91,0x1d,0x20,0x8d,
- 0x04,0x20,0xc3,0x81,0x3d,0x07,0x9e,0x3e,0x49,0x43,0xe3,0xed,0xef,0xcc,0x96,0x16,0xe6,0x7b,0xc8,0x8d,0xdd,0xb9,0x1d,0xed,0x25,0xe9,0x0f,0x17,0x5b,0x8f,0x77,0xc9,0xfe,0x5f,0x20,0x8d,
- 0x04,0x20,0xc3,0x83,0x10,0x7e,0x3b,0x51,0x26,0x9a,0x1e,0x3c,0x37,0x04,0x51,0xc2,0x8c,0x91,0x33,0xc7,0x33,0x44,0x21,0x6a,0xc3,0x5e,0x37,0x87,0xed,0x76,0xa9,0xd4,0xcb,0x04,0x20,0x8d,
- 0x04,0x20,0xc3,0x8c,0x5b,0x8c,0x4e,0xd7,0xb9,0x34,0x84,0x24,0x22,0xb5,0xa7,0x6b,0xcb,0xcb,0x69,0xa3,0x69,0x56,0xac,0xb8,0xb6,0x16,0x7b,0x40,0x77,0x72,0x2d,0xa3,0x01,0xa6,0x20,0x8d,
- 0x04,0x20,0xc3,0x99,0x6b,0x94,0x48,0x5a,0x40,0x3f,0x6c,0xc8,0x10,0x47,0xdf,0xf7,0xee,0x37,0x17,0x87,0x89,0xe7,0xe9,0x7a,0xc8,0x0d,0xd4,0xea,0x93,0xd8,0xba,0xca,0xc3,0xa6,0x20,0x8d,
- 0x04,0x20,0xc3,0x9b,0xd3,0x67,0x90,0xfc,0x9c,0x81,0x23,0x88,0xfa,0x4b,0xac,0x80,0x48,0xa4,0x90,0xec,0x33,0xbe,0x4b,0xb4,0x10,0x4f,0x7e,0xdc,0xe3,0xb7,0x91,0xc8,0xa4,0x62,0x20,0x8d,
- 0x04,0x20,0xc3,0x9c,0x10,0xff,0x43,0xc4,0xfd,0xa6,0xf4,0x6f,0x95,0x36,0x08,0x3e,0x00,0xda,0xd8,0x54,0xf8,0xc5,0xa4,0x5a,0xee,0x79,0xde,0xab,0x20,0x30,0xbe,0xd0,0xb6,0xf4,0x20,0x8d,
- 0x04,0x20,0xc3,0xa6,0x28,0x61,0xa9,0xd7,0x15,0xa1,0x29,0x0b,0x77,0x78,0x74,0x9c,0xb3,0x4d,0x2b,0x5b,0x20,0x02,0x0e,0x5d,0x10,0x40,0x5a,0x54,0x3b,0x59,0xb2,0x57,0x5b,0xa5,0x20,0x8d,
- 0x04,0x20,0xc3,0xf6,0x9a,0x3b,0xfe,0xd8,0xd8,0x8f,0xc7,0x07,0x55,0x76,0xa8,0x69,0x7a,0xf6,0x84,0xb5,0xc6,0x34,0xf2,0xa5,0xd9,0xaf,0x22,0x1a,0xee,0x30,0x29,0x88,0x7e,0xf2,0x20,0x8d,
- 0x04,0x20,0xc3,0xf9,0xf3,0x50,0x7e,0x2a,0x65,0x54,0x9a,0x9d,0xe3,0x90,0x20,0x70,0x3b,0x42,0x79,0x92,0xc4,0x80,0x14,0xc4,0x07,0x37,0xc5,0xbf,0xeb,0xf7,0x94,0x37,0x0c,0x6b,0x20,0x8d,
- 0x04,0x20,0xc3,0xfc,0xa5,0x99,0xb1,0xaa,0x25,0x0f,0xee,0x06,0xe0,0xd5,0xae,0xf4,0xff,0xa3,0x74,0xaf,0xbc,0x2a,0xf7,0xbc,0x99,0xe4,0x5a,0xd4,0x6e,0x99,0x68,0x8d,0xf7,0x1c,0x20,0x8d,
- 0x04,0x20,0xc3,0xc0,0x0c,0x97,0x59,0xdc,0xfa,0x38,0x66,0x83,0x5e,0x0c,0x94,0xbf,0x01,0xd5,0x2a,0xaf,0x6c,0xd4,0x75,0x65,0x3c,0xd0,0x32,0x71,0xc2,0x12,0x39,0x8e,0x61,0x26,0x20,0x8d,
- 0x04,0x20,0xc3,0xc0,0xac,0x4a,0x7c,0x08,0x4e,0x7d,0x26,0x90,0x1f,0xa3,0xfb,0xe1,0x90,0x6c,0x4d,0x6b,0xec,0x80,0x49,0x14,0xf3,0x79,0xdd,0x0f,0x0a,0x0c,0x88,0x58,0xdb,0x2c,0x20,0x8d,
- 0x04,0x20,0xc3,0xd4,0x95,0x4f,0x83,0x6e,0x21,0x8f,0x4a,0xa4,0x16,0x06,0x83,0x4e,0x76,0x6c,0x93,0xdb,0xfb,0x9b,0xb7,0x88,0x35,0x7a,0x19,0x39,0x5d,0xa3,0xaa,0xf7,0xa7,0x16,0x20,0x8d,
- 0x04,0x20,0xc3,0xd8,0x85,0x4e,0x5b,0x90,0x00,0x52,0xa7,0x54,0x77,0x72,0xc5,0x04,0x02,0xeb,0x3f,0x76,0x84,0x2b,0xba,0x82,0x77,0xdb,0xb7,0x9d,0xc2,0x06,0x01,0x30,0x2e,0xfd,0x20,0x8d,
- 0x04,0x20,0xc3,0xda,0x86,0x82,0x3a,0x3e,0x03,0x5d,0xa4,0x6e,0xac,0x7e,0x0b,0xfe,0x64,0x87,0xac,0xfc,0xd6,0x36,0xf3,0x7f,0xc1,0x4a,0x1f,0x20,0xdd,0x2d,0x9f,0x34,0x61,0xf4,0x20,0x8d,
- 0x04,0x20,0xc3,0xdc,0x86,0xe4,0xd0,0x5e,0xf2,0xee,0x8f,0x72,0x9c,0x5e,0xc0,0x35,0xa1,0x50,0xe6,0xd1,0xdd,0x57,0x58,0x13,0x63,0x09,0xe0,0x4f,0x1a,0x60,0x8b,0xac,0x84,0x73,0x20,0x8d,
- 0x04,0x20,0xc3,0xdf,0xfd,0xbe,0xba,0xa8,0x92,0x58,0x6b,0x6b,0x9d,0x8e,0xe4,0xd2,0x24,0x65,0xee,0x55,0x36,0xd3,0x32,0xaf,0x2a,0xd8,0x9b,0xb2,0x06,0xb0,0x12,0xb8,0xbe,0xf8,0x20,0x8d,
- 0x04,0x20,0xc4,0x3f,0x2f,0x3c,0x9f,0x4e,0x63,0x94,0xf6,0x97,0x5b,0xa3,0x89,0xda,0xe3,0xe8,0x65,0xc5,0x2d,0x38,0xab,0xf5,0xf0,0x28,0x71,0x78,0x1a,0x6f,0xfb,0xb8,0x1e,0xe4,0x20,0x8d,
- 0x04,0x20,0xc4,0x1a,0x05,0xf1,0xe7,0xc7,0xed,0x9d,0xae,0x4e,0x46,0xb7,0x1c,0xa3,0x01,0xef,0x82,0xd0,0xe6,0xb5,0xc3,0xf1,0xa6,0x1b,0xaf,0x73,0x73,0x15,0x7b,0x70,0x7e,0x2a,0x20,0x8d,
- 0x04,0x20,0xc4,0x1c,0x88,0x4f,0x6c,0x72,0xd3,0xcc,0x1a,0x1c,0xe6,0x70,0xc2,0x74,0xc3,0x09,0x88,0x4f,0x88,0x13,0x59,0x78,0xd1,0xa6,0x3c,0x66,0x10,0x81,0x0e,0x94,0xb2,0x09,0x20,0x8d,
- 0x04,0x20,0xc4,0x2a,0x70,0xb2,0xa2,0xe7,0x51,0x8d,0x8e,0x2b,0xfb,0x44,0x4a,0x1e,0x86,0x1c,0xf4,0x52,0x56,0xd7,0xe5,0xfb,0xbc,0x80,0xa8,0x77,0x8f,0xaf,0x6b,0xca,0x2a,0xed,0x20,0x8d,
- 0x04,0x20,0xc4,0x40,0xc0,0x86,0x0b,0xca,0x99,0xe7,0x75,0xea,0x17,0x61,0xdf,0x6d,0xa9,0xac,0x54,0x50,0x2d,0x70,0x70,0x6b,0x21,0x55,0xe3,0x42,0xba,0xeb,0x04,0x73,0x69,0xc2,0x20,0x8d,
- 0x04,0x20,0xc4,0x47,0x36,0xcf,0x8b,0x53,0xf1,0x2c,0x62,0x35,0x8e,0x20,0x7b,0xdb,0x6a,0xe6,0xbe,0x6b,0xdb,0x28,0x74,0x87,0x34,0x3c,0xba,0x18,0x90,0x57,0x50,0xd6,0xcb,0x98,0x20,0x8d,
- 0x04,0x20,0xc4,0x56,0x2e,0x47,0x70,0x28,0xa3,0xcb,0xf6,0xcd,0x12,0x29,0x38,0x8e,0xa0,0x94,0x5e,0x03,0xba,0x3b,0xa2,0x35,0xd5,0x98,0x66,0x55,0xc2,0x89,0xef,0x36,0x9b,0x2c,0x20,0x8d,
- 0x04,0x20,0xc4,0x58,0xf0,0x48,0x69,0x60,0x7f,0xf7,0x35,0xdc,0x17,0xa2,0x93,0xeb,0x85,0x4f,0x4d,0x3f,0x84,0x29,0xbf,0xdb,0x7a,0x47,0x13,0x53,0x2e,0x1b,0x5b,0x46,0x03,0x3d,0x20,0x8d,
- 0x04,0x20,0xc4,0x60,0xe5,0xd8,0x0e,0xbb,0xc1,0xbd,0x0a,0xda,0xc9,0x0c,0xd0,0x18,0xcc,0x6a,0x28,0x48,0xfb,0xd4,0x61,0x57,0x96,0xa4,0x1e,0x18,0x9f,0xfa,0x0e,0x0f,0x03,0x80,0x20,0x8d,
- 0x04,0x20,0xc4,0x6c,0xa9,0x20,0xcf,0xbf,0x0a,0xe8,0x2e,0xcd,0x2f,0x85,0x7b,0x4d,0xef,0xbe,0xb3,0xa6,0x49,0xcc,0x7a,0x0d,0xfd,0x8d,0x42,0x66,0xf8,0xfb,0x49,0x98,0xe8,0x6d,0x20,0x8d,
- 0x04,0x20,0xc4,0x70,0x13,0xb3,0x44,0x97,0x24,0x8a,0x3d,0x2d,0xc2,0x4a,0x5a,0xa0,0x8c,0xac,0x2f,0xae,0x32,0x09,0xeb,0x51,0x66,0x6a,0xc5,0xef,0xa4,0xf1,0xc1,0x76,0x05,0x39,0x20,0x8d,
- 0x04,0x20,0xc4,0x73,0x65,0xee,0x21,0x2a,0x6f,0xf2,0x60,0x38,0x4d,0x5a,0x9c,0xeb,0x1f,0x83,0x2a,0xf6,0xa8,0x97,0x53,0x30,0xb8,0x3e,0xd2,0x0f,0xd1,0x57,0x9b,0xc2,0x3f,0x34,0x20,0x8d,
- 0x04,0x20,0xc4,0xb4,0xca,0x62,0xa2,0x6b,0xc6,0x01,0x92,0x73,0xc8,0x2a,0xb2,0x1f,0xf0,0x8b,0x7f,0x3f,0x47,0xe4,0xd4,0xdc,0x12,0xbf,0xf8,0xb9,0x67,0x30,0x7c,0x99,0xd2,0x3d,0x20,0x8d,
- 0x04,0x20,0xc4,0x8e,0xfd,0x1b,0xc1,0xee,0xda,0x32,0x13,0x3b,0xe3,0x6e,0xd5,0x70,0x39,0xf0,0xa0,0x1c,0xac,0xb7,0x80,0xcc,0x64,0x7c,0x33,0x82,0xed,0x9b,0xe6,0x82,0xfc,0xac,0x20,0x8d,
- 0x04,0x20,0xc4,0xa1,0xd8,0xcd,0xe5,0xca,0xb3,0xd3,0x4f,0x52,0xf6,0x90,0x30,0xc8,0x7f,0x91,0x05,0x9d,0xa4,0x8f,0xca,0xe8,0xff,0x1e,0x05,0xec,0xe6,0x3a,0x4e,0x43,0x65,0x8d,0x20,0x8d,
- 0x04,0x20,0xc4,0xb1,0x7e,0x90,0x06,0xb3,0x60,0xf2,0x91,0x99,0xd3,0x4f,0x61,0x5e,0x5a,0x16,0xc9,0x42,0x41,0x5d,0x2e,0xd2,0xdc,0x57,0x05,0x81,0x5a,0xed,0xbc,0xab,0x14,0x0b,0x20,0x8d,
- 0x04,0x20,0xc4,0xf5,0x5a,0x07,0xcb,0x58,0x88,0x6b,0xd2,0x82,0xa6,0xd0,0x45,0x26,0x05,0x7b,0x03,0x8c,0xf1,0x51,0x25,0x2f,0x7e,0x4a,0x9a,0x7c,0x04,0x49,0xdb,0xea,0x0a,0x82,0x20,0x8d,
- 0x04,0x20,0xc4,0xc1,0xf8,0x7e,0xbd,0x5a,0xb3,0x3e,0x67,0x0f,0xdb,0x39,0xc1,0x5c,0x43,0x9e,0x19,0x73,0x32,0x90,0x1b,0x66,0xd0,0x1b,0x3e,0x3e,0xcf,0x64,0x0d,0x90,0x71,0x01,0x20,0x8d,
+ 0x04,0x20,0xc4,0x22,0xd5,0x31,0xb6,0x7e,0xb6,0x01,0xe2,0x56,0x4d,0x5b,0x5b,0x7e,0x98,0x94,0xbf,0x59,0x84,0xa2,0x40,0x95,0x0f,0x50,0xdf,0x46,0xfa,0x30,0x15,0x86,0x2a,0x47,0x20,0x8d,
+ 0x04,0x20,0xc4,0x89,0xef,0x0d,0x22,0x1c,0x56,0xc4,0xd6,0xeb,0xc2,0x03,0x8c,0x13,0x72,0xfc,0x7a,0x7a,0xf3,0xfc,0x44,0xc8,0x09,0x6e,0x6f,0x5c,0x34,0xfd,0x14,0x0c,0x95,0xd4,0x20,0x8d,
+ 0x04,0x20,0xc4,0xc2,0x40,0x14,0x0b,0x78,0xa6,0xb9,0x5f,0x52,0xd4,0x1e,0x76,0x82,0xca,0x00,0x67,0x4d,0x24,0x3b,0x6d,0x41,0x15,0x5a,0xbd,0xf8,0x60,0x36,0x5c,0xcc,0x39,0x34,0x20,0x8d,
0x04,0x20,0xc4,0xd1,0xa7,0x16,0x50,0x37,0xd5,0xcc,0x85,0x6d,0xf0,0x21,0x7e,0x66,0x00,0x74,0x75,0x97,0xb1,0x72,0x20,0x70,0xb4,0xdd,0x74,0xfa,0x45,0x99,0x26,0x13,0x1f,0x05,0x20,0x8d,
- 0x04,0x20,0xc4,0xd4,0xa8,0x11,0x0a,0xff,0xf2,0x94,0xd8,0x01,0x90,0xd6,0x29,0xd2,0x8c,0xdf,0xd3,0x1d,0xc7,0x51,0x37,0x84,0xab,0xd0,0x79,0x07,0xf1,0xf9,0xa0,0x0b,0x84,0x75,0x20,0x8d,
- 0x04,0x20,0xc4,0xe1,0xca,0x3a,0xd1,0xf5,0x6d,0x84,0xb2,0x29,0xa8,0x05,0xf0,0x21,0x89,0x4a,0xf3,0x85,0x95,0x87,0x81,0xdb,0xbc,0xf0,0x82,0x23,0x59,0xd1,0x8f,0xd4,0xd0,0x85,0x20,0x8d,
- 0x04,0x20,0xc4,0xe0,0x79,0x39,0x6a,0xfb,0xe1,0x48,0xf4,0x54,0xd1,0x41,0x78,0xd0,0x87,0xad,0xff,0xac,0x21,0x16,0x0e,0xf6,0xfe,0x4b,0x23,0x6e,0x50,0x34,0xc1,0x52,0x03,0x5f,0x20,0x8d,
- 0x04,0x20,0xc4,0xe1,0x98,0xb3,0xe5,0x51,0x36,0xa8,0x18,0xfd,0x0f,0xb5,0x30,0x43,0xf8,0xc1,0x12,0x69,0x8f,0x78,0xbd,0x80,0x82,0xa7,0x4f,0x43,0x1d,0x00,0x96,0x1c,0x7f,0xee,0x20,0x8d,
- 0x04,0x20,0xc4,0xe2,0x7a,0xe2,0x4c,0x7f,0x11,0x0d,0x42,0x8c,0x1c,0x5e,0x67,0xf7,0x90,0xdd,0x24,0x75,0x17,0xbb,0x0f,0x91,0xc7,0x5d,0xe3,0x19,0xb9,0x16,0x2d,0x5f,0x38,0x41,0x20,0x8d,
- 0x04,0x20,0xc4,0xf0,0xdd,0x13,0x61,0x53,0x0c,0x0a,0xc7,0x06,0x7a,0xbb,0x1c,0xe0,0x65,0x1b,0x0e,0xf5,0x12,0x22,0x10,0xa0,0x20,0x2a,0x5b,0xbc,0xda,0x13,0x43,0xb0,0x96,0x0d,0x20,0x8d,
- 0x04,0x20,0xc4,0xf3,0xe7,0x57,0xcb,0xeb,0x8a,0x74,0xd0,0x6b,0x2a,0x3a,0xad,0x79,0x72,0x37,0x2b,0xbf,0x3f,0xf7,0xb0,0x90,0x02,0xe3,0x52,0x18,0x29,0xc1,0x37,0xce,0xcd,0xcc,0x20,0x8d,
- 0x04,0x20,0xc4,0xf2,0xd6,0x79,0x36,0x03,0xcd,0xd3,0xec,0xa8,0x8a,0x19,0x00,0xfc,0x0e,0xd1,0xbf,0x44,0x1c,0x0a,0x36,0xcd,0x3f,0x1c,0x4f,0x2c,0x14,0xa3,0x0b,0x04,0x62,0x96,0x20,0x8d,
+ 0x04,0x20,0xc4,0xd9,0xd4,0x1e,0xce,0x2d,0x2f,0xc5,0x4e,0xe7,0x9d,0xc1,0xce,0xc8,0xe1,0x48,0x08,0xbc,0x07,0x2c,0x68,0x7f,0x48,0x21,0x6b,0x7d,0xf4,0x8c,0x33,0xb3,0x50,0x5b,0x20,0x8d,
0x04,0x20,0xc5,0x3c,0x85,0x9a,0xe9,0x29,0x4a,0x30,0xec,0xb0,0xfc,0xa3,0x6b,0x33,0x3e,0xc3,0x1f,0xb2,0xdc,0x24,0x8c,0xa6,0xf5,0xfa,0xa3,0x70,0x99,0x70,0xc6,0x25,0xe9,0x37,0x20,0x8d,
- 0x04,0x20,0xc5,0x3e,0x2e,0xa9,0x26,0x62,0xc4,0x8e,0x02,0x2e,0x2b,0xcd,0x0e,0x8f,0x50,0x97,0x4b,0x50,0xdb,0x79,0x00,0xbb,0xa6,0x81,0x8f,0x6e,0xaa,0x2f,0x56,0xe8,0x60,0xbd,0x20,0x8d,
- 0x04,0x20,0xc5,0x0a,0x4d,0xbb,0xb7,0xfc,0x9f,0x80,0xcb,0xb3,0x55,0x3d,0xc8,0xf8,0xf9,0x0c,0x45,0xcf,0x52,0x1e,0x46,0x55,0x8f,0x67,0x63,0xc5,0x42,0x0d,0x61,0x81,0x5d,0x48,0x20,0x8d,
- 0x04,0x20,0xc5,0x0e,0x40,0xcd,0xe1,0xf5,0x22,0xf9,0x46,0x3b,0x36,0xea,0xaf,0xcc,0x4b,0xea,0xdf,0xd1,0xcf,0xea,0x10,0x13,0xfc,0xbc,0xce,0xbf,0x63,0xcb,0xf9,0xf3,0xc4,0xaf,0x20,0x8d,
- 0x04,0x20,0xc5,0x20,0xe4,0x1e,0x3c,0x7f,0xfd,0x3d,0x62,0x8f,0xbd,0x04,0x8a,0x44,0x4f,0xcc,0x90,0x9e,0xa3,0x7a,0x23,0x52,0xb9,0x61,0xb0,0x74,0x75,0xd2,0x9c,0x75,0x40,0xef,0x20,0x8d,
0x04,0x20,0xc5,0x2f,0xbd,0x67,0xd1,0xea,0xc9,0x83,0x84,0x71,0x30,0xdf,0x34,0x72,0x46,0x35,0xf0,0xec,0x6f,0x7e,0x80,0x7f,0xb4,0x03,0xd2,0x57,0x48,0x62,0xad,0x1d,0x84,0xaa,0x20,0x8d,
- 0x04,0x20,0xc5,0x74,0x4c,0x92,0x10,0x29,0x1c,0xf8,0xcd,0x1b,0xf4,0x38,0x51,0xcb,0x62,0x54,0x39,0xba,0x8e,0xbf,0xaa,0xa7,0x02,0xbd,0xba,0x6b,0xeb,0xe4,0x49,0xa1,0xb8,0x31,0x20,0x8d,
- 0x04,0x20,0xc5,0x7e,0x04,0x34,0x38,0xbe,0x7d,0x62,0x25,0x27,0x7a,0x4d,0x9b,0xf8,0xc7,0x13,0x98,0x3b,0x0f,0x6a,0xf9,0x44,0xb8,0xd3,0x96,0x73,0x9d,0x71,0x3a,0xb8,0x4d,0xa2,0x20,0x8d,
- 0x04,0x20,0xc5,0x7e,0xb5,0x8b,0x03,0xb5,0x51,0xa6,0x72,0xef,0x6d,0x16,0x73,0x5c,0x51,0x49,0x3d,0x59,0x5a,0x72,0x04,0xa9,0xd0,0x85,0x86,0xbd,0x15,0xb5,0x99,0x6d,0xdf,0xe6,0x20,0x8d,
- 0x04,0x20,0xc5,0x4d,0x9a,0xb0,0xfc,0x69,0x91,0xbf,0x66,0xad,0xfb,0xc9,0xb0,0xb8,0x52,0xba,0x7c,0xf1,0x08,0x05,0x3f,0xeb,0xeb,0x32,0x56,0x50,0xdc,0x10,0xdc,0x79,0x3e,0xc3,0x20,0x8d,
- 0x04,0x20,0xc5,0x4f,0x55,0xf4,0x35,0x4b,0xfa,0xb4,0xb1,0xce,0xa2,0x59,0x6f,0xf2,0xc3,0xc4,0x1a,0x7a,0xd9,0x6c,0xe7,0x3f,0xef,0x5a,0xc6,0x87,0x66,0x76,0xe4,0x53,0xc3,0x51,0x20,0x8d,
- 0x04,0x20,0xc5,0x5a,0xf7,0xd7,0x6d,0xd9,0xec,0x4b,0xae,0xb4,0x31,0x6a,0x8b,0x57,0x7b,0xc0,0x81,0x5b,0x8e,0xcd,0x3e,0xb8,0x37,0xcb,0xb5,0x7e,0xf1,0xf5,0x5b,0xca,0xc9,0x37,0x20,0x8d,
- 0x04,0x20,0xc5,0x64,0xe5,0x5b,0xde,0x67,0xd5,0x08,0x41,0x37,0x0f,0x18,0xd9,0xa6,0xb6,0x3b,0x5e,0xe7,0x55,0xc4,0x17,0xa3,0x17,0xc2,0x63,0xc9,0x3c,0x51,0xd5,0xe1,0x9d,0x67,0x20,0x8d,
- 0x04,0x20,0xc5,0x68,0x3d,0x17,0xd6,0x0f,0x9f,0x42,0x0b,0x97,0x86,0xc1,0xec,0x46,0x80,0xbe,0xba,0x9c,0x0e,0x04,0x7b,0xac,0x7c,0xfb,0xb4,0xaa,0xc3,0x50,0xae,0x58,0x47,0xb9,0x20,0x8d,
- 0x04,0x20,0xc5,0x6a,0xe1,0xda,0x01,0xdc,0xb2,0xb3,0x2a,0xfc,0x21,0x85,0x88,0x7e,0x0c,0x3b,0xf0,0xe8,0x5c,0x78,0xb8,0xda,0xa9,0x5d,0x7e,0x7b,0xda,0xc0,0x19,0xb2,0xa7,0x1a,0x20,0x8d,
- 0x04,0x20,0xc5,0xbf,0x38,0x02,0x89,0x69,0x96,0xf4,0xb1,0x20,0x57,0x63,0xf9,0x5e,0xa9,0x37,0x0d,0x02,0x50,0x36,0x24,0xd9,0xd3,0xf7,0x84,0xf9,0x42,0x56,0xff,0x17,0xfa,0x8d,0x20,0x8d,
- 0x04,0x20,0xc5,0x82,0xf8,0xc9,0x0e,0x19,0xa6,0xb1,0x6a,0x0e,0xa0,0x6a,0xe9,0xf6,0x0c,0xd6,0x96,0xe3,0x52,0x71,0xd0,0xc2,0x8c,0xb1,0x6e,0x68,0xf8,0x31,0x20,0xaa,0x58,0x2f,0x20,0x8d,
- 0x04,0x20,0xc5,0x95,0x75,0x83,0x03,0x73,0xd1,0xec,0x19,0x24,0x31,0xa7,0x5e,0xe5,0xaf,0x9a,0xa2,0xb1,0xe6,0x47,0xfb,0xc8,0x6f,0x58,0x01,0x52,0x58,0x2a,0x71,0x5b,0x3b,0x02,0x20,0x8d,
- 0x04,0x20,0xc5,0x98,0x7e,0xe4,0x57,0xdc,0x75,0x11,0xff,0x2c,0x56,0x2f,0xd5,0x61,0x86,0xba,0xb9,0xb5,0xc8,0x0c,0x41,0x3b,0xa5,0x04,0xe0,0xc4,0x2d,0x0c,0x38,0x7d,0x9b,0x8d,0x20,0x8d,
- 0x04,0x20,0xc5,0xa1,0xe7,0x5c,0x65,0x1d,0x56,0x81,0x4f,0x62,0xa0,0x24,0x3d,0x81,0x55,0x12,0xf9,0xf4,0x5b,0xc1,0xbe,0x15,0x1a,0xa8,0x0b,0x23,0x22,0x2c,0x43,0x38,0xc8,0x96,0x20,0x8d,
- 0x04,0x20,0xc5,0xa0,0xa1,0xa9,0x07,0x7e,0x63,0xb3,0xdf,0xcb,0x06,0x97,0x98,0x48,0xd4,0x74,0x03,0x4b,0x29,0xbb,0xf4,0x05,0x10,0xa8,0xf5,0x5c,0xc7,0xed,0x64,0x71,0x35,0x1f,0x20,0x8d,
- 0x04,0x20,0xc5,0xa0,0xfd,0xa9,0x36,0x11,0xd5,0x37,0x6b,0x92,0x77,0x1a,0xde,0x38,0xb0,0xeb,0x3a,0x2e,0x77,0x81,0x9b,0x55,0x4b,0xf5,0x37,0x2c,0xd4,0xa8,0x67,0xde,0x1d,0x05,0x20,0x8d,
- 0x04,0x20,0xc5,0xa1,0x83,0x4b,0xfa,0x86,0x6e,0x15,0x24,0x8a,0x26,0x56,0x79,0x36,0x32,0x2b,0x5b,0x56,0x7b,0xc8,0x32,0x9d,0x52,0xb8,0xfa,0xf7,0xe3,0x4f,0x9d,0xdb,0x84,0xef,0x20,0x8d,
- 0x04,0x20,0xc5,0xaa,0xfc,0x52,0x3c,0x6e,0x3d,0x93,0x96,0xef,0x95,0x41,0xc6,0x1f,0xc2,0x1f,0x0f,0x3b,0x72,0x1f,0xc2,0xef,0xf9,0xa2,0x52,0x6d,0xc8,0x7b,0x1b,0x41,0x40,0xfa,0x20,0x8d,
- 0x04,0x20,0xc5,0xf6,0xd6,0xe2,0xf8,0xd9,0xf8,0x4b,0xeb,0x54,0x80,0xd3,0x62,0x3c,0xee,0x7c,0x66,0x4d,0xf1,0x24,0x5b,0x54,0xf8,0xf2,0x80,0xd8,0xf5,0xb5,0x4b,0xf0,0xba,0x63,0x20,0x8d,
- 0x04,0x20,0xc5,0xc1,0xa4,0x53,0xbe,0x2b,0xf8,0x8e,0x32,0xf9,0x1a,0x99,0x5f,0xde,0xf1,0x5d,0x31,0x79,0xab,0x0b,0x85,0x49,0x7a,0x08,0x88,0xad,0xf8,0x58,0x5c,0x29,0xc6,0x58,0x20,0x8d,
- 0x04,0x20,0xc5,0xcd,0x57,0xfb,0xcb,0x5e,0xc5,0xe5,0x3b,0xf6,0xe1,0xd9,0xfb,0xd7,0x2e,0x28,0xf6,0x20,0xed,0x54,0xda,0x53,0x01,0x72,0xc8,0x38,0x1e,0xdc,0x2b,0x76,0xba,0x12,0x20,0x8d,
- 0x04,0x20,0xc5,0xd6,0x0b,0xa0,0x00,0x9e,0x0a,0xd8,0xdf,0x6b,0xd5,0x4e,0x1e,0x3f,0xc3,0xdf,0x3e,0x34,0xe6,0x97,0xff,0x4c,0x25,0xe8,0x7b,0xd8,0x30,0x35,0xda,0x4f,0x77,0x6d,0x20,0x8d,
- 0x04,0x20,0xc5,0xd7,0x67,0xb2,0x49,0x18,0x5e,0xb1,0x9d,0x1d,0x3a,0xf2,0xe7,0xa2,0x48,0x73,0x76,0x88,0x05,0x39,0x7d,0x70,0x00,0x10,0x3c,0xc4,0xa7,0xbc,0xff,0x70,0x09,0xa1,0x20,0x8d,
- 0x04,0x20,0xc5,0xdb,0x49,0x2d,0x3f,0x3c,0x97,0x66,0x38,0xa7,0xdf,0x81,0xbf,0xca,0x6b,0x67,0x52,0x96,0xc3,0x9e,0xad,0x6b,0x86,0xcc,0xbc,0xd5,0x2d,0xbc,0xd1,0xd4,0x74,0xf7,0x20,0x8d,
- 0x04,0x20,0xc5,0xe1,0xb0,0xa6,0xc3,0x88,0x95,0xb5,0x95,0x75,0xb2,0x2e,0x9d,0x14,0x5a,0x5f,0xdf,0x98,0x34,0x80,0xea,0xfe,0x2a,0x0a,0xa8,0x03,0x1c,0x2f,0x6c,0x1a,0xbb,0xb2,0x20,0x8d,
- 0x04,0x20,0xc5,0xe2,0x40,0xf4,0x09,0xa0,0xda,0xf9,0xec,0x3f,0xcf,0x4f,0x84,0x64,0x09,0xf5,0x0a,0x61,0xf3,0xce,0xde,0xf9,0x69,0x8e,0x94,0xc0,0x00,0xa0,0xba,0xf6,0xcc,0xcc,0x20,0x8d,
- 0x04,0x20,0xc6,0x36,0x16,0xcb,0x2b,0x1e,0xa6,0x10,0xe0,0x7c,0xe9,0x74,0x9f,0x86,0x71,0x08,0xf3,0xa7,0xf7,0x32,0xa6,0x50,0x4d,0x7d,0x68,0x84,0x7f,0x73,0x28,0xa7,0xdf,0xe2,0x20,0x8d,
- 0x04,0x20,0xc6,0x3f,0x1a,0x48,0xe4,0x3e,0x85,0x0d,0x5c,0xc7,0x7c,0x87,0x95,0xc6,0xfc,0x33,0xc8,0x93,0x16,0xb2,0x29,0xe1,0xed,0xef,0x63,0xd2,0x67,0x31,0x3a,0xa7,0x3f,0x52,0x20,0x8d,
- 0x04,0x20,0xc6,0x0d,0x71,0x8a,0xb8,0x7f,0xa6,0xde,0x7a,0x8c,0x7b,0x2e,0xb9,0x1a,0x48,0xf0,0xa2,0x6d,0x5d,0x22,0x3d,0x0e,0x8d,0xb9,0x4e,0x0b,0x8b,0x2b,0xf0,0x70,0x35,0xa8,0x20,0x8d,
- 0x04,0x20,0xc6,0x1d,0xd9,0x72,0x3e,0xb4,0x7c,0xff,0xaf,0xaf,0xed,0x18,0xb7,0xfe,0xe6,0x0f,0x3f,0x43,0x11,0xf3,0xa1,0xa4,0x2a,0xf0,0xd5,0x7c,0xaf,0x54,0xae,0xd8,0x61,0x5f,0x20,0x8d,
- 0x04,0x20,0xc6,0x23,0xa7,0x92,0x19,0x6d,0x12,0x48,0xee,0x7e,0xde,0x30,0x75,0x88,0x12,0x4b,0x46,0x13,0xad,0x75,0x9d,0xee,0xa6,0x0a,0xb1,0xfb,0xf9,0x8b,0xbe,0x99,0x4c,0x45,0x20,0x8d,
- 0x04,0x20,0xc6,0x2c,0xc1,0x68,0xe7,0x57,0xe7,0xdf,0x13,0xe9,0xa3,0x7d,0xa7,0x20,0x70,0x2c,0xfc,0x9a,0xce,0xb5,0x5e,0x16,0x4b,0xa0,0xf9,0x30,0xa3,0x35,0x66,0xe4,0xe8,0x2f,0x20,0x8d,
- 0x04,0x20,0xc6,0x76,0x8c,0xdc,0xbe,0x78,0xe7,0x1d,0xd0,0x41,0x8a,0x28,0xee,0x05,0xe6,0x4b,0x75,0x54,0x48,0x03,0xe5,0x4c,0xe1,0x2a,0x64,0xbb,0x5f,0x5d,0xc4,0xa6,0x04,0x76,0x20,0x8d,
- 0x04,0x20,0xc6,0x78,0xbf,0x82,0x02,0x49,0x76,0xb1,0x0e,0x63,0x15,0x2e,0xeb,0xad,0x24,0x1c,0x45,0x15,0xbb,0x6b,0xa7,0x95,0x33,0xcb,0x41,0xaa,0x48,0xe4,0x2f,0x96,0x85,0xf6,0x20,0x8d,
- 0x04,0x20,0xc6,0x7a,0x8f,0x49,0x63,0xc5,0xa3,0xa6,0x43,0x27,0xec,0x19,0x67,0x40,0xa6,0x94,0xc1,0xd2,0xfb,0xe1,0x30,0xcf,0x07,0x18,0x89,0x4b,0x1e,0x46,0x99,0x7b,0x5a,0xc0,0x20,0x8d,
- 0x04,0x20,0xc6,0x40,0xa3,0x3a,0x2d,0x89,0xf3,0x92,0x35,0xe2,0x5b,0xb8,0x03,0xe0,0x08,0xea,0xef,0x23,0x79,0x89,0x87,0x33,0x1b,0x2c,0xf0,0x9e,0xca,0x5e,0x48,0x2b,0xba,0x39,0x20,0x8d,
- 0x04,0x20,0xc6,0x42,0xa0,0x6a,0x58,0x30,0x7a,0x48,0x1a,0x26,0x56,0xa5,0x58,0x21,0xbd,0x3a,0xf6,0x32,0xa9,0xb9,0x28,0xdb,0xeb,0x66,0xcd,0x11,0x2f,0x22,0x25,0x91,0x7f,0x6c,0x20,0x8d,
- 0x04,0x20,0xc6,0x4f,0xa4,0x34,0x84,0x2a,0xb2,0xe3,0x89,0x5f,0xaa,0xac,0x22,0x93,0xda,0x55,0x5e,0xb9,0x2f,0x1d,0xbb,0x78,0x36,0x33,0x5d,0x2b,0xee,0x14,0xc3,0x55,0x06,0xf8,0x20,0x8d,
- 0x04,0x20,0xc6,0x50,0x67,0x48,0xa4,0xbb,0xc4,0xef,0x7c,0x58,0xd9,0x37,0xab,0x90,0xeb,0x7d,0x9d,0x1d,0xfc,0xaf,0xee,0x99,0x8e,0xbe,0xd3,0x8e,0xaf,0x26,0xa7,0x6c,0xba,0xfe,0x20,0x8d,
- 0x04,0x20,0xc6,0x50,0x90,0xfd,0xf4,0xf3,0x23,0x11,0xd8,0x3f,0x92,0xa9,0xa2,0x6c,0x8f,0x2e,0x22,0xa3,0xaf,0xf3,0xd0,0x3f,0xad,0xd4,0x08,0x94,0x28,0xb8,0xee,0x2e,0x05,0xdd,0x20,0x8d,
- 0x04,0x20,0xc6,0x56,0x04,0x6f,0xb1,0x00,0xc6,0x3d,0x28,0x69,0x6d,0x14,0xd9,0x7e,0x9d,0x9f,0x19,0xc6,0x99,0x1d,0x19,0x62,0xb8,0x7f,0x44,0xf2,0xe0,0x5d,0x1d,0xfd,0x1e,0x55,0x20,0x8d,
0x04,0x20,0xc6,0x5d,0xaa,0xe7,0x8a,0xa2,0x26,0xce,0xef,0x36,0xc3,0x54,0xcf,0x8c,0x65,0x1d,0xba,0x49,0x0a,0x4f,0xe9,0x5f,0xf8,0x98,0xbe,0xa4,0x9e,0xf3,0x93,0xdd,0xdb,0x2a,0x20,0x8d,
- 0x04,0x20,0xc6,0x60,0x5c,0xdb,0xe5,0x36,0x73,0x2f,0x6e,0xef,0xac,0x8d,0x96,0x9d,0xa0,0x94,0xae,0x20,0x0c,0x25,0x05,0xee,0x0b,0x85,0x8a,0x29,0x6a,0x49,0x18,0x77,0x46,0x4f,0x20,0x8d,
- 0x04,0x20,0xc6,0x63,0x6f,0xd1,0x45,0xa2,0xff,0x13,0xd5,0x6b,0x24,0xd8,0x00,0xb3,0x7f,0xb5,0x1e,0xa3,0xca,0xf6,0x76,0x89,0x28,0x41,0xd3,0x93,0x8f,0xe3,0x5d,0x01,0xef,0xe5,0x20,0x8d,
- 0x04,0x20,0xc6,0x65,0xa0,0x8c,0xf6,0x3d,0xca,0x60,0x3b,0x2f,0x12,0x05,0xca,0xfb,0xd6,0xfd,0xac,0xbb,0xc6,0x3b,0xaf,0x2e,0xf3,0x64,0x91,0xfe,0xf7,0x02,0x1c,0x56,0x25,0x90,0x20,0x8d,
- 0x04,0x20,0xce,0xb6,0xf2,0xa3,0x37,0xb3,0xc0,0x4d,0x48,0x29,0x27,0xf5,0xa4,0x12,0x55,0x1f,0xa2,0x2b,0xb6,0x60,0xc8,0x80,0xe2,0x14,0x01,0xcc,0xa8,0x35,0x0b,0x97,0xbb,0x26,0x20,0x8d,
0x04,0x20,0xce,0x88,0xac,0x71,0xfc,0x76,0x56,0xa8,0xc5,0x94,0x86,0x93,0x01,0x67,0xd6,0xd2,0xb5,0xa8,0x93,0xc7,0xbc,0x59,0xba,0x33,0x98,0x78,0x9a,0xcc,0xb1,0xf2,0x47,0x1f,0x20,0x8d,
- 0x04,0x20,0xce,0x88,0xee,0x50,0x4a,0x1e,0xf0,0xc3,0x4e,0x49,0x44,0xc0,0x6f,0xe2,0x14,0x53,0x13,0x24,0xbe,0xd4,0x2e,0xc7,0xb6,0xbe,0x1c,0x74,0x94,0x40,0x4d,0xea,0x12,0x1b,0x20,0x8d,
- 0x04,0x20,0xce,0x8c,0xdc,0x9c,0x1f,0x9c,0xd0,0x96,0x2c,0x9f,0xe8,0xeb,0x01,0xe4,0x04,0x86,0x77,0x7c,0x5f,0x29,0x8c,0x60,0x1c,0xc5,0x01,0xad,0x82,0xe6,0x1f,0xfc,0x49,0x39,0x20,0x8d,
- 0x04,0x20,0xce,0x90,0x7b,0xb4,0x9f,0x5e,0x1c,0x3b,0x19,0x6a,0xb3,0xea,0x36,0x67,0x60,0xf6,0xf9,0xb6,0x49,0x11,0x8d,0x52,0xc0,0x17,0x4f,0xc4,0xe8,0xed,0xa7,0x12,0x00,0x62,0x20,0x8d,
- 0x04,0x20,0xce,0x96,0x75,0xc8,0xf7,0x02,0xba,0xeb,0x55,0x10,0x86,0x40,0x24,0xff,0x68,0x71,0x67,0x06,0x56,0x1d,0x40,0xc1,0x66,0x44,0xd3,0xe2,0xb7,0xcf,0x86,0xd1,0xf6,0x28,0x20,0x8d,
- 0x04,0x20,0xce,0x9a,0x94,0x2c,0xe9,0x5e,0xf7,0x87,0x50,0x93,0xec,0x42,0x32,0xb1,0xa2,0x00,0xdf,0x3f,0xcd,0xc7,0x98,0x9c,0xd5,0xcb,0x70,0x3b,0xeb,0x48,0x15,0x51,0x23,0xa6,0x20,0x8d,
- 0x04,0x20,0xce,0x9a,0xe1,0x0f,0x87,0x04,0x27,0xae,0xfc,0x58,0x8f,0x8a,0x49,0x4d,0x03,0xf9,0x1a,0xe2,0x7f,0x50,0x7b,0x29,0xaf,0x8a,0x95,0xa9,0x1c,0xe6,0xf2,0x22,0x02,0xb8,0x20,0x8d,
- 0x04,0x20,0xce,0xb0,0x9a,0xdc,0x35,0xdc,0x4a,0xf9,0x3b,0x82,0x4a,0xae,0x2e,0x23,0xfa,0x2f,0x7b,0x70,0xf4,0xa8,0x3c,0xce,0x21,0x86,0xa7,0xf0,0xdf,0xf3,0x1e,0xf9,0xd4,0x35,0x20,0x8d,
- 0x04,0x20,0xce,0xf6,0x68,0xf8,0xad,0x46,0xf4,0xd5,0x1c,0xac,0x53,0xaa,0x20,0xd5,0xf4,0x57,0xe5,0xa0,0x4d,0xd0,0x28,0x69,0x91,0x9b,0x3a,0x4c,0xb2,0x7e,0xd0,0x1f,0xc8,0xe9,0x20,0x8d,
- 0x04,0x20,0xce,0xfd,0xcd,0x7e,0x20,0x6c,0xd1,0x8e,0x21,0x4b,0x26,0x10,0x7b,0x16,0xc7,0xd1,0x81,0xb7,0xe2,0x10,0xcf,0xc6,0xe2,0x66,0x39,0x56,0x2b,0xdd,0x05,0x1b,0x63,0xc4,0x20,0x8d,
- 0x04,0x20,0xce,0xc1,0x23,0x66,0x99,0x1d,0x4f,0x18,0x91,0x30,0x4b,0x54,0x6e,0xc0,0xa4,0xc3,0x64,0xfa,0x5b,0x39,0x8a,0xf7,0x28,0xfe,0x44,0x85,0xd7,0x65,0x20,0x8c,0x6c,0x5f,0x20,0x8d,
- 0x04,0x20,0xce,0xce,0x39,0xbe,0xac,0x68,0x33,0xa4,0x66,0xad,0x5b,0x9f,0x96,0x14,0xc3,0x0e,0xa5,0x86,0xc9,0xcc,0xc9,0xb1,0xed,0x1f,0xf5,0x5d,0xeb,0x26,0xef,0x10,0x39,0xa8,0x20,0x8d,
- 0x04,0x20,0xce,0xce,0x61,0x9d,0x3f,0xcd,0xe6,0x83,0xe8,0xca,0x4a,0xda,0x4b,0xf9,0xc2,0x14,0xf3,0x6d,0xcd,0xe3,0xf1,0x7a,0x47,0x06,0xd1,0x6c,0xe2,0x7b,0xcd,0x16,0xb7,0x94,0x20,0x8d,
- 0x04,0x20,0xce,0xd2,0xbd,0x23,0x25,0xbd,0x8a,0xc8,0x34,0x21,0x88,0x05,0xb9,0xd2,0x53,0x6f,0x02,0xd3,0x61,0x89,0xd4,0xd0,0x0d,0x49,0xbf,0x6d,0x30,0x27,0x34,0x2c,0x4c,0x94,0x20,0x8d,
- 0x04,0x20,0xce,0xd9,0xb0,0x7a,0xc8,0x47,0xb4,0x91,0x6f,0xe2,0xd1,0x6d,0xf3,0xd0,0x40,0xfb,0x29,0xc2,0x62,0xcd,0x94,0x90,0xd1,0xd4,0xed,0xd9,0xe2,0x7d,0xcf,0x98,0xe2,0xac,0x20,0x8d,
- 0x04,0x20,0xce,0xdc,0x3d,0x6c,0xae,0x09,0xd5,0x5c,0x3e,0xe0,0x8b,0x49,0x0d,0x96,0x12,0x1c,0x95,0x24,0xcf,0x67,0x65,0x12,0xd5,0x81,0x16,0x0f,0xba,0x71,0xd8,0x1a,0x6f,0x6e,0x20,0x8d,
- 0x04,0x20,0xcf,0x34,0xd7,0xf7,0x29,0x1e,0xe6,0x76,0x8f,0xbc,0x3f,0x5b,0xce,0xa0,0x38,0x6e,0x7b,0x50,0xec,0xab,0x09,0xb0,0xf9,0xf1,0x84,0xd0,0xb6,0x16,0xd5,0xb3,0x6f,0x23,0x20,0x8d,
- 0x04,0x20,0xcf,0x07,0xf2,0xf0,0x75,0x85,0x27,0x9a,0xd6,0x0a,0x62,0x77,0xdc,0xb7,0x2f,0xc3,0xa3,0x17,0x40,0xdd,0xda,0x4e,0x12,0xcf,0x7c,0x36,0x15,0xa3,0xef,0x96,0xcb,0xa3,0x20,0x8d,
0x04,0x20,0xcf,0x0d,0x58,0x61,0x8c,0x4f,0x52,0xc3,0x6c,0x6d,0x03,0xbe,0xad,0xd4,0x5a,0xe7,0x5f,0x92,0x3e,0x02,0x89,0x2b,0x9c,0x1f,0x92,0xed,0xdb,0xd2,0x88,0x5e,0x03,0xc9,0x20,0x8d,
- 0x04,0x20,0xcf,0x18,0xc7,0x85,0x3f,0x60,0xf4,0xb4,0xa7,0x4d,0xc8,0x55,0xd0,0xfa,0x53,0x1c,0x5c,0xc7,0xea,0x57,0x3e,0x24,0x32,0x5d,0x10,0xf2,0x93,0x07,0xe8,0xce,0xd6,0x0a,0x20,0x8d,
- 0x04,0x20,0xcf,0x1f,0x8a,0x8e,0x8f,0x12,0x09,0x48,0x4f,0x35,0x39,0xf9,0xf9,0x05,0x00,0x38,0xf0,0x43,0x55,0xe6,0x9d,0x8c,0x56,0x2e,0xa5,0x94,0x59,0xcc,0x27,0xc6,0xeb,0x27,0x20,0x8d,
- 0x04,0x20,0xcf,0x20,0x6a,0x81,0x26,0x56,0xe7,0x1f,0x01,0xcc,0x47,0xf2,0xa7,0xa1,0x0b,0xbf,0x6e,0x1f,0x4e,0xa0,0xad,0x1f,0x5b,0x73,0x52,0x32,0x4b,0xb0,0x96,0x11,0x35,0x95,0x20,0x8d,
- 0x04,0x20,0xcf,0x22,0x68,0xca,0x83,0xce,0xec,0x9b,0xfe,0x98,0x51,0xb4,0xa6,0x08,0x03,0xb2,0x2e,0xa5,0xa0,0x31,0xe8,0x78,0xae,0xb6,0x8b,0xb4,0x5f,0x71,0x25,0x40,0x95,0x3c,0x20,0x8d,
- 0x04,0x20,0xcf,0x25,0xe3,0x74,0x30,0x1b,0x1d,0xce,0x76,0xb4,0xd2,0x3d,0x31,0x33,0xbc,0xca,0x70,0xf2,0x9d,0x7d,0xa5,0x9b,0x78,0x26,0x1f,0xf7,0x02,0x1a,0x74,0xfb,0xf9,0x94,0x20,0x8d,
- 0x04,0x20,0xcf,0x33,0x1d,0xd7,0x5b,0xd4,0x41,0x84,0xe3,0xe4,0xe5,0xa9,0x7b,0x93,0x3a,0x0a,0xf3,0xe7,0xf8,0x0f,0xc5,0x79,0x27,0x52,0xe9,0xcc,0xe0,0xda,0xed,0x95,0x06,0x26,0x20,0x8d,
- 0x04,0x20,0xcf,0x74,0x1b,0xfb,0xdd,0xfb,0x2a,0x0d,0xe1,0x33,0x8d,0x26,0x93,0xdd,0xc9,0x50,0x6c,0xc8,0xb1,0xa3,0x56,0xe3,0xb6,0xbe,0x77,0x17,0x6f,0x0c,0xed,0xa3,0xf6,0x8b,0x20,0x8d,
- 0x04,0x20,0xcf,0x48,0x26,0x9f,0xe2,0x8b,0xcc,0xee,0xf1,0xa5,0x5a,0xfd,0x00,0xd9,0x7c,0xc0,0x6a,0x50,0xc3,0x68,0xc8,0x33,0x21,0xd3,0x6f,0x7f,0xb3,0x05,0x01,0x9c,0xfb,0x69,0x20,0x8d,
- 0x04,0x20,0xcf,0x6b,0xed,0xa3,0xeb,0xa9,0xd4,0x51,0xc0,0x44,0xbe,0xd0,0xe2,0x37,0x1e,0xd1,0x97,0x73,0xbe,0x6e,0xb4,0xe2,0x57,0x17,0xbc,0x80,0x57,0xde,0x75,0x8b,0x11,0xd5,0x20,0x8d,
- 0x04,0x20,0xcf,0xb4,0xa1,0x8c,0xb4,0x9f,0xf8,0xee,0xb5,0x38,0x21,0xd4,0x35,0xa7,0x82,0x00,0x3d,0x83,0x75,0xd1,0xcf,0x57,0x96,0x80,0x42,0x78,0x56,0xe8,0x43,0x52,0x42,0x2c,0x20,0x8d,
- 0x04,0x20,0xcf,0xb5,0x1e,0xea,0x04,0x33,0x0d,0x5e,0x3a,0x78,0x33,0x82,0x91,0xca,0x81,0x17,0x92,0x52,0x80,0x88,0xd6,0xce,0x4f,0x37,0xbd,0xd8,0x14,0x2e,0x59,0xa5,0xec,0x71,0x20,0x8d,
- 0x04,0x20,0xcf,0xb6,0x3f,0xfc,0xc3,0xf8,0x23,0x32,0x28,0xa4,0x03,0x15,0x0c,0x09,0xa8,0xfc,0xf3,0x15,0x54,0x22,0xef,0x0b,0x08,0xff,0x7b,0xa9,0x28,0xe0,0x42,0xfc,0xea,0x6c,0x20,0x8d,
- 0x04,0x20,0xcf,0xb6,0x57,0xa2,0x79,0x1d,0xb6,0xe9,0xfb,0x56,0x9d,0xe6,0x86,0x8c,0xfd,0xde,0xf9,0x40,0x4f,0x3a,0x2a,0xee,0x6f,0x45,0xcd,0xc6,0x3c,0x9b,0x5f,0x59,0x9a,0x65,0x20,0x8d,
- 0x04,0x20,0xcf,0xb9,0xa1,0xf3,0xa0,0x05,0x08,0x78,0xeb,0x02,0x65,0x78,0x4b,0x57,0xd9,0x55,0x92,0xba,0xac,0xf6,0x2f,0x6c,0xba,0x12,0x98,0xee,0x1a,0xfa,0x72,0x0c,0x29,0x45,0x20,0x8d,
- 0x04,0x20,0xcf,0xba,0xb0,0xde,0x95,0x77,0x6f,0xbf,0x56,0x95,0xec,0x4d,0x63,0x61,0xcf,0x5c,0x13,0x9c,0x89,0x16,0xa8,0x75,0x63,0xd5,0xdb,0x9a,0xcc,0x7c,0x9d,0xfe,0xca,0x13,0x20,0x8d,
- 0x04,0x20,0xcf,0x8d,0x1e,0x8b,0xb8,0x8b,0xfb,0x22,0x42,0x56,0xfe,0xc3,0xa7,0xa9,0xbb,0x47,0x01,0x01,0xf5,0x03,0x66,0x4c,0x81,0xa4,0x47,0x4a,0x59,0xf2,0xe8,0xe3,0x31,0x54,0x20,0x8d,
- 0x04,0x20,0xcf,0x9b,0xb3,0xff,0xb4,0xea,0x94,0x3e,0xdd,0x50,0x2d,0x83,0x00,0x48,0x7a,0x89,0x15,0x70,0x32,0x5b,0x4a,0x1b,0x18,0xc0,0x09,0xfb,0xf7,0xb8,0x0e,0xf0,0xf9,0x46,0x20,0x8d,
- 0x04,0x20,0xcf,0x9b,0xd5,0x2b,0x00,0x0a,0xf4,0x7a,0x42,0x62,0x7e,0xf7,0xa6,0xfa,0xe1,0x77,0xd4,0xf4,0x2c,0x56,0xe0,0x7d,0xc3,0x3a,0xb9,0x9d,0xb7,0x2b,0x4f,0x34,0x59,0xa7,0x20,0x8d,
- 0x04,0x20,0xcf,0x9b,0x0f,0x2d,0x4c,0x4b,0xb0,0x93,0xc1,0xfd,0x4e,0xe6,0x6d,0x18,0x49,0x87,0x09,0xb3,0x98,0x74,0x77,0xf9,0x46,0xb2,0x6c,0x6e,0x02,0x3f,0x83,0xff,0xf9,0xdf,0x20,0x8d,
- 0x04,0x20,0xcf,0x9b,0x4a,0xdd,0xa9,0x40,0x89,0x5d,0xd7,0x9f,0x77,0x2b,0x74,0xd8,0x0a,0x2e,0x7c,0x6d,0xa6,0xb8,0x76,0xd7,0xc8,0x8e,0x5d,0x84,0x0a,0x97,0xce,0x08,0x27,0x62,0x20,0x8d,
- 0x04,0x20,0xcf,0x9c,0xa4,0xdd,0x82,0x5d,0x85,0xde,0xbc,0x36,0x43,0xa1,0x7e,0xdb,0x14,0x07,0xe2,0x97,0x04,0x4c,0x0c,0xe6,0xf9,0x93,0xba,0xec,0xd7,0x3d,0x18,0x97,0x48,0x93,0x20,0x8d,
- 0x04,0x20,0xcf,0xa0,0xc2,0xef,0x4c,0x58,0xff,0x48,0x25,0x97,0xf1,0xe2,0xe8,0x35,0x48,0x21,0x23,0x29,0xbf,0x75,0x59,0x37,0x4d,0x8d,0xde,0x70,0xee,0x83,0x6e,0x81,0x65,0x7b,0x20,0x8d,
- 0x04,0x20,0xcf,0xa5,0xe9,0xf8,0x28,0xe2,0xd6,0xfa,0x38,0x7e,0x8b,0x40,0xa1,0x6f,0x9c,0xb3,0x76,0x7f,0x11,0x2f,0x29,0x13,0x78,0xa9,0x2e,0x3a,0x53,0x8d,0x73,0xd2,0x3d,0x8a,0x20,0x8d,
+ 0x04,0x20,0xcf,0x87,0xf5,0xaf,0x3f,0x60,0x20,0x66,0xb9,0xc0,0x0f,0x03,0xe9,0x38,0xc5,0xf9,0x25,0x90,0x19,0x7f,0x3a,0x0d,0x1a,0xaa,0x5a,0x26,0x15,0x67,0x19,0x05,0xb1,0xf6,0x20,0x8d,
0x04,0x20,0xcf,0xa4,0xe0,0x76,0x4f,0x53,0x51,0xdc,0x93,0xcf,0xd5,0xcd,0xe5,0xb4,0x87,0xa6,0xc7,0xf3,0xb6,0x0d,0xe8,0xc6,0x8c,0x6f,0x89,0x99,0x07,0x62,0x18,0xbc,0x96,0x20,0x20,0x8d,
- 0x04,0x20,0xcf,0xa7,0xe2,0xde,0xc7,0x33,0x47,0x54,0x6f,0xd5,0x88,0x3c,0x3e,0x8e,0x80,0x8e,0x2f,0xa6,0x7f,0xb5,0xf0,0x3b,0x87,0x67,0x62,0x82,0x56,0x9e,0xed,0x4e,0xe5,0x99,0x20,0x8d,
- 0x04,0x20,0xcf,0xa6,0xc0,0x16,0xb0,0xb1,0x75,0x21,0xf2,0x22,0x3b,0x40,0x53,0x72,0x91,0x15,0x0d,0xcb,0xbd,0x58,0x5d,0x97,0x2d,0x3a,0xd1,0xa6,0x10,0x50,0x0e,0x80,0x23,0x49,0x20,0x8d,
- 0x04,0x20,0xcf,0xa9,0xc9,0x6e,0x99,0xf0,0x6e,0xa2,0x6e,0x78,0x40,0x70,0x21,0x04,0xdf,0xa0,0x2f,0x3e,0x08,0x3c,0x1d,0x08,0x3d,0x8a,0x9b,0x78,0x53,0x6f,0x16,0x30,0x17,0x5a,0x20,0x8d,
- 0x04,0x20,0xcf,0xf5,0x11,0xec,0x11,0x50,0x23,0x1f,0x10,0x87,0xa0,0x8d,0xf8,0xc5,0x49,0x65,0x60,0xdc,0x8c,0x29,0x63,0xde,0x55,0x7f,0x22,0xae,0x47,0xf4,0xc2,0x35,0x44,0x8b,0x20,0x8d,
- 0x04,0x20,0xcf,0xf9,0xdb,0x28,0x4b,0x5f,0xea,0xa5,0x46,0xff,0xc8,0x18,0x80,0xd4,0x38,0x82,0x66,0x27,0xef,0x1f,0xb0,0xf3,0xd5,0x0f,0x7b,0x32,0x13,0x72,0xe7,0xbc,0x15,0xf2,0x20,0x8d,
- 0x04,0x20,0xcf,0xc8,0x1d,0x5d,0x48,0x41,0x92,0x32,0x83,0x1c,0x11,0xf8,0xfa,0x04,0x90,0xb8,0x74,0x9b,0x63,0x23,0x0f,0x4a,0xee,0xba,0xca,0x0c,0xc9,0x83,0x90,0xa4,0x57,0xfd,0x20,0x8d,
0x04,0x20,0xcf,0xcb,0xf5,0xc6,0xb4,0x7f,0xb7,0xab,0x28,0x39,0x43,0x6a,0x15,0x63,0x11,0x3b,0x0d,0x40,0x17,0x85,0xcc,0xfd,0x95,0x91,0x18,0x6a,0xb5,0x5a,0x56,0xc3,0xb4,0xfd,0x20,0x8d,
- 0x04,0x20,0xcf,0xcd,0xb9,0xdf,0x6d,0xa0,0x98,0x3e,0xbb,0x35,0x97,0xec,0x68,0x71,0x1a,0x8a,0x11,0x42,0xdd,0x74,0x9d,0x75,0x49,0x3a,0xd1,0xdb,0xf8,0xb4,0x5c,0xa1,0xbf,0x78,0x20,0x8d,
- 0x04,0x20,0xcf,0xcd,0xc4,0x11,0x4d,0xda,0x3e,0xd5,0xa1,0x0e,0xb2,0xe7,0xb2,0x2b,0xee,0xf5,0xd6,0x74,0x76,0x75,0xd1,0xdc,0x5c,0x08,0x02,0x4c,0x14,0xf2,0x39,0x09,0x31,0xd8,0x20,0x8d,
- 0x04,0x20,0xcf,0xd3,0xa5,0x88,0xa9,0xe8,0x76,0x89,0x43,0x2d,0x90,0x79,0xc4,0x55,0x1e,0xf2,0xec,0xc4,0x0c,0x45,0x93,0xd9,0x51,0xc5,0x87,0x09,0x69,0x8a,0x07,0x47,0xdd,0x82,0x20,0x8d,
- 0x04,0x20,0xcf,0xd2,0x10,0xd9,0x58,0xc8,0x3c,0x4d,0xfd,0x10,0x74,0xbd,0x4f,0xad,0xbb,0x69,0x06,0xe6,0x75,0x1b,0x18,0x9a,0xeb,0x0e,0x42,0x8f,0xec,0x54,0xea,0xf8,0x34,0x49,0x20,0x8d,
0x04,0x20,0xcf,0xd3,0x37,0x80,0xc7,0x67,0x1a,0x0e,0xbd,0xdd,0x7e,0xbe,0x5b,0x04,0x67,0xd0,0x21,0xbc,0xf2,0x2a,0x7d,0x8e,0x7c,0x91,0x8b,0x89,0xe4,0xe2,0x16,0x34,0xd6,0x7a,0x20,0x8d,
- 0x04,0x20,0xcf,0xd9,0xf8,0xb3,0x27,0x72,0xfd,0x2b,0x41,0xaa,0xf2,0xf9,0x20,0x0e,0x29,0x35,0xec,0xd3,0x1a,0x7d,0xcd,0x8c,0xfd,0x26,0xfe,0x98,0x06,0x20,0x7f,0x8e,0xeb,0xe9,0x20,0x8d,
- 0x04,0x20,0xcf,0xd8,0x2a,0x20,0xfd,0xad,0xbb,0x07,0x07,0xce,0xec,0x0d,0xaf,0xa4,0xee,0xcd,0x05,0x97,0xc2,0xfd,0x5b,0x32,0xbd,0x18,0xe5,0xbc,0x41,0xdd,0xcd,0xd5,0xd1,0xfb,0x20,0x8d,
- 0x04,0x20,0xcf,0xe3,0x76,0x45,0x95,0x9c,0x82,0x68,0xc6,0xd6,0x3f,0x15,0xbf,0x85,0xea,0x57,0x87,0x3a,0x6c,0x10,0xf9,0x7a,0x3e,0x73,0x58,0x97,0xfa,0xd2,0x3f,0x1e,0x8e,0xa1,0x20,0x8d,
- 0x04,0x20,0xcf,0xe9,0xbd,0x79,0x0e,0xb1,0x56,0xda,0xfa,0x75,0xc7,0xa8,0x8b,0x59,0x54,0x95,0xf9,0x50,0x4f,0xa6,0x18,0x2f,0x60,0x30,0x4f,0xf2,0x47,0xab,0x13,0x7d,0x41,0xfd,0x20,0x8d,
- 0x04,0x20,0xc8,0x3c,0xad,0x53,0x53,0xd6,0x9c,0x71,0xc5,0xf0,0x0a,0x22,0x93,0xaf,0xfd,0x20,0x07,0x71,0x26,0xad,0x81,0x54,0xbe,0x07,0x24,0xc1,0x82,0xd5,0xa2,0x12,0x17,0x3a,0x20,0x8d,
- 0x04,0x20,0xc8,0x03,0x7f,0xc8,0xe8,0xc8,0xca,0x23,0xc4,0xb3,0x3c,0x92,0x2a,0x63,0x0f,0x86,0x39,0xfd,0xb5,0x1a,0xd9,0x02,0x8e,0x00,0x83,0x75,0xb8,0x13,0x74,0x5c,0x9a,0xf8,0x20,0x8d,
- 0x04,0x20,0xc8,0x05,0xe8,0x1c,0x30,0x08,0x7b,0x87,0x72,0x35,0x14,0x98,0x14,0x2d,0xfb,0xdb,0x86,0xac,0x96,0xd1,0x2c,0xec,0xc0,0x73,0x0e,0xe9,0xdd,0x1e,0x06,0x29,0xe0,0xf6,0x20,0x8d,
- 0x04,0x20,0xc8,0x07,0xd1,0xab,0x0a,0x53,0x88,0xba,0x76,0x63,0x4f,0xd7,0xf6,0x47,0x5c,0x78,0xcb,0xe2,0x3a,0x5c,0x77,0xc4,0x19,0x75,0xb5,0xbf,0x82,0x23,0x77,0x9c,0xd9,0x21,0x20,0x8d,
- 0x04,0x20,0xc8,0x0a,0x30,0x15,0x83,0xd1,0xfd,0x42,0x69,0xec,0xa2,0x75,0xd1,0x1c,0xec,0x54,0x00,0x3d,0xa4,0x62,0xbd,0xa6,0x02,0x4a,0x5a,0x73,0xee,0xa8,0xc5,0xce,0x7d,0x87,0x20,0x8d,
- 0x04,0x20,0xc8,0x0c,0xa3,0x80,0xc3,0xcd,0x54,0x67,0xd1,0xdd,0xcb,0x4a,0xba,0xdc,0x50,0xb8,0x17,0xd9,0xd8,0x86,0xdd,0x64,0x07,0x01,0xcd,0x95,0x64,0xbf,0xc7,0xee,0x89,0xd7,0x20,0x8d,
- 0x04,0x20,0xc8,0x0f,0x1a,0xa1,0xb4,0x15,0x2e,0xfb,0xd3,0xbe,0x3f,0x9a,0xa4,0x22,0xdf,0x15,0x69,0x3b,0xc6,0x80,0xf7,0x57,0xc4,0xe1,0xb5,0xb2,0xb3,0x3d,0x07,0x2c,0x25,0x2a,0x20,0x8d,
- 0x04,0x20,0xc8,0x17,0x13,0xda,0x89,0xea,0x79,0xf9,0xb6,0x65,0x2a,0xff,0xfb,0xc4,0x64,0x3e,0x4b,0x68,0x7c,0x5f,0x1d,0x0e,0x08,0x71,0x36,0x6c,0x3b,0x51,0xcc,0x73,0x02,0x6c,0x20,0x8d,
- 0x04,0x20,0xc8,0x2d,0xf3,0x35,0x78,0x24,0x22,0xb7,0x98,0x4c,0x93,0xf6,0x4f,0x6c,0x0d,0xa9,0x28,0x39,0x08,0xe7,0x41,0x40,0x02,0x66,0x9b,0xb1,0x03,0xbc,0xf9,0xe9,0x48,0xe7,0x20,0x8d,
- 0x04,0x20,0xc8,0x30,0x5a,0x61,0x9e,0x4e,0xfa,0xcb,0xbe,0x23,0x93,0x35,0x7f,0xbe,0xb6,0x96,0xab,0x80,0x39,0x0d,0x93,0x98,0x30,0x9a,0x30,0x09,0x35,0xa8,0x88,0x5f,0xfa,0x7e,0x20,0x8d,
- 0x04,0x20,0xc8,0x75,0xaf,0x49,0x5b,0x22,0xd3,0x71,0x08,0x12,0xb1,0x4c,0xea,0x53,0xcc,0x44,0xe9,0xcd,0xc8,0xba,0x18,0x1b,0xc2,0x93,0x06,0x8c,0x1a,0xba,0xc5,0xd3,0xf6,0x7d,0x20,0x8d,
- 0x04,0x20,0xc8,0x75,0x04,0x5f,0x2c,0x91,0x26,0x77,0x58,0x7e,0x2c,0x1b,0x64,0x2a,0xaf,0xde,0x08,0x42,0x3b,0x79,0xa9,0xcc,0x96,0x43,0x58,0x0e,0xbf,0x32,0xc9,0x72,0x11,0x94,0x20,0x8d,
- 0x04,0x20,0xc8,0x7d,0xaa,0x71,0xdd,0x86,0x65,0x3f,0xc7,0x29,0x04,0x3d,0x30,0x14,0xd9,0x76,0x02,0x8d,0x34,0x4e,0x30,0x92,0xfd,0xc8,0xbf,0xc8,0x66,0xef,0x87,0x57,0x62,0x05,0x20,0x8d,
- 0x04,0x20,0xc8,0x44,0x8d,0x0b,0x4f,0x52,0xa9,0xf3,0xd8,0xde,0xe1,0x15,0xcc,0xf0,0x41,0xc3,0x7c,0xee,0x85,0xb9,0x7e,0x71,0x14,0x42,0xc9,0x12,0xb2,0x69,0x6f,0x97,0x65,0x3d,0x20,0x8d,
- 0x04,0x20,0xc8,0x58,0x74,0x3a,0x30,0x5a,0xc6,0x45,0x99,0xa8,0xc1,0xec,0xe3,0x4a,0xcf,0xac,0x56,0x21,0xa6,0x17,0xb8,0x8a,0xcf,0x56,0x8b,0x23,0x62,0xfb,0x20,0x03,0xad,0x77,0x20,0x8d,
- 0x04,0x20,0xc8,0x5a,0xea,0xd3,0xde,0x42,0x84,0x40,0x38,0x79,0x8a,0x9f,0x6b,0x5b,0x95,0x73,0xfc,0x8b,0x56,0x64,0x08,0x49,0x96,0xb4,0xce,0xd3,0x26,0x95,0x21,0x56,0x53,0x61,0x20,0x8d,
- 0x04,0x20,0xc8,0x6c,0x18,0x5f,0x13,0x41,0xd5,0x5a,0x3c,0x5d,0xc9,0xc9,0x97,0x1f,0xee,0x40,0x4a,0x1f,0x85,0xcf,0x28,0xad,0xec,0x72,0x01,0x39,0xf4,0xaa,0x19,0xb2,0xb7,0xb3,0x20,0x8d,
- 0x04,0x20,0xc8,0x6c,0xf3,0x53,0x99,0xd2,0xcb,0x49,0xbb,0xbe,0xf5,0x7c,0x3a,0x67,0x50,0xb7,0x54,0xac,0x55,0xd1,0xdf,0xe2,0xf4,0x1d,0x5a,0xe7,0x02,0x54,0xe6,0x08,0xa3,0x8e,0x20,0x8d,
- 0x04,0x20,0xc8,0xb4,0x2e,0xf9,0x5f,0x38,0x87,0x4b,0xf6,0xd1,0x5b,0xd1,0x78,0xdf,0xcb,0x2d,0x27,0x85,0x94,0x0c,0x8f,0xbf,0xe9,0xd3,0x4d,0x8f,0x73,0xaa,0x97,0xa6,0xb3,0xb1,0x20,0x8d,
- 0x04,0x20,0xc8,0xb8,0xbe,0x75,0x37,0xdc,0xee,0xb0,0x1b,0xe7,0x1d,0x1d,0x5e,0x4a,0x9d,0x52,0xfd,0xbd,0xcb,0x0a,0x05,0xbe,0x6a,0x21,0xc4,0x49,0xba,0xf8,0x6a,0x18,0xa1,0x24,0x20,0x8d,
- 0x04,0x20,0xc8,0x85,0xcb,0x48,0x04,0x6b,0x46,0xac,0xc0,0x6f,0xe5,0xe4,0x5c,0xb7,0xc8,0x5c,0x86,0x7b,0x65,0xf0,0x44,0xad,0x46,0x0c,0x5a,0xd0,0xeb,0xd2,0x24,0x89,0x20,0xb6,0x20,0x8d,
+ 0x04,0x20,0xc8,0x53,0xb1,0x05,0x7e,0x9f,0xdc,0x9d,0x17,0xcd,0x24,0x17,0xf0,0x9d,0xf0,0x5b,0x10,0xc7,0xf9,0x05,0xeb,0xc3,0x96,0x0b,0x29,0x47,0xd7,0xba,0x67,0x07,0x7a,0x44,0x20,0x8d,
0x04,0x20,0xc8,0x87,0x5f,0xe7,0x75,0x24,0xe2,0xf2,0x3b,0xf2,0x75,0x30,0x82,0x7e,0x9b,0xae,0x31,0xeb,0x73,0x62,0xa0,0x29,0x30,0x38,0xcb,0x19,0xe5,0xc6,0xe8,0xa8,0x9e,0x27,0x20,0x8d,
- 0x04,0x20,0xc8,0x89,0x94,0x14,0x1f,0x63,0x0d,0x5e,0x55,0xd4,0x5f,0x12,0x5e,0x58,0x30,0x64,0x75,0xc1,0xa4,0xd1,0x92,0xad,0x2c,0xaa,0x6a,0x9f,0x4e,0x83,0xe2,0xc1,0x5a,0xe6,0x20,0x8d,
- 0x04,0x20,0xc8,0x90,0x5d,0x79,0x1c,0xc6,0x5f,0xdd,0xab,0x74,0x20,0xe5,0x6c,0x46,0x0a,0x1b,0x24,0xc5,0x15,0x6f,0x60,0x96,0xc0,0x48,0x6e,0xf1,0xc1,0x3e,0xfd,0xf0,0x4b,0xd9,0x20,0x8d,
- 0x04,0x20,0xc8,0x9a,0xbe,0xd5,0xc9,0x17,0x41,0x42,0xe0,0x6c,0x94,0xab,0xcc,0x5c,0x8e,0x9e,0x49,0x07,0xd7,0x0e,0xbe,0x00,0x4e,0x29,0x8e,0x92,0xa7,0x8f,0xfd,0x3c,0x1d,0xf8,0x20,0x8d,
- 0x04,0x20,0xc8,0xa6,0xdb,0x57,0xab,0x6e,0xf0,0xa9,0x8b,0x10,0x90,0x4c,0x82,0x6e,0x02,0x21,0x37,0xbb,0xf3,0x81,0xec,0x28,0x74,0x8e,0x1c,0xcd,0x92,0xf8,0xaf,0xfd,0x8e,0xe4,0x20,0x8d,
- 0x04,0x20,0xc8,0xa8,0x68,0xc8,0xb8,0xb8,0x77,0x8e,0xd0,0x41,0x1b,0x46,0x82,0xd6,0x7d,0x42,0xdf,0xcf,0x83,0x5a,0xde,0xe5,0x5e,0x6a,0x38,0x2e,0x85,0x5c,0xb9,0xa2,0x89,0x9d,0x20,0x8d,
0x04,0x20,0xc8,0xad,0xeb,0xab,0x81,0x2b,0x57,0xcf,0x16,0xfb,0x62,0xa2,0xc5,0xb5,0x4d,0x0d,0x9a,0xf9,0x4a,0xf2,0x7f,0xce,0xb5,0xad,0x3b,0xe1,0x47,0x15,0x52,0x79,0x9c,0xbd,0x20,0x8d,
- 0x04,0x20,0xc8,0xb1,0x46,0x21,0xf4,0x02,0x1d,0x36,0x74,0xa7,0x29,0x58,0x74,0x4f,0x60,0x4e,0x62,0x68,0x20,0xe7,0x40,0x4f,0xfd,0xae,0xa9,0x77,0x4e,0x39,0xf0,0x08,0x9d,0x28,0x20,0x8d,
- 0x04,0x20,0xc8,0xf4,0xc3,0x22,0x44,0x9c,0xb5,0xb4,0x71,0x92,0x5d,0xd2,0xbf,0xf4,0xb1,0x74,0x13,0x83,0x4e,0x84,0xe2,0xda,0xe8,0x77,0xd0,0x56,0xdc,0x71,0xf2,0x02,0xbb,0xdc,0x20,0x8d,
- 0x04,0x20,0xc8,0xf6,0x5b,0xb7,0xed,0xb2,0xd3,0xff,0x43,0x09,0x91,0x28,0x16,0x71,0xda,0x34,0xbf,0xb4,0xd7,0x46,0xd6,0x9f,0x7f,0x4f,0x5c,0xcf,0xdf,0xd7,0x11,0xc6,0x81,0x36,0x20,0x8d,
- 0x04,0x20,0xc8,0xfe,0x88,0xe2,0x53,0x06,0xed,0x34,0x70,0x85,0x0a,0x61,0xb1,0xa3,0x49,0x2d,0x75,0xbf,0xb4,0xf6,0x74,0xe8,0xf4,0xee,0x33,0xa1,0x6b,0x50,0x57,0x84,0xed,0x19,0x20,0x8d,
- 0x04,0x20,0xc8,0xff,0x48,0x7f,0xa3,0x58,0xa4,0x48,0x77,0x9e,0x5b,0x03,0x0c,0x30,0xfb,0xf8,0x9a,0x86,0xb9,0x40,0x4d,0x94,0x8b,0xbe,0xb4,0x7a,0x16,0xb0,0xfc,0xa6,0x7c,0x0c,0x20,0x8d,
- 0x04,0x20,0xc8,0xd1,0xcf,0x03,0x34,0x4d,0xc4,0x98,0x03,0x56,0x6d,0x46,0x41,0x2c,0x7b,0x08,0xd4,0xf9,0x74,0x91,0x0b,0x86,0x2a,0xdb,0x4c,0x6f,0x35,0xc3,0x2b,0x41,0xc7,0x59,0x20,0x8d,
- 0x04,0x20,0xc8,0xd9,0xdc,0xdd,0xd3,0xb0,0xe4,0xc0,0x6d,0x35,0x42,0x76,0x96,0x2d,0x44,0xed,0x98,0x15,0xdb,0x1f,0x80,0x34,0xa4,0x28,0xa2,0x9a,0xf2,0xb9,0x92,0xf7,0xf2,0xf7,0x20,0x8d,
- 0x04,0x20,0xc8,0xdb,0xae,0x47,0x68,0x75,0x43,0x72,0xa9,0xfd,0x85,0xfa,0xd3,0x7e,0x28,0x0b,0x78,0x28,0x33,0x95,0xe9,0x23,0x2e,0x39,0x6d,0x0e,0x68,0x6c,0x3f,0x46,0x09,0xc7,0x20,0x8d,
- 0x04,0x20,0xc8,0xdd,0x51,0xb4,0x8a,0x27,0xdd,0x79,0xdc,0x6d,0x21,0x3e,0x5e,0x6e,0xa2,0xa7,0x58,0x9c,0xb8,0x1d,0x67,0x02,0x4b,0xbe,0xe6,0xab,0x9e,0x0e,0xa8,0x17,0xc4,0x45,0x20,0x8d,
- 0x04,0x20,0xc8,0xdd,0x5c,0x78,0xc2,0x4f,0x9b,0x16,0x5c,0x18,0x33,0x53,0x02,0xef,0x0c,0xe9,0xc2,0x3d,0xcb,0xe7,0xda,0x23,0x96,0xc8,0x31,0x4b,0x0c,0x3c,0x58,0x7a,0x8a,0x93,0x20,0x8d,
0x04,0x20,0xc8,0xdd,0x84,0xa9,0x75,0xef,0xfd,0x4d,0xdb,0x8f,0x05,0xf0,0x90,0xf1,0x2c,0x19,0xef,0xa4,0x0f,0xf7,0x74,0x14,0x3f,0xe5,0xbb,0x94,0x9e,0xe1,0x82,0x4c,0x60,0x32,0x20,0x8d,
- 0x04,0x20,0xc8,0xe0,0xe6,0xfe,0x9d,0x71,0x50,0xde,0x9b,0x1c,0x88,0x98,0xa4,0x5c,0x5f,0xa7,0x35,0x7c,0x3e,0xca,0x5b,0x67,0x61,0x11,0xc7,0x79,0x15,0x34,0x49,0xca,0x92,0xa2,0x20,0x8d,
- 0x04,0x20,0xc8,0xe1,0x72,0xe6,0x17,0x08,0x01,0xee,0xf1,0xb2,0x69,0x9a,0x08,0x0f,0x3b,0x49,0x64,0x52,0x6a,0x9c,0x3d,0xe5,0xcd,0x09,0xd5,0x08,0xa7,0xa1,0xba,0x9f,0xcf,0xd2,0x20,0x8d,
- 0x04,0x20,0xc8,0xe6,0x23,0xa0,0xb2,0xe9,0xa0,0xb1,0xa1,0x31,0xfd,0x72,0x23,0x42,0x00,0x2c,0xd6,0x2c,0x0c,0xe0,0x9b,0x3b,0xf7,0x58,0x76,0xcc,0x4d,0x41,0xb6,0x5d,0xab,0xc6,0x20,0x8d,
- 0x04,0x20,0xc8,0xf2,0xa1,0x45,0xae,0x14,0xe0,0x76,0xeb,0xc7,0x48,0x5a,0x67,0x89,0x7d,0xe3,0x59,0x57,0x64,0x2e,0x19,0x78,0x6b,0x17,0xe0,0x69,0x6e,0x98,0xd8,0xe9,0xb9,0xa9,0x20,0x8d,
- 0x04,0x20,0xc9,0x13,0xf6,0x23,0x29,0x58,0x75,0xe8,0x10,0x4f,0x7e,0x6a,0x6c,0x4a,0xc4,0x8d,0x67,0xf7,0x57,0xc5,0xe5,0xfc,0x5b,0x45,0xd3,0xfb,0x83,0x50,0x07,0x5b,0xbc,0xab,0x20,0x8d,
- 0x04,0x20,0xc9,0x13,0x80,0x4e,0xd8,0x03,0xe7,0x5a,0xd0,0x2f,0xf0,0x75,0xa1,0x3d,0xd6,0xd8,0x1b,0xcf,0x86,0x51,0xa9,0x3d,0xb5,0xfa,0x24,0x8a,0x96,0x36,0x52,0xd6,0x0e,0xfe,0x20,0x8d,
- 0x04,0x20,0xc9,0x1f,0x01,0x8e,0xdc,0xc8,0x21,0x00,0x59,0x57,0xf8,0x20,0x4c,0xbe,0x16,0xc2,0xae,0xcb,0xdc,0x87,0xd3,0x9e,0xd5,0xee,0xed,0x86,0x91,0xe7,0xa0,0x19,0x15,0x70,0x20,0x8d,
- 0x04,0x20,0xc9,0x24,0xed,0x0c,0x32,0x53,0xf6,0x2a,0x45,0xaf,0x35,0x0d,0xd6,0x27,0x15,0x3c,0xbe,0x8f,0x44,0x91,0x76,0xf2,0x18,0x3b,0xad,0xee,0xf9,0x61,0x0a,0x53,0x13,0x95,0x20,0x8d,
- 0x04,0x20,0xc9,0x2e,0xd5,0x99,0xa5,0xba,0xc7,0x8b,0xf9,0x64,0x44,0x2b,0x83,0xd1,0x0c,0x89,0x6f,0x96,0xa4,0xa9,0x72,0x9d,0xa2,0x2b,0xd1,0x1c,0xe9,0xc1,0xd6,0xca,0xae,0x66,0x20,0x8d,
- 0x04,0x20,0xc9,0x78,0x26,0x7c,0x26,0xaf,0x20,0xe5,0xac,0x49,0x12,0x7e,0xa7,0xdf,0x90,0x8c,0xe1,0x91,0x48,0x1b,0x87,0xe4,0x39,0x69,0x22,0xdb,0x2f,0x4e,0x74,0xd5,0x06,0x57,0x20,0x8d,
- 0x04,0x20,0xc9,0x78,0xae,0x10,0xa3,0x78,0xad,0x22,0xe1,0xc1,0xcf,0x39,0xc1,0x98,0x65,0x6c,0x81,0xe9,0x8c,0x23,0xf0,0x1d,0x1f,0xbf,0x52,0xf3,0x1f,0x47,0x2f,0x6b,0x00,0xe5,0x20,0x8d,
- 0x04,0x20,0xc9,0x7c,0xdb,0x2e,0x31,0x98,0xfd,0x0f,0xee,0x55,0x12,0x18,0x62,0xbf,0xbc,0x7a,0x1a,0xde,0x78,0xe1,0x14,0x51,0x06,0xc2,0x12,0x44,0xf3,0xb2,0x85,0x01,0xcb,0x14,0x20,0x8d,
- 0x04,0x20,0xc9,0x7d,0x30,0xb0,0xe2,0x3b,0x32,0xee,0x79,0x6c,0x3d,0xfd,0x5a,0x6e,0x4c,0x4a,0x77,0x8e,0x1d,0x29,0x8d,0x78,0xb6,0xd9,0xe0,0xdd,0x21,0xf0,0xd6,0x69,0x15,0x80,0x20,0x8d,
- 0x04,0x20,0xc9,0x4f,0x7e,0xb4,0x91,0x82,0x89,0x16,0x6d,0x25,0x74,0x39,0xff,0x6e,0xab,0x60,0x31,0xc7,0xa0,0xa8,0x9f,0x41,0xe0,0x79,0x33,0x12,0x6e,0xfa,0x7e,0x7c,0x30,0x16,0x20,0x8d,
- 0x04,0x20,0xc9,0x5d,0xfd,0x54,0x1b,0x8b,0x50,0xeb,0x84,0xe7,0xe2,0xa9,0x33,0xf0,0x8f,0x85,0xa1,0x0a,0x13,0xfc,0x01,0x0e,0xb7,0x36,0xa3,0x26,0xe2,0x4f,0x32,0xa7,0xcf,0x29,0x20,0x8d,
- 0x04,0x20,0xc9,0x5c,0xc4,0x02,0x5b,0xa2,0x7f,0x6f,0x48,0x08,0xdc,0xf1,0xb1,0x3a,0xe7,0x68,0x7d,0x57,0x2c,0x74,0x18,0x49,0x85,0x8c,0xd8,0x20,0xef,0x07,0x79,0x45,0x17,0xe2,0x20,0x8d,
- 0x04,0x20,0xc9,0xb5,0x89,0x2d,0x56,0x00,0x4d,0x41,0x29,0x50,0x03,0x71,0x7b,0x05,0xa2,0x8c,0xdd,0x91,0x68,0xa9,0x45,0x65,0x82,0x4a,0x22,0x1e,0xbf,0x7b,0xa9,0xd6,0x50,0x45,0x20,0x8d,
- 0x04,0x20,0xc9,0xbe,0xe0,0xdc,0xe1,0xe0,0xb8,0x9d,0x8c,0xd9,0x37,0x3f,0x92,0x94,0x24,0x98,0x97,0x5d,0x49,0xdc,0x2b,0xb1,0x49,0x8e,0xe8,0xc9,0x5a,0x41,0x9c,0x6a,0x3a,0x72,0x20,0x8d,
- 0x04,0x20,0xc9,0x81,0x40,0x85,0x9c,0x3f,0xe0,0x25,0x4f,0x8f,0x34,0xdf,0xdc,0x82,0xd1,0x11,0x7c,0x00,0x64,0x38,0xd6,0x55,0xf0,0x11,0xdd,0xbc,0xa0,0xf3,0x5a,0x42,0xd6,0x22,0x20,0x8d,
- 0x04,0x20,0xc9,0x88,0x67,0xdc,0x31,0xfe,0x77,0xc3,0x51,0xe4,0x6a,0x03,0xc9,0xd2,0xd8,0xb6,0x15,0xc6,0xac,0x95,0x77,0x46,0xa2,0x9b,0x69,0x9f,0x85,0xa4,0xdb,0x5b,0x59,0x1b,0x20,0x8d,
- 0x04,0x20,0xc9,0x93,0x19,0xbb,0x7a,0x32,0x00,0xdc,0x3f,0xc8,0xe1,0x85,0xfd,0xb5,0x68,0x5b,0x86,0x88,0x61,0xda,0x97,0x46,0xa8,0xf4,0x95,0xfe,0xf1,0x0e,0x42,0xa2,0x4d,0xd5,0x20,0x8d,
- 0x04,0x20,0xc9,0x9f,0xb2,0xec,0x6c,0xb0,0x5b,0x1f,0xeb,0xbf,0x8b,0xa9,0x75,0x18,0x63,0x42,0x63,0xbe,0x28,0x8e,0x0e,0x63,0x35,0x74,0xca,0x66,0x86,0x62,0x86,0xda,0x0e,0x16,0x20,0x8d,
- 0x04,0x20,0xc9,0xa2,0xf9,0x1c,0x63,0x22,0x12,0xc1,0xbf,0x7c,0xb9,0x71,0x6d,0x2b,0x3a,0xd2,0xc1,0xc4,0xdc,0xd6,0x11,0x39,0xa7,0xd1,0xe9,0x7e,0xc2,0xef,0x5e,0x62,0x3c,0x9d,0x20,0x8d,
- 0x04,0x20,0xc9,0xaa,0xa5,0xb5,0xb9,0xd0,0x2b,0x01,0x37,0x08,0x29,0x6d,0xf9,0xfa,0x8c,0x0e,0xd1,0x2e,0x4c,0xb3,0x3b,0x55,0x90,0x9d,0xb8,0x2c,0x7f,0xe9,0x26,0x76,0xa7,0x69,0x20,0x8d,
- 0x04,0x20,0xc9,0xac,0x25,0x94,0x28,0xd7,0x65,0xc9,0x83,0xa7,0x2a,0x2d,0x85,0x85,0xc4,0x44,0xe6,0x8f,0x72,0xf9,0x70,0x1b,0xd0,0x12,0xd4,0x82,0x18,0xfe,0xa7,0xbd,0x6e,0x09,0x20,0x8d,
- 0x04,0x20,0xc9,0xae,0x6e,0x0f,0x89,0x41,0x68,0x83,0x99,0xd9,0x80,0x57,0x19,0xed,0x49,0x54,0x4f,0xdc,0x9c,0x31,0xe5,0x30,0x8a,0xce,0x39,0x2e,0x94,0x76,0x86,0x61,0x27,0x33,0x20,0x8d,
- 0x04,0x20,0xc9,0xc0,0x1b,0xb9,0x61,0x24,0x62,0xa9,0xb4,0xc0,0xd1,0x11,0x7a,0x9c,0x9e,0xab,0x00,0xeb,0xba,0x91,0xda,0xa6,0x3f,0x24,0xc9,0x86,0xc8,0xcc,0xa8,0xd3,0x3c,0x98,0x20,0x8d,
- 0x04,0x20,0xc9,0xc0,0xf6,0xbe,0xef,0x56,0xd6,0xc8,0x96,0x4c,0x3a,0xe9,0x89,0xce,0x6e,0x19,0x1d,0x26,0x20,0x9f,0xc0,0x03,0x8b,0x03,0x60,0x05,0xd9,0x35,0x44,0x87,0xd2,0xd8,0x20,0x8d,
- 0x04,0x20,0xc9,0xc6,0x3e,0x6a,0x67,0xde,0xdf,0x5f,0x41,0xa5,0x47,0xeb,0xbb,0x6c,0xc3,0x1e,0x37,0x35,0x9a,0x9e,0x7a,0x5d,0xa0,0x9c,0xfd,0x26,0x69,0x89,0xd2,0x77,0x3a,0x2a,0x20,0x8d,
- 0x04,0x20,0xc9,0xc8,0x0f,0xbe,0xa7,0xa6,0x6d,0xc1,0x4c,0x9f,0x7a,0x87,0xfa,0x79,0x76,0x4e,0x11,0x01,0x66,0xe8,0xfd,0x8d,0x5c,0x9c,0xae,0xac,0xd2,0x3f,0xc2,0xc3,0x16,0xb8,0x20,0x8d,
- 0x04,0x20,0xc9,0xcc,0x3a,0x9d,0xa7,0xee,0x70,0xc0,0xda,0x2c,0x1e,0xa2,0x54,0xb4,0x4f,0x04,0x43,0x72,0xa3,0x11,0x04,0x0f,0xc4,0x31,0x5e,0x52,0xf7,0x35,0x2e,0x66,0x10,0x97,0x20,0x8d,
- 0x04,0x20,0xc9,0xce,0xaa,0xf6,0x9f,0x7d,0xe9,0x4d,0xfb,0x1f,0xae,0x69,0xeb,0x2c,0x29,0x78,0xf7,0x62,0xce,0xe5,0xa0,0x07,0x29,0x4f,0x68,0x2c,0xb7,0x0d,0x6c,0x98,0x1b,0x00,0x20,0x8d,
- 0x04,0x20,0xc9,0xcf,0x7b,0xaf,0x3b,0xb5,0x46,0x04,0xf2,0x42,0x19,0x26,0xe5,0x2a,0x06,0x96,0x9a,0x36,0x0e,0xb8,0x2d,0xa1,0xc8,0x5a,0x2d,0xda,0xf6,0x7a,0xe9,0x05,0x9a,0xcd,0x20,0x8d,
- 0x04,0x20,0xc9,0xe3,0x95,0x4b,0xe6,0x50,0xeb,0x82,0x17,0xd2,0xd0,0x1c,0x6b,0xde,0x96,0xfa,0x20,0x72,0x22,0xec,0x88,0xf2,0x65,0x41,0xd3,0x7d,0x57,0xd0,0xa7,0x3c,0xac,0x3b,0x20,0x8d,
- 0x04,0x20,0xc9,0xec,0xc9,0x04,0x1f,0x87,0xaa,0xde,0x60,0xa8,0xf6,0xdf,0xc9,0x8b,0x63,0x70,0x64,0x08,0xc9,0xdc,0xde,0xb5,0x86,0xaf,0xae,0x29,0x8c,0x90,0xe1,0x0e,0xc9,0x0b,0x20,0x8d,
- 0x04,0x20,0xc9,0xf2,0xfa,0x30,0x3c,0x44,0xcc,0x3b,0xe3,0xbb,0x11,0xe0,0xeb,0x4e,0x9c,0xdc,0x69,0xad,0x80,0xdb,0x2e,0xff,0x1f,0xff,0x03,0x4c,0xb7,0x3e,0xbb,0xe1,0x73,0x94,0x20,0x8d,
- 0x04,0x20,0xca,0x3f,0xf1,0x5c,0x16,0x9a,0x9b,0x05,0x25,0x0e,0x1f,0x22,0x72,0xfc,0xd2,0xa1,0x8e,0x1a,0xd7,0x59,0xf1,0x3e,0xc3,0x75,0x40,0xbf,0x3d,0xda,0x0b,0x95,0x99,0xb8,0x20,0x8d,
0x04,0x20,0xca,0x14,0x4e,0xcb,0xf7,0x98,0x8c,0xff,0x16,0x21,0x49,0xb2,0x93,0x8b,0x3e,0x34,0xaa,0x3d,0xbc,0xc7,0x52,0xf4,0x94,0x37,0x72,0x18,0x25,0x12,0x2b,0x75,0xc7,0xd7,0x20,0x8d,
- 0x04,0x20,0xca,0x1f,0xbf,0xe2,0x44,0x2b,0x04,0x16,0xe2,0x15,0x9f,0x12,0x80,0x1b,0xc3,0x4e,0xcf,0xce,0xa0,0x9f,0x3f,0x7c,0x76,0x5b,0xea,0x99,0xc8,0xe9,0xaa,0x80,0x32,0x1e,0x20,0x8d,
- 0x04,0x20,0xca,0x1f,0x93,0x0e,0x3a,0x67,0x8c,0xc4,0x96,0x82,0xa3,0xff,0x77,0x92,0x33,0x75,0x67,0xfe,0x78,0xbd,0xf9,0xe2,0x60,0xfd,0x69,0xf3,0x39,0x1b,0x91,0xa8,0x23,0x3d,0x20,0x8d,
- 0x04,0x20,0xca,0x21,0x44,0x57,0xa3,0xd9,0xc6,0x89,0x87,0x51,0xd4,0x19,0x3f,0x9d,0xbf,0x53,0x5d,0x21,0x89,0xca,0xb9,0x36,0xa3,0xa7,0x6a,0x33,0x75,0xdd,0xaf,0xc2,0xc3,0x57,0x20,0x8d,
- 0x04,0x20,0xca,0x30,0xff,0x6a,0x9c,0xb9,0x65,0x45,0xa5,0xbd,0x01,0x38,0xdf,0xa4,0x80,0xfd,0x8a,0x3f,0x54,0xb4,0x9a,0x89,0x3d,0x13,0xfb,0x0e,0x62,0x77,0xca,0x6e,0xcc,0xbb,0x20,0x8d,
- 0x04,0x20,0xca,0x7b,0xd5,0x1d,0x86,0x91,0x0e,0xcd,0x70,0x85,0x3f,0x1a,0xcc,0x13,0xee,0x03,0xb7,0x4d,0xaf,0x93,0x4d,0x15,0xd2,0x0c,0xc7,0x26,0x36,0xc9,0xe9,0x0f,0x79,0x65,0x20,0x8d,
- 0x04,0x20,0xca,0x7e,0x92,0xfd,0xdc,0x0e,0xe1,0x99,0x8d,0xd1,0x4e,0xa5,0x37,0x26,0xbc,0xa4,0xbe,0xbc,0xc2,0x5b,0xf9,0x43,0x40,0xc1,0xf0,0x86,0xad,0x4e,0x0e,0xe8,0xd8,0xae,0x20,0x8d,
- 0x04,0x20,0xca,0x46,0x5d,0x7e,0xdb,0xac,0xf9,0x17,0xe0,0x3e,0xa4,0x81,0xb8,0xf7,0x08,0xe7,0x7b,0x2a,0xe0,0x07,0x07,0x21,0x39,0x16,0xd5,0xc4,0x58,0x5d,0x9d,0x99,0xe9,0xc4,0x20,0x8d,
- 0x04,0x20,0xca,0x4c,0xdb,0xa0,0xfc,0xec,0x73,0xb5,0x01,0x66,0xbd,0x4f,0x82,0x07,0x00,0xa8,0x9a,0xe3,0xb1,0xc0,0xd8,0x44,0xd5,0xf4,0x56,0x53,0x21,0xd7,0xb0,0x38,0xc3,0xc1,0x20,0x8d,
- 0x04,0x20,0xca,0x6f,0xd8,0xb0,0x0a,0x1e,0x5d,0x16,0x06,0xd9,0x5e,0xbf,0x6e,0x5c,0x54,0x11,0x0f,0x64,0x02,0x7b,0x1b,0x5a,0x27,0x40,0x68,0xb1,0x24,0x16,0x07,0xe3,0x37,0x0a,0x20,0x8d,
0x04,0x20,0xca,0x71,0xf1,0xf6,0x7e,0x8d,0xd6,0x91,0x7b,0x8f,0xac,0xc1,0xb3,0xc1,0x1e,0xc5,0xf2,0x59,0x35,0x17,0x98,0x64,0xb0,0x14,0x0c,0x75,0xd0,0x8b,0x79,0xf3,0x13,0x2b,0x20,0x8d,
- 0x04,0x20,0xca,0xb6,0x23,0x22,0x57,0x7e,0xe9,0x72,0x56,0x97,0x60,0x72,0x16,0x43,0x07,0xaa,0x8e,0x4c,0xc9,0xe4,0xc0,0xdd,0xa0,0xb0,0xf4,0xfe,0x83,0xe6,0x5b,0x4a,0x5f,0xab,0x20,0x8d,
- 0x04,0x20,0xca,0x85,0xa5,0xa0,0x7a,0xe7,0x81,0xd4,0xc7,0x43,0x7d,0xe7,0x56,0x4e,0x9a,0x99,0x51,0x69,0xf4,0x61,0x8e,0x37,0x7c,0x06,0x9a,0xd0,0x7d,0xaa,0x9a,0x82,0x77,0x41,0x20,0x8d,
0x04,0x20,0xca,0x91,0x20,0xaf,0x6f,0xaf,0xc7,0x2c,0xee,0x59,0x18,0x2d,0x34,0x72,0x3f,0x61,0xe2,0x79,0x4a,0x17,0x2e,0xe8,0xe7,0xa3,0x75,0x8a,0x03,0xd1,0xbe,0x7e,0xa6,0xa9,0x20,0x8d,
- 0x04,0x20,0xca,0x92,0xda,0x50,0x8d,0x41,0xb2,0x79,0x78,0x7d,0xc7,0xb4,0x91,0x4f,0x93,0x44,0x41,0xe2,0xe5,0x09,0x85,0xf4,0xad,0xe3,0x32,0x1c,0xb1,0x45,0xd2,0x7e,0xc5,0x9f,0x20,0x8d,
- 0x04,0x20,0xca,0x92,0xe2,0x57,0xbb,0xb7,0x09,0xde,0x7f,0x2e,0x9e,0xfa,0xe6,0xbd,0x88,0x4f,0x0a,0x8a,0x04,0x9c,0x03,0x98,0xdc,0x4a,0x73,0x84,0xeb,0xdf,0xfb,0x23,0x8f,0xec,0x20,0x8d,
- 0x04,0x20,0xca,0x97,0xa2,0xc9,0x08,0x95,0x36,0x2c,0x1c,0xf2,0xa0,0x3f,0x05,0xc7,0xa0,0x29,0xf1,0x56,0x14,0xfc,0x83,0x00,0xf3,0x50,0x28,0x76,0x0e,0xe2,0x3e,0x03,0x0f,0x3c,0x20,0x8d,
- 0x04,0x20,0xca,0x97,0xfb,0xee,0x9f,0xdf,0xbb,0x94,0xf9,0xcf,0x41,0xbb,0xb1,0xde,0x73,0xc7,0xc5,0x3b,0x69,0x09,0x40,0xec,0x0e,0x2c,0x23,0x09,0xc5,0x5d,0xd9,0x4b,0x1e,0xb4,0x20,0x8d,
- 0x04,0x20,0xca,0x9b,0x07,0x51,0x5e,0xcf,0xcd,0xf3,0xf7,0x1f,0x8b,0x30,0x28,0x07,0xd2,0x36,0x70,0xac,0x2c,0x21,0x2b,0xea,0x5e,0x90,0xac,0xca,0x03,0x6b,0x6f,0xff,0x43,0x10,0x20,0x8d,
- 0x04,0x20,0xca,0xa1,0xc2,0x98,0x42,0xe0,0x6e,0xa9,0x06,0x48,0xff,0x1e,0x9b,0x24,0xa1,0xc7,0x66,0x3b,0x37,0x5e,0xc1,0xd2,0xd6,0x12,0xd8,0xd4,0x31,0xe0,0x6d,0x7d,0x7f,0x82,0x20,0x8d,
- 0x04,0x20,0xca,0xa3,0xef,0x5d,0x51,0xa9,0x04,0x6a,0x79,0x2a,0xc0,0x1b,0xe6,0xde,0xb3,0x21,0x70,0xd2,0xe9,0x8f,0x92,0xe5,0xd1,0x4a,0xa5,0xf2,0xe7,0xe5,0xce,0x15,0x74,0x85,0x20,0x8d,
- 0x04,0x20,0xca,0xae,0x4d,0x15,0xac,0xe4,0xe4,0xc0,0xd3,0x81,0x19,0x89,0xf4,0x7d,0x3a,0x11,0x24,0x58,0xc3,0xae,0xcb,0x4b,0x97,0x04,0xbc,0x65,0xa6,0x44,0x84,0xe4,0x6b,0xff,0x20,0x8d,
- 0x04,0x20,0xca,0xb2,0x9e,0x75,0x8e,0xba,0x4e,0x9a,0xc7,0x30,0xb1,0x0f,0xd3,0x6d,0x18,0xa0,0x86,0x1d,0x40,0x10,0x0e,0x3f,0x51,0xcd,0x8b,0x80,0x6b,0x76,0x33,0xb4,0xde,0xfe,0x20,0x8d,
- 0x04,0x20,0xca,0xb2,0x9e,0x50,0xf5,0xab,0xc1,0x5f,0x10,0x9f,0x1a,0x54,0x54,0xea,0x84,0x67,0xa7,0x89,0x59,0x1f,0x40,0xf3,0x47,0xa9,0xd9,0x93,0xc2,0x68,0xe9,0x45,0xac,0x55,0x20,0x8d,
- 0x04,0x20,0xca,0xf5,0xf1,0x51,0x9b,0x32,0xf1,0xf6,0x94,0xf6,0x5f,0xe8,0xb6,0xb8,0x3e,0x7e,0x10,0x23,0xbe,0xe6,0x5b,0x65,0x2e,0x14,0xb0,0xae,0xe6,0x48,0xaa,0x14,0x39,0x76,0x20,0x8d,
- 0x04,0x20,0xca,0xf6,0x3b,0xf1,0xb2,0xb2,0x49,0xf5,0xf5,0xfa,0x29,0xab,0x87,0xd4,0x9d,0xb5,0x0c,0x58,0x4c,0x51,0xa6,0xa8,0x3e,0xf6,0x0e,0xff,0xe7,0x01,0xbf,0x41,0x9b,0x3c,0x20,0x8d,
- 0x04,0x20,0xca,0xf8,0x69,0xfa,0x80,0x28,0x2c,0xde,0x77,0x51,0x5c,0x03,0xcb,0x69,0x94,0x4d,0x27,0xd9,0xa4,0x4d,0x87,0x00,0x71,0xc7,0xd4,0x10,0xf0,0x4a,0x68,0xd3,0xca,0xe4,0x20,0x8d,
- 0x04,0x20,0xca,0xfb,0x57,0x42,0xa6,0xc1,0x7e,0x32,0x19,0x6f,0xb8,0x19,0x9f,0x1d,0xe6,0xe0,0x50,0x48,0x95,0xa6,0x84,0x98,0xca,0x7f,0x56,0x79,0x29,0x3f,0xcd,0xc9,0x07,0x3f,0x20,0x8d,
- 0x04,0x20,0xca,0xd0,0x09,0xf0,0xb1,0xb9,0x28,0x88,0xdf,0x6d,0x0a,0x12,0x25,0xa6,0xa6,0x8f,0x6c,0x46,0x05,0x02,0x36,0xbc,0x51,0xbc,0xc3,0x07,0x1e,0xd7,0xcb,0x8e,0x35,0x00,0x20,0x8d,
- 0x04,0x20,0xca,0xd1,0x8e,0xbb,0x94,0x81,0x9f,0x04,0xe9,0xa1,0x36,0x00,0x38,0x35,0x6e,0x63,0x53,0x36,0x0d,0x76,0x75,0xc5,0x41,0xd2,0xc2,0x28,0x2b,0x99,0x1a,0x89,0xe6,0x78,0x20,0x8d,
- 0x04,0x20,0xca,0xd5,0x68,0x62,0x6f,0xb8,0x4e,0xa3,0x72,0x8c,0xb3,0xe0,0x8c,0x37,0x3e,0x6a,0x08,0x5c,0xc1,0x21,0x45,0xb3,0x1c,0x1b,0x59,0x7d,0xac,0xca,0xb2,0xde,0x7b,0x25,0x20,0x8d,
- 0x04,0x20,0xca,0xdf,0x99,0x8a,0x04,0xc7,0x1d,0x21,0xed,0xcc,0x9b,0xe4,0xcf,0xb1,0x02,0x89,0xfc,0x98,0xde,0x90,0xc9,0x08,0x46,0x8d,0xed,0x32,0xb5,0xd4,0x60,0xa7,0x59,0x10,0x20,0x8d,
- 0x04,0x20,0xca,0xef,0xa4,0xaa,0x95,0xd2,0x29,0x92,0x95,0xdb,0xe9,0xc5,0xaf,0x72,0x2d,0xab,0x90,0xcc,0x88,0x55,0x9a,0xd6,0x91,0x85,0x94,0x9f,0x09,0x2f,0xfa,0x04,0xeb,0xdb,0x20,0x8d,
- 0x04,0x20,0xca,0xf2,0x73,0x74,0xe8,0x7e,0x3e,0xd1,0x72,0x8b,0x90,0x1f,0x13,0x45,0xdd,0xd9,0x7d,0xb6,0x25,0x3f,0x49,0x3e,0xce,0xdd,0xf3,0x32,0x95,0x24,0x04,0xd5,0x08,0xbd,0x20,0x8d,
- 0x04,0x20,0xcb,0x34,0x9d,0x2b,0x4d,0x5f,0xdf,0x43,0x68,0x0c,0x00,0xd2,0xa8,0x88,0xd2,0xeb,0x98,0x36,0xdc,0x53,0xc2,0xfe,0x1f,0x29,0x8b,0xc5,0xa4,0xf3,0x88,0xab,0xf0,0xb5,0x20,0x8d,
- 0x04,0x20,0xcb,0x0a,0xc1,0xb3,0x2b,0x96,0x31,0xf7,0x58,0x9e,0xab,0xcd,0x43,0x54,0x70,0xf7,0xb9,0x54,0x9d,0x74,0x85,0x22,0x0d,0xc9,0x49,0x5b,0x3c,0x5c,0xbc,0xd0,0x27,0xa8,0x20,0x8d,
- 0x04,0x20,0xcb,0x0a,0xc6,0x37,0xfa,0x19,0xba,0x94,0xa9,0xd5,0xc7,0x13,0x3e,0xf8,0x5e,0x0c,0xcd,0xf7,0x99,0xff,0xb3,0x08,0x7e,0xf3,0xf9,0x5d,0x41,0x5b,0x31,0x61,0x88,0x64,0x20,0x8d,
- 0x04,0x20,0xcb,0x12,0xd1,0x46,0x36,0x9d,0x11,0xcf,0xf9,0xb8,0x6f,0xa5,0x00,0xbf,0xdf,0x0d,0x4c,0x33,0xba,0x6b,0x5c,0x37,0xba,0xe6,0xd8,0x30,0x25,0x46,0x57,0xc3,0xd5,0x25,0x20,0x8d,
- 0x04,0x20,0xcb,0x19,0x31,0x8e,0x24,0xb6,0x98,0x99,0x98,0xf2,0xfe,0x52,0x8c,0x23,0x44,0x22,0xd9,0x89,0x4b,0xec,0x46,0x13,0xa0,0x5f,0x36,0x29,0x9a,0xca,0xe6,0x67,0xbf,0xde,0x20,0x8d,
- 0x04,0x20,0xcb,0x1b,0xb4,0xe2,0xbd,0x06,0xa2,0xe1,0xea,0x83,0x6c,0x49,0x83,0x23,0xd4,0x03,0x79,0x98,0x76,0x8b,0xe3,0x0e,0x4b,0x60,0xb8,0x89,0x7e,0x0d,0xd2,0x38,0xfe,0x83,0x20,0x8d,
- 0x04,0x20,0xcb,0x21,0x5a,0xe8,0x43,0xba,0x53,0xba,0x84,0x4b,0x87,0xd7,0xe8,0x94,0x6c,0x49,0x0c,0xc4,0x5e,0xca,0xbc,0x9b,0x9c,0x8f,0xd0,0x26,0x6c,0xfd,0xea,0xb7,0x54,0x74,0x20,0x8d,
- 0x04,0x20,0xcb,0x27,0xf7,0xc8,0xd3,0x6b,0x61,0x75,0x7a,0x68,0x09,0xeb,0x65,0x0c,0xb4,0x3c,0xcd,0x34,0x82,0x79,0xf0,0x5e,0xec,0x61,0x7c,0x7c,0xe9,0x5d,0xd3,0xca,0x76,0x83,0x20,0x8d,
- 0x04,0x20,0xcb,0x26,0x3f,0xe8,0x3c,0x6c,0x81,0xad,0x38,0x44,0xce,0x8e,0x14,0xca,0xf7,0x88,0xcb,0x4b,0xdf,0x06,0x39,0xb7,0x94,0xce,0x09,0x70,0x7b,0x23,0x35,0x2f,0xa4,0xa6,0x20,0x8d,
- 0x04,0x20,0xcb,0x29,0x43,0xda,0xe7,0x70,0x3c,0x7e,0xed,0x28,0x4b,0xc3,0xe6,0x0b,0x22,0xac,0xee,0x7b,0x7b,0x38,0x4e,0x18,0xce,0xec,0x76,0xcc,0x82,0xc5,0x0b,0x6a,0x55,0x7b,0x20,0x8d,
- 0x04,0x20,0xcb,0x2b,0x14,0x1a,0x80,0x99,0xe4,0x06,0xc2,0x8e,0x2d,0xd8,0xbf,0xa8,0xc2,0x18,0x39,0x35,0x20,0xec,0xec,0x14,0x41,0xfc,0x1e,0x6c,0xc3,0x05,0x7e,0x2c,0xcf,0xe0,0x20,0x8d,
- 0x04,0x20,0xcb,0x2b,0x14,0x4d,0x64,0xb8,0xd8,0x60,0x4c,0xb0,0x4a,0xc9,0x75,0xfe,0xd2,0xbe,0xd6,0xc2,0xff,0x1b,0x85,0xc9,0xa5,0x40,0x84,0x89,0x83,0xf6,0xcd,0x45,0xa7,0x1a,0x20,0x8d,
- 0x04,0x20,0xcb,0x30,0x0a,0xd3,0x19,0xff,0xf8,0x2d,0x15,0xdb,0x20,0x7b,0xdc,0x39,0x48,0xab,0xe3,0xf8,0x16,0xe3,0x7a,0x71,0xa9,0xf6,0xcf,0x26,0x0d,0x46,0x9e,0x8b,0x12,0xbf,0x20,0x8d,
- 0x04,0x20,0xcb,0x32,0x9b,0xf3,0x58,0xba,0xde,0x47,0x8c,0xd8,0x06,0xf9,0x1a,0xd8,0x3b,0xb0,0xb4,0xf2,0x18,0xd3,0xa4,0x50,0x41,0xb1,0xbc,0x91,0x52,0xb9,0x9b,0x1e,0x32,0x67,0x20,0x8d,
- 0x04,0x20,0xcb,0x76,0x64,0xa9,0xf0,0x50,0x12,0x0a,0xff,0xca,0x01,0x19,0xa2,0x49,0xf0,0x9e,0x83,0x6f,0x18,0xc5,0xab,0x1b,0xca,0x6c,0xcc,0x53,0x9a,0x39,0x7d,0xf0,0x1f,0x4e,0x20,0x8d,
- 0x04,0x20,0xcb,0x76,0xc4,0xea,0x66,0x35,0x9e,0x1c,0xe5,0x55,0x9c,0x9d,0x55,0x44,0x23,0x91,0xc3,0x2a,0x80,0x5f,0x6f,0xbf,0xe3,0x85,0x1f,0xf4,0x7f,0xa1,0x93,0x41,0xe1,0x94,0x20,0x8d,
- 0x04,0x20,0xcb,0x7a,0xfa,0x44,0xf7,0xdc,0x5a,0x85,0x29,0x52,0xec,0xef,0xc9,0x09,0xa9,0x59,0xc9,0x6b,0x2d,0x7b,0xa6,0x45,0x2e,0x3c,0xc3,0x26,0xe0,0x48,0x02,0xce,0x2e,0xd2,0x20,0x8d,
- 0x04,0x20,0xcb,0x40,0x82,0x1e,0xbb,0x84,0x66,0xb7,0x5c,0x68,0xec,0x54,0x19,0x70,0x90,0x7b,0x29,0x52,0x03,0x34,0x2c,0xdc,0x1d,0xca,0x19,0xb6,0xe6,0x0e,0xbf,0x00,0x55,0x2c,0x20,0x8d,
- 0x04,0x20,0xcb,0x43,0x5e,0x0a,0x8f,0x57,0xe3,0x11,0xab,0x91,0x82,0x3d,0x76,0x88,0x2e,0xa1,0xe4,0x2b,0xb6,0x03,0x58,0x6f,0x35,0xcd,0xff,0xef,0xb8,0x89,0x16,0xbd,0xac,0xc3,0x20,0x8d,
- 0x04,0x20,0xcb,0x45,0xcb,0x9e,0xd8,0xb2,0x60,0x44,0xb9,0x0e,0x03,0xf7,0x29,0x5e,0xb3,0x90,0xd0,0xb9,0x0b,0xc8,0xeb,0xbb,0x2d,0x45,0xaf,0xd1,0x04,0xcb,0xc0,0x9e,0xb9,0x34,0x20,0x8d,
- 0x04,0x20,0xcb,0x48,0x0e,0xb9,0x7f,0x81,0x9a,0x84,0x66,0xbb,0x71,0xb4,0x62,0x88,0x37,0xb6,0xac,0x8e,0x40,0xea,0xf8,0xca,0xa1,0xae,0x7f,0x08,0x6e,0xfc,0x74,0x05,0x5a,0xd3,0x20,0x8d,
- 0x04,0x20,0xcb,0x4d,0x73,0x28,0x66,0x54,0x1e,0x5c,0x11,0xe0,0xe8,0xab,0x75,0x82,0xf5,0x5e,0x17,0x4c,0x8e,0x38,0x3e,0x59,0x54,0x02,0x3c,0x72,0x72,0x01,0xd2,0xf6,0xdf,0xce,0x20,0x8d,
- 0x04,0x20,0xcb,0x51,0xf5,0x21,0xc0,0x11,0xa5,0x8e,0x9c,0x10,0x41,0x66,0xd2,0x5e,0x3f,0xe4,0xab,0xf8,0xe6,0xa6,0xc7,0x5d,0xe5,0xb3,0x3e,0x1e,0x35,0xea,0xd6,0xc6,0xea,0xca,0x20,0x8d,
- 0x04,0x20,0xcb,0x57,0x56,0x31,0x3c,0x1d,0x5e,0x9a,0x73,0xca,0x08,0x7c,0xc7,0x07,0x8a,0xa1,0x70,0x5e,0x83,0x90,0x45,0x71,0x83,0x31,0x29,0xdf,0x95,0x86,0x04,0x00,0xe3,0x72,0x20,0x8d,
- 0x04,0x20,0xcb,0x58,0x60,0xa3,0xd0,0x5d,0xad,0x61,0xad,0x19,0x4d,0xe4,0x2f,0x12,0x89,0x69,0x6c,0x6c,0x4e,0x85,0xa7,0x8d,0x47,0x7b,0xe1,0xef,0x01,0x5e,0x63,0xc8,0x6d,0x8d,0x20,0x8d,
- 0x04,0x20,0xcb,0x59,0x67,0x03,0x23,0x50,0x8a,0x57,0xc4,0x08,0x5f,0x8f,0xc7,0xf1,0xcf,0xc7,0xd1,0xcc,0xc1,0xcc,0x3b,0xc7,0x72,0x75,0x7d,0x68,0xbc,0x44,0xc0,0x06,0xac,0xf8,0x20,0x8d,
- 0x04,0x20,0xcb,0x67,0xa4,0x87,0xcd,0x45,0x52,0x65,0xf3,0xf2,0xd1,0x86,0x23,0x00,0x5b,0x61,0x23,0x04,0x96,0x1d,0x3e,0x9b,0xeb,0xf9,0x81,0x49,0x0d,0x7f,0x16,0x8c,0x9a,0xf4,0x20,0x8d,
- 0x04,0x20,0xcb,0x6a,0xa8,0x53,0x7f,0xf2,0x08,0xda,0x7b,0x57,0xe9,0xdf,0x19,0x4d,0xbb,0xf2,0x4b,0x0b,0xba,0x4f,0x13,0x4a,0x77,0x8b,0x6a,0x87,0x61,0x4b,0x08,0x7e,0xe6,0xfc,0x20,0x8d,
- 0x04,0x20,0xcb,0x6c,0x45,0x48,0xe3,0xe3,0xa5,0xd0,0x69,0xba,0xd6,0xaf,0x15,0xac,0xc9,0xa6,0x2b,0x2b,0x7c,0xf2,0x0e,0xb1,0xe0,0xc7,0xef,0x55,0x92,0x09,0xe2,0xca,0xea,0xc9,0x20,0x8d,
- 0x04,0x20,0xcb,0x6e,0xab,0xe0,0x7d,0xf7,0x24,0x52,0xcc,0xc9,0x90,0xa4,0xc4,0x6c,0x1f,0xda,0x64,0x0c,0xde,0xc7,0x93,0x48,0x8b,0xec,0x26,0x9b,0xb9,0x2a,0x61,0x37,0xdf,0x7d,0x20,0x8d,
- 0x04,0x20,0xcb,0xb8,0x51,0x66,0xdc,0x1c,0x4c,0x20,0xca,0x8c,0x99,0x98,0x83,0x25,0x48,0x93,0xb8,0xc4,0x67,0x7c,0x5c,0xc1,0x40,0x24,0x00,0xb4,0x19,0x07,0x03,0xce,0xbb,0x33,0x20,0x8d,
- 0x04,0x20,0xcb,0xba,0x90,0x4a,0xb9,0xec,0x1d,0xf7,0xa8,0xd1,0x33,0x79,0x1e,0x76,0x76,0x1a,0x05,0xcc,0x81,0x44,0xf6,0x5e,0x92,0x91,0x89,0xf5,0xf4,0x87,0x5c,0x56,0xac,0xbf,0x20,0x8d,
- 0x04,0x20,0xcb,0x82,0x9d,0x7c,0x24,0x63,0xf1,0x79,0x20,0xc3,0xa8,0x2c,0x2f,0x95,0xc8,0xae,0x31,0x42,0x2b,0xfb,0x39,0x18,0x47,0xff,0x25,0xd4,0xc0,0x97,0x17,0xbc,0xdf,0x76,0x20,0x8d,
- 0x04,0x20,0xcb,0x86,0x92,0xb0,0x86,0x89,0x2a,0xc4,0x85,0xef,0x86,0xa7,0xcf,0x21,0x74,0x8d,0x08,0x50,0x98,0xfb,0x0f,0x3d,0x30,0xc5,0x7a,0x97,0x60,0xa7,0xc6,0xa1,0x24,0xd5,0x20,0x8d,
- 0x04,0x20,0xcb,0x8b,0x22,0x2e,0x6f,0x7e,0xb6,0xdd,0x5c,0x3e,0x2c,0x98,0x53,0x2a,0xc6,0x81,0x8d,0x63,0xc4,0x8b,0xbb,0x27,0xfc,0xc3,0xf3,0x70,0x33,0x80,0x98,0x87,0x0c,0xbe,0x20,0x8d,
- 0x04,0x20,0xcb,0x8f,0x70,0x65,0x4e,0x60,0xa3,0xd3,0x1a,0x0b,0x4e,0x88,0x3a,0x6b,0x79,0x97,0xae,0x80,0x63,0xf6,0x2c,0xa3,0x7a,0x12,0x71,0x6e,0x95,0xa9,0x74,0xd6,0x3d,0x8e,0x20,0x8d,
- 0x04,0x20,0xcb,0x94,0xc3,0x62,0x5b,0x34,0x8d,0x2e,0xb9,0x15,0x48,0xa0,0xfd,0xdd,0x0a,0x46,0xba,0x82,0x5c,0x99,0xc6,0xf6,0x45,0x66,0x91,0x04,0xc7,0x9d,0xa7,0xb4,0x6c,0x1f,0x20,0x8d,
- 0x04,0x20,0xcb,0xa4,0x9a,0x89,0x67,0x86,0x6c,0xa5,0xb1,0x7c,0xd9,0xeb,0x21,0xb2,0x8f,0x32,0xc0,0x94,0xf5,0x65,0x18,0x7a,0x7e,0x96,0x26,0xc3,0x3e,0x79,0x41,0xda,0xec,0x6d,0x20,0x8d,
- 0x04,0x20,0xcb,0xa4,0xaf,0x16,0xfa,0x06,0xd9,0x75,0x14,0x04,0x06,0x32,0x84,0x51,0x19,0x86,0xf1,0xb4,0xec,0x19,0xcb,0xf9,0x85,0xdb,0x07,0xff,0xad,0x0d,0x4a,0x13,0x01,0x1b,0x20,0x8d,
- 0x04,0x20,0xcb,0xaa,0xcf,0x59,0x40,0x9c,0xf2,0xcb,0x8b,0xfd,0xe8,0x8d,0x08,0x0f,0x92,0xbd,0x0c,0xdd,0xa4,0x17,0xb7,0x38,0x8c,0xad,0x9c,0xc1,0x5e,0xe9,0xea,0x82,0x29,0x20,0x20,0x8d,
- 0x04,0x20,0xcb,0xac,0x2f,0xc5,0x4b,0x38,0xfd,0x73,0xa4,0x9f,0xd7,0x2e,0xe6,0x28,0xb3,0xb2,0x19,0x44,0x1c,0x02,0xb0,0x9b,0x75,0x4f,0xf5,0x38,0x52,0xfa,0xbd,0x43,0x01,0xea,0x20,0x8d,
- 0x04,0x20,0xcb,0xf7,0x57,0xa9,0xe2,0x28,0xef,0xd5,0xde,0xad,0xa1,0x16,0xb8,0x00,0xbd,0x80,0xea,0x7a,0x71,0x74,0x2f,0x33,0x02,0xdf,0xb7,0x4b,0xb4,0x33,0x13,0xe2,0x84,0xae,0x20,0x8d,
- 0x04,0x20,0xcb,0xcc,0xe0,0xbd,0x5a,0x4e,0xa5,0x40,0x50,0xf4,0xc9,0x58,0x7e,0x21,0x19,0xde,0x35,0x93,0xa7,0x77,0xa8,0x76,0x6d,0x4f,0x80,0xff,0xfb,0x3f,0xea,0x53,0x9e,0xd8,0x20,0x8d,
- 0x04,0x20,0xcb,0xcd,0x80,0xb4,0x20,0xb9,0x6b,0x94,0x92,0x92,0xfc,0x1a,0x0e,0x77,0x22,0x3d,0xc6,0xa2,0x29,0x2f,0x57,0x6c,0x40,0x8d,0x44,0x84,0xee,0x5b,0x08,0xcb,0x33,0x8c,0x20,0x8d,
- 0x04,0x20,0xcb,0xce,0x90,0xb1,0x7b,0x2c,0x26,0x12,0x67,0xdb,0x0a,0x6a,0x3e,0x4b,0xbd,0xd6,0x05,0xab,0x90,0x28,0x98,0x06,0xa7,0xdb,0x49,0x73,0x75,0x05,0x04,0x0f,0x0a,0x17,0x20,0x8d,
- 0x04,0x20,0xcb,0xda,0xe7,0x6e,0x0e,0x88,0xeb,0xcb,0xa7,0xa7,0x4e,0x1a,0xa9,0x4a,0x9e,0xb1,0x04,0x7a,0xd1,0xfe,0x9b,0xbe,0xf0,0x32,0x26,0x0a,0x38,0xb4,0xb0,0xb4,0x32,0x71,0x20,0x8d,
- 0x04,0x20,0xcb,0xde,0xc3,0xa7,0xfe,0x07,0x87,0x84,0x88,0xfd,0x84,0xe8,0x17,0x4a,0xe2,0xc5,0x67,0x64,0xb4,0x3e,0xcb,0x47,0x22,0xe2,0xd7,0x12,0x3e,0x3c,0x6e,0xa2,0xf2,0xc2,0x20,0x8d,
- 0x04,0x20,0xcb,0xe1,0xa6,0xe4,0x4d,0x58,0x24,0xcc,0x6e,0x2c,0xb4,0xd8,0x0c,0x04,0x15,0xf4,0xff,0x72,0xc6,0xae,0x8c,0x20,0x3b,0x36,0x6d,0x09,0x83,0x78,0x51,0x38,0xc6,0xc6,0x20,0x8d,
- 0x04,0x20,0xcb,0xe1,0x57,0x6b,0xa1,0xbd,0x38,0xdd,0x53,0x6c,0x3e,0x9e,0x3c,0x82,0xff,0xb3,0x1f,0x24,0x4c,0x7b,0x84,0xa5,0x93,0x5b,0x58,0x26,0xd8,0xf2,0x8d,0xe9,0x09,0xbb,0x20,0x8d,
+ 0x04,0x20,0xca,0xc5,0x01,0xc3,0x21,0x34,0x38,0x33,0x82,0x4f,0x2f,0x87,0xe2,0x1d,0x47,0xca,0x6f,0xda,0xd8,0x7f,0xd2,0x1d,0x27,0xde,0xe1,0x1b,0x82,0x90,0x5d,0x1c,0x23,0xbc,0x20,0x8d,
+ 0x04,0x20,0xcb,0x01,0x28,0xb6,0x1d,0x34,0x2d,0x53,0x7f,0x15,0xf6,0xa7,0x2f,0x3f,0x16,0x6f,0x5e,0x84,0xb5,0xc7,0x31,0x60,0x17,0x79,0x38,0x9a,0x28,0x85,0x40,0x74,0x2b,0xfd,0x20,0x8d,
+ 0x04,0x20,0xcb,0x8c,0x8c,0x77,0x81,0x24,0x66,0x1c,0x1c,0x52,0xed,0x70,0x4f,0xdd,0x32,0x7d,0x2d,0x5c,0x18,0xce,0x61,0x0e,0x2f,0x37,0x53,0x0a,0xad,0x61,0xe7,0x0f,0xd9,0xed,0x20,0x8d,
0x04,0x20,0xcb,0xef,0xa9,0xc3,0x5f,0xc5,0x51,0x6c,0x85,0xe2,0xe3,0x70,0x92,0xc2,0x6b,0x3a,0x0c,0xe0,0x75,0x5f,0x15,0x97,0xef,0xf9,0xa5,0x9f,0xc2,0xa0,0x25,0xde,0x4c,0x35,0x20,0x8d,
- 0x04,0x20,0xcc,0x17,0x6c,0xe4,0xb9,0x1b,0x80,0x23,0x34,0xd3,0x93,0x5c,0x56,0x62,0x04,0x98,0x0d,0xe7,0x73,0x85,0xec,0x7f,0xa7,0x3d,0x3f,0xde,0xf1,0xcd,0xf0,0x3f,0x6b,0xda,0x20,0x8d,
- 0x04,0x20,0xcc,0x21,0xc3,0x68,0x88,0x50,0x8a,0x65,0xcb,0xdc,0x29,0x65,0x39,0x61,0x65,0x0c,0x22,0x59,0x4d,0x9e,0x6e,0x9d,0x3a,0xc6,0x41,0x9d,0x6a,0x97,0xc2,0xc6,0xc4,0x06,0x20,0x8d,
- 0x04,0x20,0xcc,0x22,0x9e,0x14,0xe7,0x7f,0x19,0x0e,0x90,0xfd,0xbb,0xe7,0x91,0x5d,0x39,0x78,0x09,0xbf,0x86,0x2a,0x1b,0x77,0x57,0x67,0x7a,0x84,0x9c,0x75,0xf9,0xae,0x42,0x70,0x20,0x8d,
- 0x04,0x20,0xcc,0x23,0x60,0x1f,0xc3,0x6e,0xe7,0xd2,0xd1,0x3f,0x71,0xd7,0x85,0x03,0x5f,0xce,0x5c,0xf1,0xd0,0xf7,0xc7,0x2d,0x85,0x34,0xb1,0x9c,0x1f,0x7e,0x4b,0x0a,0x20,0x89,0x20,0x8d,
- 0x04,0x20,0xcc,0x27,0x8a,0xc7,0xe7,0xd7,0xff,0x7e,0xc6,0xe8,0x6f,0xa2,0x79,0x46,0x41,0x3d,0x84,0x59,0x63,0x08,0x81,0x8c,0x77,0xab,0xc9,0x58,0x49,0x62,0x27,0x55,0xdc,0xdb,0x20,0x8d,
- 0x04,0x20,0xcc,0x2b,0xd6,0x91,0xf8,0x8d,0x89,0x95,0x61,0x9a,0x08,0x3b,0x2d,0x4a,0x4a,0x62,0x35,0x01,0x2b,0x5a,0x93,0x6d,0xa8,0xe0,0xc4,0x51,0x39,0xd0,0xdc,0xda,0x77,0x2a,0x20,0x8d,
- 0x04,0x20,0xcc,0x2a,0x16,0xc2,0xd6,0x3c,0xdd,0x4b,0xea,0x57,0x40,0x9a,0x6d,0x05,0x65,0x43,0xac,0xae,0xb2,0xb3,0xc7,0xc5,0xdb,0xb6,0x52,0xbd,0xa6,0xb9,0x27,0x20,0x59,0xcd,0x20,0x8d,
- 0x04,0x20,0xcc,0x75,0xad,0x0b,0x78,0x0d,0x21,0x76,0xf8,0x1e,0x7a,0x30,0x3a,0x95,0xd2,0xe6,0x52,0xd0,0x29,0x65,0x31,0xfc,0xa7,0x15,0x94,0x4b,0x1c,0xb7,0xa1,0xf1,0x2d,0xb9,0x20,0x8d,
- 0x04,0x20,0xcc,0x7c,0x52,0xa2,0x57,0xbb,0xb8,0x62,0x2d,0x8a,0x76,0x03,0xf4,0x64,0xac,0xf9,0x0e,0x98,0x86,0x01,0x6e,0x68,0x6a,0x5b,0x7c,0x9b,0xb7,0xc0,0xc0,0xf7,0x21,0x21,0x20,0x8d,
- 0x04,0x20,0xcc,0x7f,0x28,0x09,0x68,0x65,0x79,0xe4,0x8d,0xac,0x61,0x01,0x98,0x44,0xe5,0x59,0xd1,0x05,0x1c,0xf1,0xcf,0x51,0xb2,0x0f,0xf8,0xae,0x28,0x4f,0x6e,0x56,0x56,0xe0,0x20,0x8d,
- 0x04,0x20,0xcc,0x62,0x58,0xf6,0x51,0xed,0xa2,0x61,0xcf,0xd1,0x6f,0x38,0x2b,0xb5,0xd3,0x5d,0x6c,0x4f,0x89,0x7e,0xfc,0x4d,0x29,0x5b,0xa3,0xb4,0x81,0x7e,0x68,0x95,0x72,0x86,0x20,0x8d,
- 0x04,0x20,0xcc,0x62,0x73,0x4b,0xba,0x2c,0xd7,0x85,0xc8,0xf4,0xb3,0xfa,0x4d,0x50,0x92,0x34,0x1b,0x61,0x4f,0xe7,0xf0,0xa0,0x7c,0xb8,0xa3,0x1d,0x2c,0xe4,0x72,0x59,0xdc,0x8e,0x20,0x8d,
- 0x04,0x20,0xcc,0x67,0xb8,0x9b,0x8f,0x05,0xd8,0xed,0x72,0x82,0x1f,0x7c,0x42,0x1d,0x7f,0x03,0xd0,0xd1,0x9c,0x34,0x0c,0x36,0x44,0xee,0x1d,0x69,0xe3,0xe4,0x7f,0x49,0xae,0x89,0x20,0x8d,
- 0x04,0x20,0xcc,0x6b,0x24,0xa6,0x21,0xda,0xcd,0x56,0x10,0xb3,0xce,0xaa,0x54,0xd4,0x1c,0x7a,0xfd,0xb3,0xcd,0x95,0xec,0x31,0x54,0x43,0xf9,0x3b,0x4a,0xc5,0xab,0x9a,0x25,0x63,0x20,0x8d,
- 0x04,0x20,0xcc,0x71,0xa8,0xc1,0x62,0x81,0x7a,0xfe,0x93,0x9e,0xb0,0xbc,0xd6,0x4c,0x41,0x9f,0x6a,0x3e,0x75,0x85,0xe1,0xf0,0x5e,0x36,0xeb,0x83,0x8c,0x25,0x39,0xa8,0xa1,0x46,0x20,0x8d,
- 0x04,0x20,0xcc,0xb9,0xf0,0xfb,0xcf,0x5a,0x5f,0x9e,0x00,0xee,0x63,0xc0,0xd1,0x22,0xbf,0xdd,0xe7,0x99,0xb5,0xb9,0x55,0xf9,0x64,0xa9,0x73,0xf1,0xcf,0xc1,0xc6,0x46,0x27,0x19,0x20,0x8d,
- 0x04,0x20,0xcc,0x80,0xbb,0x52,0x64,0x29,0xfc,0xcf,0x5f,0xd8,0xb8,0x84,0x13,0xd1,0x79,0x8e,0x74,0x16,0x3b,0xe3,0xcd,0x34,0x63,0x53,0x87,0xbb,0xfb,0x9a,0xee,0xf7,0xd2,0x7d,0x20,0x8d,
- 0x04,0x20,0xcc,0x83,0x92,0x92,0x24,0xcb,0x1b,0x8b,0x9d,0xea,0x9d,0xe6,0x21,0x37,0x57,0xbd,0x0c,0x66,0x0f,0x23,0x6c,0x72,0x0f,0xbe,0x09,0x5b,0x6c,0x97,0x44,0xd7,0xef,0xf1,0x20,0x8d,
- 0x04,0x20,0xcc,0x8d,0x37,0x63,0x1a,0x95,0x48,0x73,0x94,0x20,0xdf,0x3a,0x3b,0xec,0x60,0xcb,0xff,0x32,0x8d,0x0e,0xf3,0xb7,0xcc,0xdd,0x62,0x36,0x17,0x0f,0x3d,0x1e,0xf9,0x93,0x20,0x8d,
- 0x04,0x20,0xcc,0x91,0xde,0xdf,0x4d,0xaa,0x45,0xc7,0x42,0x2f,0xce,0x5c,0xf5,0x34,0x94,0x50,0x7a,0x5a,0x0d,0xac,0xe1,0x3c,0x38,0x81,0xdc,0xbf,0xf6,0xb2,0xf3,0x32,0x39,0xc5,0x20,0x8d,
- 0x04,0x20,0xcc,0x90,0xfb,0x49,0x2f,0x67,0x0b,0xb7,0xfa,0x84,0x16,0x4f,0xf5,0xc0,0x88,0xec,0x5f,0xb1,0x52,0x4b,0xf4,0xf8,0x3f,0x35,0xb3,0x6d,0xaf,0x0f,0xe8,0xee,0x8a,0x3a,0x20,0x8d,
- 0x04,0x20,0xcc,0x91,0x20,0x0e,0x20,0xfa,0x57,0x77,0xf5,0xa7,0x20,0xb5,0x59,0x26,0xd2,0x7d,0x6a,0xd5,0x79,0x24,0x62,0x6e,0xaf,0xe5,0xbf,0x04,0x70,0xf5,0xf8,0x4c,0xf0,0xf1,0x20,0x8d,
- 0x04,0x20,0xcc,0xa3,0xcd,0xde,0x09,0xf3,0x65,0x18,0x1f,0xd0,0x35,0xcc,0x70,0x0c,0x53,0x5c,0xed,0x89,0xb4,0x16,0xe6,0x58,0xba,0xdf,0xc4,0xbc,0x30,0x19,0xea,0x03,0x9f,0xf4,0x20,0x8d,
- 0x04,0x20,0xcc,0xae,0x62,0x15,0xea,0x71,0x52,0x2d,0xb6,0x68,0xe4,0x29,0x25,0x6d,0xe3,0x80,0x8a,0x86,0xa9,0x69,0x02,0x57,0x61,0x07,0x42,0x21,0x35,0x31,0xd2,0xeb,0x9d,0xc2,0x20,0x8d,
- 0x04,0x20,0xcc,0xb3,0x42,0xc6,0x59,0x7d,0x88,0x07,0x62,0x54,0x0b,0xc6,0xd8,0x3c,0x11,0x66,0x1d,0x34,0xb4,0x95,0xf3,0x4e,0x71,0x34,0x89,0x3a,0x52,0x59,0xd3,0xb2,0x0f,0x7a,0x20,0x8d,
- 0x04,0x20,0xcc,0xfc,0x65,0x39,0xfb,0x6f,0x80,0x63,0x46,0xf4,0x13,0x41,0x07,0xf3,0x11,0x49,0x29,0xe3,0xce,0xd5,0xa6,0x34,0xdc,0x37,0x75,0x00,0xd2,0x98,0xb8,0x76,0xb9,0x4e,0x20,0x8d,
- 0x04,0x20,0xcc,0xfc,0x7a,0xe7,0x0e,0x02,0xf2,0xce,0x03,0xbf,0xf0,0xe2,0xdf,0xe0,0xb5,0x19,0x26,0x3a,0xe6,0xd6,0x75,0x2a,0x5c,0xf3,0x7d,0xb6,0x62,0x5e,0xbc,0x4d,0xbc,0x2e,0x20,0x8d,
- 0x04,0x20,0xcc,0xfd,0x5f,0x92,0x07,0xfd,0x6a,0xbb,0x63,0xaa,0x4e,0x42,0x32,0x99,0x56,0xdc,0xb0,0x9d,0xb5,0xa7,0x12,0xb0,0x63,0xaf,0x26,0x65,0xac,0x51,0x0a,0xf5,0xc1,0x69,0x20,0x8d,
0x04,0x20,0xcc,0xc4,0xc5,0xc6,0x53,0x1a,0x9f,0xf1,0x38,0xe4,0x23,0x96,0xfb,0x27,0xfd,0x33,0xf6,0x86,0x64,0xc8,0xb6,0xbd,0x76,0xb9,0x14,0x14,0x29,0x63,0xde,0xe2,0x71,0x40,0x20,0x8d,
- 0x04,0x20,0xcc,0xce,0xc2,0x63,0x94,0x23,0xa9,0x32,0xfe,0x1b,0xf3,0x6c,0x6a,0x26,0xf4,0xf9,0xe1,0xff,0x4b,0xa8,0x28,0x66,0x06,0xd7,0x24,0xe3,0x2f,0x0d,0x4b,0x57,0x86,0x84,0x20,0x8d,
- 0x04,0x20,0xcc,0xd9,0x69,0x61,0xdb,0xee,0x54,0xe3,0x3c,0xb3,0xa2,0x59,0xa7,0x7d,0xc8,0x59,0xe8,0x24,0xdc,0x9b,0xb7,0x82,0x90,0x1a,0x40,0x45,0xa6,0x1d,0x06,0x9e,0xd5,0x4c,0x20,0x8d,
- 0x04,0x20,0xcc,0xdd,0x4e,0x62,0x75,0x35,0x5e,0x20,0x29,0x20,0x49,0x34,0x2f,0x2f,0xa9,0xee,0xe3,0x71,0x5c,0x92,0xfc,0x0e,0xa2,0x46,0x59,0x47,0x0e,0x02,0x96,0xe5,0x7a,0x76,0x20,0x8d,
- 0x04,0x20,0xcc,0xed,0x1c,0x29,0x67,0x13,0x4a,0xe2,0x09,0x5c,0x83,0x67,0x3d,0x01,0x13,0x72,0x16,0x89,0xe8,0x4c,0x64,0x74,0x62,0x62,0x0e,0xf0,0x92,0x2e,0x36,0xd1,0xfa,0x56,0x20,0x8d,
- 0x04,0x20,0xcd,0x36,0x45,0x1f,0x75,0x9c,0x12,0x56,0xde,0x09,0x82,0xd8,0xd8,0x6d,0x21,0x82,0xcd,0xac,0xd1,0x9c,0x21,0xcc,0x88,0xe7,0xa2,0x31,0xac,0x4d,0x4c,0xe9,0x61,0x95,0x20,0x8d,
- 0x04,0x20,0xcd,0x37,0x83,0xfd,0x95,0x85,0xb7,0xcd,0x13,0xf0,0x9f,0x40,0xcb,0x4e,0xc4,0xd0,0x66,0x9a,0x05,0x1e,0x9f,0xfa,0xaf,0xd8,0xc2,0x7c,0xb0,0xe4,0x0a,0x4d,0x79,0x82,0x20,0x8d,
- 0x04,0x20,0xcd,0x3f,0xe2,0x08,0x20,0x3e,0x05,0xe7,0x15,0x28,0x45,0x26,0xd0,0x79,0x98,0xbb,0x0a,0x31,0x4a,0x87,0x14,0x4f,0x33,0x3d,0x05,0x0d,0xb7,0x52,0xbb,0xed,0x48,0xf8,0x20,0x8d,
- 0x04,0x20,0xcd,0x00,0xe9,0xd2,0x75,0xd3,0x4c,0x12,0xf5,0xd3,0xea,0xab,0x9f,0xf6,0x84,0x38,0x4f,0xd2,0x69,0x3f,0xd7,0x8a,0x65,0x9e,0x16,0xfb,0x98,0xad,0x87,0xf7,0x68,0x01,0x20,0x8d,
- 0x04,0x20,0xcd,0x02,0xc4,0x66,0x6c,0x69,0x71,0xaa,0xc1,0xd6,0x83,0x1f,0x8c,0x86,0x13,0x2e,0x81,0xcd,0xa4,0xc0,0xcc,0x89,0x7f,0x65,0x77,0x72,0x8e,0x56,0x37,0x2c,0x46,0xe2,0x20,0x8d,
- 0x04,0x20,0xcd,0x05,0xf9,0x38,0x37,0xf4,0xe6,0x9f,0xae,0x56,0x56,0xf5,0x10,0x12,0xe0,0x91,0x43,0x71,0x75,0x43,0xf0,0x36,0xbf,0x4c,0x7b,0xec,0xa3,0x0c,0xa9,0x3b,0x23,0x25,0x20,0x8d,
- 0x04,0x20,0xcd,0x1a,0xc6,0xc7,0xe2,0xcc,0x6f,0x52,0xa4,0xd7,0x9d,0x55,0x65,0x7b,0x28,0x9a,0x3a,0xa9,0x2a,0xfc,0x2a,0x36,0x9e,0x0f,0x20,0x39,0xc6,0xb4,0x96,0x50,0x9e,0x7f,0x20,0x8d,
- 0x04,0x20,0xcd,0x1c,0xc5,0xed,0x9b,0x48,0xd4,0xe3,0xf4,0x23,0x8d,0x8a,0x41,0x34,0x96,0xe9,0x78,0xc8,0xac,0x56,0x3b,0x0e,0xa6,0xf3,0xbe,0x84,0x81,0xfd,0x09,0xfa,0xff,0x1e,0x20,0x8d,
- 0x04,0x20,0xcd,0x27,0x81,0xfd,0xf9,0x56,0x08,0x91,0x4e,0x28,0xc4,0x74,0xb8,0x2e,0x24,0xbe,0xc1,0x15,0x51,0xad,0x9c,0x86,0x97,0x6d,0x46,0xb6,0xa0,0x9e,0xd3,0x65,0x4f,0x69,0x20,0x8d,
- 0x04,0x20,0xcd,0x32,0x35,0xfd,0xad,0x49,0xf1,0xe4,0x37,0x10,0xb4,0x85,0xd4,0x7c,0xa0,0x26,0x9b,0x12,0x19,0x9f,0xb3,0x71,0x19,0xb9,0x60,0xb9,0xd1,0xe7,0x22,0x85,0xc0,0xbe,0x20,0x8d,
- 0x04,0x20,0xcd,0x74,0xda,0x48,0x97,0x08,0xa2,0xd1,0x06,0x93,0x58,0x9f,0x12,0x56,0xc7,0xa8,0x67,0x05,0xe2,0x28,0xdc,0xa6,0x9b,0x30,0xcb,0xd6,0xef,0xf2,0x8e,0x0a,0x60,0x09,0x20,0x8d,
- 0x04,0x20,0xcd,0x7d,0xb3,0x91,0xc0,0xfa,0x65,0x3b,0x1e,0x1b,0xb1,0xb4,0xd4,0x05,0x0f,0xdf,0x83,0x6e,0x20,0x43,0xfa,0x5e,0x71,0x0b,0x1b,0x5a,0x36,0xda,0x4f,0xe6,0x7e,0x8c,0x20,0x8d,
- 0x04,0x20,0xcd,0x42,0x7c,0x0a,0x83,0x79,0x97,0x11,0xa3,0x72,0x57,0xf0,0x8b,0x93,0xdc,0x22,0x9b,0x81,0xdb,0x39,0x44,0x85,0xc6,0xfa,0xec,0xbd,0x8e,0x1f,0xdf,0x18,0xc9,0x2a,0x20,0x8d,
- 0x04,0x20,0xcd,0x4d,0x49,0xdb,0x54,0xfc,0xe9,0xc1,0xdf,0xf3,0xd7,0x56,0x43,0x1c,0x6f,0xf2,0x7a,0xde,0x72,0x9c,0xf7,0x18,0xc7,0x61,0xe0,0x2d,0xa5,0x30,0x61,0xfe,0x31,0x80,0x20,0x8d,
- 0x04,0x20,0xcd,0x52,0xde,0xa6,0x42,0x6f,0xd2,0xd1,0x42,0x52,0xe7,0x28,0x7e,0xec,0xd5,0x47,0x83,0xc2,0x60,0x49,0x83,0xf9,0xa9,0xf9,0xf5,0xe7,0x83,0x28,0xfc,0xc8,0x69,0x3a,0x20,0x8d,
- 0x04,0x20,0xcd,0x59,0x72,0xe3,0xb9,0xfb,0x6e,0x45,0x34,0xcb,0xab,0xc2,0x7f,0xc6,0xa4,0x73,0xde,0xac,0x56,0xb9,0xab,0x5f,0x6b,0xb9,0xba,0x51,0x94,0x47,0x80,0xad,0x87,0x10,0x20,0x8d,
- 0x04,0x20,0xcd,0x5e,0x26,0x7c,0x84,0x61,0x6a,0xb5,0x2c,0xd0,0x43,0xb6,0x53,0x64,0x56,0x06,0xab,0x45,0x1b,0x6d,0xf8,0x80,0xea,0xf5,0x13,0x42,0xb7,0xe5,0x0e,0x80,0xf3,0x2a,0x20,0x8d,
- 0x04,0x20,0xcd,0x72,0x88,0x95,0x5b,0x3f,0x0e,0xae,0xe9,0x3c,0xa6,0xbb,0xcc,0x69,0xaf,0xf5,0x49,0xab,0xce,0x63,0xd3,0x68,0x64,0x08,0x52,0x85,0xb4,0xb4,0x22,0xdf,0x04,0x18,0x20,0x8d,
- 0x04,0x20,0xcd,0xb8,0xe5,0x99,0xf7,0xa2,0x53,0xe4,0x60,0x6a,0x61,0xe9,0x70,0xdf,0x7f,0x0f,0x75,0x2c,0x2f,0xa1,0x67,0x88,0xc0,0xe0,0x81,0x24,0xb1,0x22,0x3f,0x48,0x33,0x5f,0x20,0x8d,
- 0x04,0x20,0xcd,0x82,0xd7,0x54,0xcf,0x77,0x21,0x74,0x0f,0x0b,0xa0,0x5e,0x38,0x9e,0xec,0xdf,0x27,0xad,0xa2,0xc0,0x6a,0x01,0x62,0xc8,0xe8,0x84,0x50,0xb9,0xce,0xd0,0x4b,0x5a,0x20,0x8d,
- 0x04,0x20,0xcd,0x83,0x03,0x1f,0xab,0x27,0xf6,0x0a,0x44,0xac,0x0d,0x8b,0xd4,0x55,0x21,0xfe,0x04,0x46,0x59,0xa9,0x44,0x34,0x96,0xc3,0x92,0x86,0x7c,0x47,0xaf,0xf1,0x1c,0xc7,0x20,0x8d,
- 0x04,0x20,0xcd,0x88,0x8c,0x73,0x8d,0x34,0x54,0x5c,0x9d,0xa0,0x74,0x1d,0x5d,0x95,0xcf,0xb4,0x07,0xba,0x1e,0xd2,0x23,0x79,0x5f,0x48,0x78,0x2e,0xf0,0xd6,0x1d,0x6f,0xa2,0xe9,0x20,0x8d,
- 0x04,0x20,0xcd,0x8d,0xa1,0x56,0xaa,0x66,0xff,0x4d,0x1d,0x02,0xb0,0x52,0x09,0x43,0x23,0x80,0xce,0x20,0xae,0xd5,0x9e,0x65,0x45,0xb3,0x3c,0x53,0xc2,0x40,0x97,0xff,0x49,0xc8,0x20,0x8d,
- 0x04,0x20,0xcd,0xa2,0xfd,0x28,0x3a,0x13,0xaa,0x18,0xc7,0x77,0x1e,0x74,0xfb,0xc7,0xc6,0x37,0x9a,0x36,0x9d,0xe2,0x31,0x6a,0x95,0x26,0x3c,0xd9,0x28,0x36,0xaf,0xa0,0x95,0xae,0x20,0x8d,
- 0x04,0x20,0xcd,0xa4,0x07,0x96,0x32,0xbe,0x64,0xe6,0x49,0xd3,0xc7,0xbb,0xa4,0xa0,0xb6,0x42,0x3b,0xe9,0x4f,0xc5,0x37,0xc3,0x2d,0x0a,0x31,0xf0,0x5d,0x52,0x1f,0xae,0xf3,0x5e,0x20,0x8d,
- 0x04,0x20,0xcd,0xa6,0x95,0x5f,0xa1,0x5e,0x65,0xc4,0x78,0x9f,0x3d,0x8a,0x42,0x28,0x56,0xa1,0x46,0xbd,0x2c,0x20,0xe2,0x7d,0xdd,0x73,0x73,0xaa,0x80,0x91,0x92,0x3d,0x43,0x86,0x20,0x8d,
- 0x04,0x20,0xcd,0xa9,0xb2,0x3f,0x79,0x82,0x91,0xed,0x07,0xeb,0x1a,0x43,0x2b,0xab,0x83,0x67,0x22,0xb7,0xbd,0x57,0x7e,0x73,0x02,0xda,0x45,0xaa,0x9c,0x83,0xdd,0x73,0x66,0xf1,0x20,0x8d,
- 0x04,0x20,0xcd,0xac,0xf0,0x95,0xf8,0x64,0xb2,0x26,0x2a,0xcb,0x2b,0xb3,0x95,0xeb,0xcc,0xf7,0xa3,0xe6,0xfe,0xf9,0x33,0x6d,0xe0,0xcb,0x8d,0x2e,0xdf,0x87,0xc0,0xfb,0xf6,0x01,0x20,0x8d,
- 0x04,0x20,0xcd,0xf7,0xf2,0xdb,0xa1,0xe1,0x01,0x39,0xec,0x64,0x50,0x08,0x5a,0x37,0x6b,0x6f,0xbe,0x03,0x3e,0x7f,0x74,0x1c,0x12,0x00,0x55,0xc4,0x38,0xa2,0x52,0x21,0x4e,0xbc,0x20,0x8d,
- 0x04,0x20,0xcd,0xc1,0x44,0x8d,0xf2,0xe8,0x89,0xeb,0x55,0x5e,0xc2,0x82,0x58,0x53,0x06,0x98,0x56,0x8e,0x10,0x55,0x7b,0x94,0x9f,0xbb,0x05,0xba,0x60,0x84,0x39,0xad,0xdd,0x36,0x20,0x8d,
- 0x04,0x20,0xcd,0xc3,0x0d,0xab,0xe7,0xb4,0xac,0xed,0x17,0x7f,0xe0,0x0f,0x26,0x2c,0xca,0x78,0xd3,0xf4,0xd3,0xef,0xc6,0x0d,0x48,0xaa,0xb9,0x80,0x1c,0x7d,0xf6,0xac,0xba,0xc8,0x20,0x8d,
- 0x04,0x20,0xcd,0xc5,0xa0,0xe6,0x90,0x1a,0x90,0xf7,0xde,0x67,0xb8,0x4d,0xf6,0xfc,0x9b,0x5e,0x5a,0x11,0x36,0xff,0xce,0x11,0x35,0x9e,0xd5,0x4d,0x24,0x1b,0x47,0xb5,0xde,0x9d,0x20,0x8d,
- 0x04,0x20,0xcd,0xc4,0xdc,0xad,0xda,0x22,0x0c,0x54,0x1b,0xde,0xad,0xf1,0x7e,0x6f,0x2d,0x67,0xbc,0x0e,0xa3,0x88,0x25,0x10,0xe9,0x60,0x46,0x18,0xcd,0x91,0x94,0xbc,0xa9,0xdb,0x20,0x8d,
- 0x04,0x20,0xcd,0xd5,0xc0,0xc2,0x24,0x19,0x37,0x36,0xac,0x3f,0xc3,0x12,0xb9,0x3b,0x14,0x78,0xb7,0xf8,0xea,0xb0,0x27,0xb9,0xf7,0x4e,0x3b,0x68,0xb3,0x06,0x18,0xa4,0x76,0x11,0x20,0x8d,
- 0x04,0x20,0xcd,0xe0,0x37,0xd3,0x86,0x65,0x5b,0xda,0xe7,0x4a,0x1a,0xc7,0xe1,0x6a,0x56,0x80,0xf2,0xa6,0xd8,0xfa,0x16,0x6d,0x2b,0x77,0xb5,0xbe,0xf5,0xb7,0x46,0xb3,0x57,0x81,0x20,0x8d,
- 0x04,0x20,0xcd,0xe0,0x4f,0x10,0xb0,0xe3,0x87,0x91,0xe9,0x95,0xc1,0x0c,0xb8,0x4d,0xda,0x11,0x4c,0x60,0x19,0xc8,0x11,0x85,0x55,0xd4,0x40,0xe3,0x2f,0x81,0x1b,0x9f,0x49,0x11,0x20,0x8d,
- 0x04,0x20,0xcd,0xf2,0x5c,0xef,0x3c,0x68,0x43,0xfa,0x6d,0x05,0x15,0x74,0xfe,0xdc,0x8d,0xcb,0xc2,0xdc,0xd2,0x84,0xc9,0x16,0x10,0xa4,0x45,0x8b,0x28,0xfb,0xce,0x18,0x71,0xff,0x20,0x8d,
- 0x04,0x20,0xcd,0xf3,0x03,0x96,0xc8,0xd9,0x86,0x72,0x52,0xec,0xc8,0x0c,0xfe,0x02,0xdc,0x02,0xa5,0xe1,0x21,0x1a,0x5a,0xd6,0x90,0x3c,0x55,0x81,0xe7,0x08,0xdd,0x6a,0x95,0xc6,0x20,0x8d,
- 0x04,0x20,0xce,0x38,0x92,0x48,0xed,0x7d,0xf6,0x8d,0xd9,0x22,0x84,0x43,0xaf,0xc0,0x44,0x07,0x20,0x49,0xbc,0x99,0xf7,0x6c,0xf7,0x08,0x13,0xec,0xa0,0xd1,0x67,0x5c,0xb9,0x1d,0x20,0x8d,
- 0x04,0x20,0xce,0x04,0x23,0x57,0x2e,0x51,0x1e,0xe6,0x93,0x7e,0xa2,0xe9,0xfe,0x2f,0xbc,0x00,0xf8,0x39,0xc2,0xbf,0x06,0x82,0x9c,0x8a,0xae,0x7a,0x7d,0x13,0x76,0xe7,0x08,0xbe,0x20,0x8d,
- 0x04,0x20,0xce,0x07,0x94,0x38,0xe0,0x08,0x29,0x6c,0x04,0xe1,0x82,0x88,0x66,0xf0,0x7d,0x8f,0x35,0xdf,0x85,0x85,0x02,0x1b,0xbf,0x14,0x13,0x15,0xc6,0x14,0xe9,0xb6,0xee,0x5c,0x20,0x8d,
- 0x04,0x20,0xce,0x09,0x32,0xa8,0x0d,0xba,0x04,0x57,0xfa,0x73,0xec,0xc8,0x65,0x5d,0x6a,0x76,0x7b,0x15,0xe9,0x1b,0xcc,0x85,0xe3,0xe3,0x10,0x46,0x40,0x7c,0x58,0x2a,0x99,0x32,0x20,0x8d,
- 0x04,0x20,0xce,0x12,0x57,0x51,0x1b,0x3c,0x5f,0x2b,0x6c,0xae,0xe3,0xad,0x78,0xe6,0x62,0x59,0x4b,0x03,0xc7,0x5e,0xb0,0xc8,0x34,0x66,0xb9,0xed,0xea,0xb3,0x52,0x26,0x45,0xd1,0x20,0x8d,
- 0x04,0x20,0xce,0x15,0x4e,0x05,0x5e,0x78,0xd0,0x55,0x83,0x5e,0x3e,0x18,0xf4,0x1b,0x13,0x5d,0xa5,0x7e,0x1e,0x60,0x48,0x9b,0xcd,0x9c,0xee,0x08,0xc3,0x1a,0xf2,0x65,0x72,0x6b,0x20,0x8d,
- 0x04,0x20,0xce,0x17,0xc5,0x14,0x89,0x96,0xe7,0xca,0x90,0xb2,0xad,0x21,0x18,0x39,0xe1,0x75,0xe2,0xcc,0xce,0x94,0x6f,0xb4,0x94,0x09,0x5c,0xa1,0xf7,0x67,0xd3,0x8c,0xb7,0xc6,0x20,0x8d,
- 0x04,0x20,0xce,0x1e,0x75,0x35,0x71,0xe3,0x8d,0x15,0x35,0x3d,0x9f,0xb9,0x0c,0x03,0x5c,0xf2,0x86,0x00,0x48,0xc8,0x8b,0x78,0x82,0x44,0x55,0x24,0x8c,0x68,0x3d,0x79,0xcd,0xe4,0x20,0x8d,
- 0x04,0x20,0xce,0x22,0xe1,0xd1,0x91,0x35,0x4c,0xf4,0x34,0xf8,0x30,0x51,0xd6,0x39,0x6f,0x09,0xd7,0xe6,0x8c,0xb2,0xda,0xed,0x39,0xf7,0xaf,0xa3,0x07,0xeb,0x63,0xaa,0xfb,0x43,0x20,0x8d,
- 0x04,0x20,0xce,0x2a,0x6a,0x31,0x5d,0x78,0x80,0xd3,0xf3,0x2a,0xde,0x7f,0xa3,0x2c,0x85,0xb9,0x82,0x3e,0x0d,0xf8,0x3c,0x83,0x9a,0xc1,0x72,0x7e,0x8d,0x27,0x82,0xdb,0xfa,0xe2,0x20,0x8d,
- 0x04,0x20,0xce,0x30,0x42,0xaf,0xb4,0x6b,0x6d,0xf5,0xb6,0x29,0x59,0x8b,0x8a,0xb7,0x13,0xb7,0x11,0x8e,0x37,0x82,0xc7,0x42,0x19,0x69,0xb4,0x1a,0x4f,0xfb,0x3f,0xef,0x95,0x48,0x20,0x8d,
- 0x04,0x20,0xce,0x5a,0xd3,0x42,0xc2,0x7f,0x8d,0xde,0xd9,0x49,0x37,0x75,0x1c,0x91,0xc6,0x56,0xca,0x21,0xbd,0xcf,0xc2,0xf7,0x97,0xc4,0xfa,0x2e,0x75,0xef,0x37,0x0a,0xaf,0x25,0x20,0x8d,
- 0x04,0x20,0xce,0x5b,0x31,0x95,0xe2,0x0e,0xe4,0xf2,0xf5,0xe1,0xd9,0xb4,0x61,0x66,0xda,0x6a,0x58,0x7b,0x59,0x52,0x35,0xe7,0xb9,0xd8,0x39,0x49,0xc2,0x04,0x49,0x07,0x37,0xcf,0x20,0x8d,
- 0x04,0x20,0xce,0x64,0x8f,0x86,0x34,0x2d,0xb0,0xb0,0xf7,0x56,0xd8,0x44,0x18,0x55,0xfd,0x4d,0xfd,0x58,0xa0,0x27,0xf1,0x88,0x88,0x17,0x1d,0x49,0xee,0xf4,0x1e,0x09,0x48,0x1d,0x20,0x8d,
- 0x04,0x20,0xce,0x66,0x7c,0xfb,0x9c,0x38,0xd3,0x76,0xec,0x7d,0xe5,0xe2,0x52,0x7e,0x4d,0x6d,0x30,0x79,0x5f,0x42,0x35,0x31,0xc5,0x40,0x3e,0x1b,0xc5,0xda,0x7c,0x14,0x6f,0x56,0x20,0x8d,
- 0x04,0x20,0xce,0x68,0x87,0xa5,0xc6,0x11,0x6b,0x2f,0xd3,0x05,0x39,0x4c,0x49,0x10,0xee,0x6f,0xaa,0x82,0x18,0xc0,0xdc,0x85,0xe1,0x7b,0x5e,0xeb,0x75,0xbe,0xbe,0x0c,0x55,0xb1,0x20,0x8d,
- 0x04,0x20,0xce,0x68,0xbd,0x5e,0xb8,0x3c,0x2a,0x04,0xb4,0x7e,0xc9,0x65,0xa1,0xe5,0x69,0x73,0xdf,0x7e,0xae,0x4f,0xd5,0xe7,0xc8,0x00,0x7f,0xd7,0x7c,0xa7,0xde,0x35,0xdd,0xb3,0x20,0x8d,
- 0x04,0x20,0xce,0x6f,0xc8,0xeb,0x11,0x55,0xe8,0xbd,0x28,0xda,0x72,0x5c,0x44,0x26,0xc2,0x26,0xe4,0xa5,0xaf,0x96,0x0a,0x94,0x9b,0x76,0xef,0x8c,0xa6,0xdd,0x3b,0x57,0xb7,0x9b,0x20,0x8d,
- 0x04,0x20,0xce,0x70,0xfd,0x6a,0xfe,0x8e,0x33,0x84,0x37,0x9b,0x7a,0xe6,0xaa,0x3f,0xc9,0x52,0x3b,0x86,0x85,0xc7,0xf0,0xac,0xfa,0x0a,0x42,0xbf,0x41,0xb6,0x0f,0x53,0x73,0xa0,0x20,0x8d,
- 0x04,0x20,0xce,0x73,0x9c,0xe7,0x39,0xe8,0x65,0xa8,0x35,0xc8,0x4d,0xd6,0x7b,0x8f,0x68,0x0d,0xd0,0xf0,0x24,0x92,0x33,0xe3,0x05,0xc6,0xf3,0x79,0x43,0x83,0x5b,0x99,0x10,0x0b,0x20,0x8d,
- 0x06,0x10,0xfc,0x32,0x17,0xea,0xe4,0x15,0xc3,0xbf,0x98,0x08,0x14,0x9d,0xb5,0xa2,0xc9,0xaa,0x20,0x8d,
- 0x06,0x10,0xfc,0xc7,0xbe,0x49,0xcc,0xd1,0xdc,0x91,0x31,0x25,0xf0,0xda,0x45,0x7d,0x08,0xce,0x20,0x8d,
- 0x06,0x10,0xfc,0xdc,0x73,0xae,0xb1,0xa9,0x1b,0xf8,0xd4,0xc2,0x08,0x11,0xa4,0xc7,0xc3,0x4e,0x20,0x8d,
+ 0x04,0x20,0xcd,0xfb,0x39,0x81,0x98,0xab,0xb9,0x5c,0xee,0xfe,0xf7,0x89,0x00,0x13,0x3b,0xd7,0xc3,0x4c,0x7e,0x7a,0x65,0xd7,0xe9,0x95,0x15,0x08,0xb9,0xe1,0x0c,0xf1,0x9a,0xa3,0x20,0x8d,
};
static const uint8_t chainparams_seed_test[] = {
- 0x05,0x20,0xd6,0x21,0xcb,0x8a,0xd9,0xa8,0x74,0xa9,0xe0,0x48,0xea,0xde,0xc0,0xea,0x1b,0x6a,0xfd,0x08,0x62,0xc1,0xfb,0x62,0x5f,0x15,0x42,0x99,0xce,0x0f,0xaf,0x73,0x59,0x35,0x00,0x00,
- 0x05,0x20,0xe1,0xbb,0x4a,0x85,0x55,0x47,0x4b,0x5c,0x0d,0x13,0x22,0xab,0x90,0x25,0x63,0x9e,0x4d,0x48,0xba,0x30,0x4d,0x1f,0x4b,0x4d,0x98,0x64,0x52,0xb7,0x43,0xc2,0x4b,0x3b,0x00,0x00,
- 0x05,0x20,0x2e,0xed,0xf9,0x38,0x8f,0x96,0x3e,0x98,0x58,0xbf,0x1a,0xdd,0xc8,0xbb,0x50,0x56,0x00,0xf3,0x69,0x71,0x0e,0x86,0xa5,0x56,0xc5,0xb5,0x30,0xc3,0x02,0x15,0x5a,0x60,0x00,0x00,
- 0x05,0x20,0x6c,0x7e,0xd7,0x65,0x61,0xef,0x2f,0x5d,0xbb,0x26,0xe2,0xa5,0x51,0x47,0x6e,0x2e,0x4b,0x62,0x92,0x83,0xd3,0x7f,0x74,0x27,0x16,0xac,0xf5,0xa4,0x5f,0x20,0x5f,0xe0,0x00,0x00,
- 0x05,0x20,0x77,0x93,0xb0,0xef,0x61,0xae,0xbd,0x59,0x9d,0xd0,0xca,0x71,0xb3,0xfc,0x1b,0x84,0xa9,0x00,0xcc,0x24,0xdd,0x16,0x04,0xb1,0x39,0x92,0xf9,0xba,0x82,0x18,0x41,0x31,0x00,0x00,
- 0x05,0x20,0x70,0xa0,0x87,0x84,0x37,0xbf,0x1e,0x07,0x3c,0xca,0x50,0x5a,0x9d,0x6f,0x88,0x27,0xdc,0xfc,0xc6,0x62,0x07,0x4d,0x34,0x5a,0x3e,0x70,0xc1,0xb3,0xef,0x51,0xc9,0xa4,0x00,0x00,
- 0x05,0x20,0x8e,0xb2,0x37,0xa8,0x52,0x59,0x7e,0x4e,0x4f,0x45,0x61,0x97,0x4e,0x76,0xe7,0x2d,0xbb,0x93,0x51,0xf3,0x38,0xcf,0xd7,0x88,0x96,0x1b,0xbc,0x90,0x26,0x8c,0xa9,0x06,0x00,0x00,
- 0x05,0x20,0xb9,0x85,0x34,0xf2,0x44,0x76,0xdc,0x59,0x4d,0x18,0x63,0xb0,0x4a,0x66,0x1f,0xe0,0x6a,0x31,0xc4,0x31,0xf2,0x66,0x80,0x78,0x91,0x70,0xd6,0x5e,0xd4,0x1b,0x16,0x7a,0x00,0x00,
- 0x05,0x20,0xc7,0x49,0xe0,0x43,0x3c,0x4a,0x92,0x97,0x11,0x0f,0x75,0xed,0x48,0xe4,0x5a,0x4c,0x4b,0x5f,0x21,0x75,0x28,0x47,0x06,0x26,0x0a,0xef,0xf8,0xc0,0x04,0x1d,0xa0,0x22,0x00,0x00,
- 0x05,0x20,0xc1,0x36,0x04,0xd7,0x53,0x33,0xe1,0xf4,0xd6,0xb9,0xcb,0x7b,0x6b,0x86,0x6c,0x1e,0xe7,0x72,0x57,0x60,0xbc,0x86,0xb0,0x74,0x2a,0x7b,0x82,0x44,0x58,0x42,0xc2,0x53,0x00,0x00,
+ 0x06,0x10,0xfc,0xcb,0x02,0x48,0x11,0xa6,0x10,0x42,0x0b,0xca,0x12,0x18,0xf7,0xce,0x7d,0x3d,0x47,0x9d,
+ 0x01,0x04,0x02,0x57,0x48,0xeb,0x47,0x9d,
+ 0x01,0x04,0x03,0xfd,0xa3,0x0e,0x47,0x9d,
+ 0x01,0x04,0x05,0xb6,0x04,0x6a,0x47,0x9d,
+ 0x01,0x04,0x05,0xbc,0x77,0xc4,0x47,0x9d,
+ 0x01,0x04,0x05,0xbd,0xaf,0x5c,0x47,0x9d,
+ 0x01,0x04,0x05,0xfc,0x15,0xe8,0x47,0x9d,
+ 0x01,0x04,0x05,0xff,0x61,0x5b,0x47,0x9d,
+ 0x01,0x04,0x05,0xff,0x63,0x82,0x47,0x9d,
+ 0x01,0x04,0x08,0xde,0xe4,0xd9,0x47,0x9d,
+ 0x01,0x04,0x12,0x8f,0x6c,0xd5,0x47,0x9d,
+ 0x01,0x04,0x17,0x5d,0x59,0xc7,0x47,0x9d,
+ 0x01,0x04,0x17,0x5e,0x60,0x86,0x47,0x9d,
+ 0x01,0x04,0x17,0x89,0x39,0x64,0x47,0x9d,
+ 0x01,0x04,0x1f,0xdc,0x63,0x41,0x47,0x9d,
+ 0x01,0x04,0x23,0xc0,0xbf,0xe5,0x47,0x9d,
+ 0x01,0x04,0x23,0xc8,0xc9,0x4f,0x47,0x9d,
+ 0x01,0x04,0x23,0xe9,0x98,0xdb,0x47,0x9d,
+ 0x01,0x04,0x25,0x1b,0x3a,0x86,0x47,0x9d,
+ 0x01,0x04,0x25,0x1b,0x74,0x57,0x47,0x9d,
+ 0x01,0x04,0x28,0x76,0xe4,0xbb,0x47,0x9d,
+ 0x01,0x04,0x2b,0xf7,0xb8,0x32,0x47,0x9d,
+ 0x01,0x04,0x2d,0x4d,0x19,0x0e,0x47,0x9d,
+ 0x01,0x04,0x2d,0x81,0xb6,0x3b,0x47,0x9d,
+ 0x01,0x04,0x2f,0xfe,0x7f,0xfc,0x47,0x9d,
+ 0x01,0x04,0x33,0x4d,0x2a,0xea,0x47,0x9d,
+ 0x01,0x04,0x33,0x4f,0x52,0x4b,0x47,0x9d,
+ 0x01,0x04,0x33,0xfa,0x4b,0x30,0x47,0x9d,
+ 0x01,0x04,0x34,0xae,0xbb,0x11,0x47,0x9d,
+ 0x01,0x04,0x3e,0x48,0x1b,0xd4,0x47,0x9d,
+ 0x01,0x04,0x3e,0xa8,0x41,0x2a,0x47,0x9d,
+ 0x01,0x04,0x3e,0xd2,0xcf,0x3f,0x47,0x9d,
+ 0x01,0x04,0x3e,0xd2,0xde,0x49,0x47,0x9d,
+ 0x01,0x04,0x41,0x6c,0x27,0xab,0x47,0x9d,
+ 0x01,0x04,0x42,0x55,0x91,0x86,0x47,0x9d,
+ 0x01,0x04,0x42,0x87,0x1d,0xf3,0x47,0x9d,
+ 0x01,0x04,0x42,0xb7,0x00,0xcd,0x47,0x9d,
+ 0x01,0x04,0x43,0x04,0x52,0x09,0x47,0x9d,
+ 0x01,0x04,0x44,0xc5,0xcb,0xb5,0x47,0x9d,
+ 0x01,0x04,0x45,0x3b,0x12,0x17,0x47,0x9d,
+ 0x01,0x04,0x45,0x3d,0x20,0xf2,0x47,0x9d,
+ 0x01,0x04,0x45,0xc5,0xb9,0x6a,0x47,0x9d,
+ 0x01,0x04,0x47,0x08,0x1d,0x0c,0x47,0x9d,
+ 0x01,0x04,0x47,0x0d,0x5c,0x3e,0x47,0x9d,
+ 0x01,0x04,0x47,0xab,0x7b,0xa1,0x47,0x9d,
+ 0x01,0x04,0x48,0x2e,0x81,0x32,0x47,0x9d,
+ 0x01,0x04,0x49,0x16,0x09,0xe7,0x47,0x9d,
+ 0x01,0x04,0x49,0x35,0x2a,0x69,0x47,0x9d,
+ 0x01,0x04,0x4a,0xd5,0xaf,0x63,0x47,0x9d,
+ 0x01,0x04,0x4d,0xa3,0xdd,0xab,0x47,0x9d,
+ 0x01,0x04,0x4f,0xc0,0x27,0x69,0x47,0x9d,
+ 0x01,0x04,0x50,0x4f,0x04,0xf9,0x47,0x9d,
+ 0x01,0x04,0x50,0x5d,0xb3,0xfc,0x47,0x9d,
+ 0x01,0x04,0x50,0xf1,0xc2,0x93,0x47,0x9d,
+ 0x01,0x04,0x51,0x11,0x66,0x88,0x47,0x9d,
+ 0x01,0x04,0x53,0xe7,0xf0,0x03,0x47,0x9d,
+ 0x01,0x04,0x54,0x18,0x4d,0xbf,0x47,0x9d,
+ 0x01,0x04,0x54,0x9b,0x71,0xb1,0x47,0x9d,
+ 0x01,0x04,0x54,0xf7,0xa4,0x67,0x47,0x9d,
+ 0x01,0x04,0x55,0xcb,0x35,0x59,0x47,0x9d,
+ 0x01,0x04,0x55,0xcb,0x35,0x95,0x47,0x9d,
+ 0x01,0x04,0x55,0xd0,0x45,0x0c,0x47,0x9d,
+ 0x01,0x04,0x55,0xd0,0x45,0x0d,0x47,0x9d,
+ 0x01,0x04,0x58,0x50,0x94,0xd7,0x47,0x9d,
+ 0x01,0x04,0x59,0x75,0x13,0xbf,0x47,0x9d,
+ 0x01,0x04,0x59,0x99,0xa1,0x10,0x47,0x9d,
+ 0x01,0x04,0x59,0x9b,0xef,0x6b,0x47,0x9d,
+ 0x01,0x04,0x5b,0x7b,0xb6,0xa4,0x47,0x9d,
+ 0x01,0x04,0x5b,0x94,0x8d,0xd2,0x47,0x9d,
+ 0x01,0x04,0x65,0x64,0x8b,0xf9,0x47,0x9d,
+ 0x01,0x04,0x68,0xed,0x83,0x8a,0x47,0x9d,
+ 0x01,0x04,0x6d,0xe9,0x6d,0x1a,0x47,0x9d,
+ 0x01,0x04,0x7a,0xd0,0x75,0xc5,0x47,0x9d,
+ 0x01,0x04,0x7c,0xec,0x10,0x5b,0x47,0x9d,
+ 0x01,0x04,0x81,0xe2,0xc6,0xd3,0x47,0x9d,
+ 0x01,0x04,0x81,0xe2,0xc6,0xf6,0x47,0x9d,
+ 0x01,0x04,0x83,0xbc,0x28,0x2f,0x47,0x9d,
+ 0x01,0x04,0x84,0xe2,0x3d,0xd7,0x47,0x9d,
+ 0x01,0x04,0x87,0x54,0x88,0x9d,0x47,0x9d,
+ 0x01,0x04,0x89,0xb8,0x02,0x7c,0x47,0x9d,
+ 0x01,0x04,0x8a,0x02,0x64,0x72,0x47,0x9d,
+ 0x01,0x04,0x8d,0x62,0xdb,0x8e,0x47,0x9d,
+ 0x01,0x04,0x8d,0x62,0xdb,0xc7,0x47,0x9d,
+ 0x01,0x04,0x95,0x32,0x65,0x1b,0x47,0x9d,
+ 0x01,0x04,0x95,0x9a,0xb0,0x2f,0x47,0x9d,
+ 0x01,0x04,0x98,0x35,0x11,0x35,0x47,0x9d,
+ 0x01,0x04,0x98,0x35,0x12,0x6d,0x47,0x9d,
+ 0x01,0x04,0x9e,0xb2,0xe4,0x29,0x47,0x9d,
+ 0x01,0x04,0xa0,0x50,0x0b,0x42,0x47,0x9d,
+ 0x01,0x04,0xa2,0x00,0xd0,0x5a,0x47,0x9d,
+ 0x01,0x04,0xa2,0xf4,0x50,0xda,0x47,0x9d,
+ 0x01,0x04,0xa4,0x5c,0x8c,0x15,0x47,0x9d,
+ 0x01,0x04,0xa9,0x9b,0x2d,0xb4,0x47,0x9d,
+ 0x01,0x04,0xa9,0x9b,0xab,0xfc,0x47,0x9d,
+ 0x01,0x04,0xac,0xac,0x3e,0x56,0x47,0x9d,
+ 0x01,0x04,0xaf,0xd1,0xe4,0x8d,0x47,0x9d,
+ 0x01,0x04,0xb0,0x6c,0xc1,0x61,0x47,0x9d,
+ 0x01,0x04,0xb2,0x15,0x76,0x52,0x47,0x9d,
+ 0x01,0x04,0xb2,0x15,0x76,0x60,0x47,0x9d,
+ 0x01,0x04,0xb2,0x3f,0x57,0xa3,0x47,0x9d,
+ 0x01,0x04,0xb8,0x4a,0xf0,0x9d,0x47,0x9d,
+ 0x01,0x04,0xb9,0x1c,0x60,0x10,0x47,0x9d,
+ 0x01,0x04,0xb9,0x46,0x2b,0xc0,0x47,0x9d,
+ 0x01,0x04,0xb9,0x6b,0x44,0x87,0x47,0x9d,
+ 0x01,0x04,0xb9,0x84,0xb1,0x68,0x47,0x9d,
+ 0x01,0x04,0xb9,0xba,0xd0,0x7c,0x47,0x9d,
+ 0x01,0x04,0xb9,0xbe,0x18,0x48,0x47,0x9d,
+ 0x01,0x04,0xb9,0xd1,0xdf,0xc3,0x47,0x9d,
+ 0x01,0x04,0xb9,0xd2,0x7d,0x21,0x47,0x9d,
+ 0x01,0x04,0xb9,0xe8,0x46,0xe2,0x47,0x9d,
+ 0x01,0x04,0xba,0x9a,0xcf,0xe4,0x47,0x9d,
+ 0x01,0x04,0xbc,0x75,0x84,0x52,0x47,0x9d,
+ 0x01,0x04,0xbc,0xd5,0x5a,0x95,0x47,0x9d,
+ 0x01,0x04,0xbc,0xf6,0xa8,0x90,0x47,0x9d,
+ 0x01,0x04,0xc0,0xc6,0x51,0xf3,0x47,0x9d,
+ 0x01,0x04,0xc1,0xc6,0x22,0x18,0x47,0x9d,
+ 0x01,0x04,0xc2,0x5f,0x42,0x81,0x47,0x9d,
+ 0x01,0x04,0xc2,0x6e,0xa9,0x85,0x47,0x9d,
+ 0x01,0x04,0xc2,0xe9,0x5b,0x99,0x47,0x9d,
+ 0x01,0x04,0xc3,0x7b,0xf4,0x79,0x47,0x9d,
+ 0x01,0x04,0xc3,0xb3,0xe6,0xb4,0x47,0x9d,
+ 0x01,0x04,0xc6,0x3a,0x66,0x12,0x47,0x9d,
+ 0x01,0x04,0xcb,0x84,0x5e,0xc4,0x47,0x9d,
+ 0x01,0x04,0xcd,0xd1,0x77,0x96,0x47,0x9d,
+ 0x01,0x04,0xce,0xcc,0x68,0x07,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x44,0x00,0x63,0xc7,0x54,0x00,0x04,0xff,0xfe,0xcc,0xfc,0x1e,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x03,0x2d,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x03,0x87,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x06,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x70,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x06,0x02,0x2d,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x07,0x00,0x54,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x08,0x00,0x1d,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x08,0x00,0x3d,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x05,0x04,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x07,0x06,0xf2,0x16,0x71,0x5a,0x1c,0x24,0x33,0xb5,0x17,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x07,0x06,0xf2,0x2e,0x58,0xb9,0xff,0xfe,0x18,0xe0,0x93,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x07,0x06,0xf2,0x4d,0xfe,0xd8,0xfe,0x3d,0xc7,0x06,0x3f,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x07,0x06,0xf2,0x6a,0x34,0xc6,0x1d,0x97,0xb1,0xc9,0x8c,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x40,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x47,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x07,0x28,0x10,0x00,0x04,0x02,0x54,0x6e,0x98,0xff,0xfe,0x16,0x68,0xc6,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x04,0x09,0x16,0x18,0x77,0xff,0xfe,0x5f,0x0b,0x12,0x47,0x9d,
+ 0x02,0x10,0x24,0x01,0xc0,0x80,0x10,0x00,0x4c,0xb2,0x3e,0xec,0xef,0xff,0xfe,0xb9,0x86,0x04,0x47,0x9d,
+ 0x02,0x10,0x24,0x01,0xd0,0x02,0x39,0x02,0x07,0x00,0x87,0x08,0x37,0xc4,0xe2,0x31,0xd3,0xd8,0x47,0x9d,
+ 0x02,0x10,0x24,0x02,0x1f,0x00,0x81,0x01,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x5b,0x4c,0xf3,0x47,0x9d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x9e,0x7f,0x03,0x47,0x9d,
+ 0x02,0x10,0x26,0x01,0x06,0x03,0x53,0x00,0x83,0xb7,0x00,0x00,0x00,0xff,0xfe,0x00,0x42,0x0a,0x47,0x9d,
+ 0x02,0x10,0x26,0x04,0x13,0x80,0x45,0x31,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x47,0x9d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x65,0xc0,0x01,0x47,0x9d,
+ 0x02,0x10,0x26,0x05,0xa1,0x43,0x21,0x62,0x70,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x02,0x03,0x54,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x60,0x85,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x26,0x20,0x00,0x6e,0xa0,0x00,0x00,0x01,0x00,0x43,0x00,0x43,0x00,0x43,0x00,0x43,0x47,0x9d,
+ 0x02,0x10,0x28,0x04,0x04,0x31,0xe0,0x38,0xcd,0x01,0xaa,0xa1,0x59,0xff,0xfe,0x0d,0x44,0xb8,0x47,0x9d,
+ 0x02,0x10,0x28,0x06,0x02,0xf0,0x90,0xa0,0x45,0xfe,0xdd,0x25,0xf6,0xdf,0x47,0x41,0x4a,0x3f,0x47,0x9d,
+ 0x02,0x10,0x2a,0x00,0x12,0x98,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x42,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x73,0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x90,0x40,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x31,0x1e,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x42,0x4c,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0x97,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0x9a,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x2a,0x2d,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x30,0x70,0x26,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x30,0x71,0x21,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x30,0x80,0x35,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0xb3,0x14,0x20,0x7c,0xa0,0x3a,0x9a,0x5c,0xc3,0xb6,0x44,0x47,0x9d,
+ 0x02,0x10,0x2a,0x02,0x47,0x80,0x00,0x10,0x40,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x02,0x21,0x89,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x75,0x33,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x96,0x07,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x2a,0x05,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x1b,0x47,0x9d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x02,0x22,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x02,0x49,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x04,0x16,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x1c,0x03,0x92,0xc9,0x00,0x78,0xea,0xba,0x95,0x33,0x4c,0x1d,0x7c,0x47,0x9d,
+ 0x04,0x20,0xd2,0xe4,0xd1,0x40,0x65,0x5d,0x95,0xaf,0xe8,0x67,0xc0,0xe3,0x72,0xfd,0x0a,0x2e,0x35,0xb7,0xbd,0xac,0x67,0x78,0x36,0xe1,0xb8,0xba,0x30,0xcf,0x2e,0x05,0xdd,0x9d,0x47,0x9d,
+ 0x04,0x20,0xdf,0x8b,0x65,0x4c,0x4a,0x31,0x81,0x15,0x09,0x61,0x7d,0x34,0xfa,0x32,0x43,0x78,0x95,0xcf,0x00,0xe4,0xf0,0xac,0xf7,0x64,0x7a,0x33,0x3d,0x0f,0xa8,0xc3,0x82,0xd2,0x47,0x9d,
+ 0x04,0x20,0xdc,0x57,0x12,0xdc,0x09,0xe4,0x9e,0x7c,0x90,0x6e,0xcc,0xb5,0xf8,0x44,0x85,0xa5,0xbd,0x4d,0xd7,0x42,0x85,0x34,0x29,0x86,0x21,0xa9,0xe4,0x2d,0xd9,0xbb,0xe2,0x09,0x47,0x9d,
+ 0x04,0x20,0xdc,0xc0,0xef,0x59,0xb8,0x1a,0x0f,0x28,0x34,0x69,0xb7,0x5f,0x00,0xa9,0xda,0xec,0x6e,0xad,0x6e,0xc1,0xee,0xcd,0x3c,0x57,0xf5,0x60,0x58,0x2d,0x27,0xf5,0xb7,0xf8,0x47,0x9d,
+ 0x04,0x20,0xe7,0x24,0x61,0x57,0xa3,0xab,0xde,0xb9,0xef,0x44,0x6a,0xda,0x41,0x8f,0x0b,0xe1,0x87,0xcc,0xee,0x61,0x26,0x57,0xa9,0x08,0x83,0xb0,0x84,0xd1,0xe3,0x31,0x8b,0xfc,0x47,0x9d,
+ 0x04,0x20,0xe5,0xb6,0x5d,0x32,0xe4,0xe1,0x66,0xe1,0xb8,0x44,0x8b,0x24,0x0c,0xcb,0x70,0x5b,0xdd,0xbf,0xa0,0xca,0x19,0x9a,0x4f,0x28,0x1a,0x7f,0xac,0xd6,0xc4,0xd6,0x7e,0x61,0x47,0x9d,
+ 0x04,0x20,0xf7,0xd7,0xe5,0xe9,0x5f,0x64,0x02,0xbd,0x06,0x78,0xab,0xba,0x7e,0xad,0x48,0xda,0xae,0x28,0x98,0x34,0x6a,0xd5,0xf0,0xc4,0x4b,0x76,0x00,0xe0,0x16,0x61,0x97,0x58,0x47,0x9d,
+ 0x04,0x20,0xf3,0x3e,0xa3,0xaa,0x75,0x22,0x18,0x2d,0xf7,0x09,0xa4,0x8c,0x47,0xc5,0xa3,0xb7,0x36,0x68,0xa4,0x97,0x97,0x42,0xf8,0xd2,0xca,0x71,0x82,0x7e,0xad,0xd5,0xaf,0x3e,0x47,0x9d,
+ 0x04,0x20,0xf4,0x5b,0x07,0xc2,0x02,0x7a,0xd7,0x03,0xa5,0xc0,0xe1,0xad,0x19,0xc3,0xb8,0x47,0x8a,0x31,0x1f,0xd4,0x86,0x40,0xf1,0x90,0x9a,0x34,0x3d,0xf3,0x5c,0xd2,0x5f,0xf7,0x47,0x9d,
0x04,0x20,0xfb,0xcf,0xf6,0x44,0x5a,0xe4,0xc9,0xdf,0xb2,0xaf,0x78,0x12,0x55,0x15,0x3c,0x62,0xbf,0x9a,0x67,0x93,0x25,0x15,0x86,0x4f,0x76,0x33,0xc6,0xfb,0x7a,0xaf,0x68,0xc8,0x47,0x9d,
+ 0x04,0x20,0xfb,0xdd,0x00,0x25,0x7e,0x95,0x73,0xca,0xc7,0x60,0x82,0x3f,0x51,0xcc,0x11,0xd4,0xfb,0xe1,0x44,0x31,0x9a,0x7d,0x84,0x7f,0xb8,0x1c,0x67,0xb4,0x18,0xf8,0xbf,0xe1,0x47,0x9d,
+ 0x04,0x20,0xfe,0x57,0x08,0xa0,0xe1,0xe8,0xdd,0xd2,0x04,0x2c,0x4d,0x8d,0x27,0xdd,0x06,0x81,0x46,0xc5,0x16,0x4b,0x54,0x26,0x6d,0x34,0xc3,0x17,0xb0,0xf9,0x51,0xb9,0x0f,0x10,0x47,0x9d,
+ 0x04,0x20,0x00,0xd2,0xd9,0x5d,0x15,0x5c,0x83,0xd6,0x70,0x9c,0x09,0x66,0x7a,0xd4,0x42,0x49,0x6b,0xfc,0xa9,0xf8,0x4e,0x08,0x1a,0x82,0x6b,0x3e,0x21,0x81,0x61,0x43,0xfa,0x02,0x47,0x9d,
+ 0x04,0x20,0x00,0xe5,0x30,0x05,0x39,0xf9,0x05,0xac,0x6d,0x33,0xe5,0xb4,0x3a,0xd1,0x8c,0x75,0xb3,0x5f,0x9b,0xcc,0xd1,0x76,0xa0,0x24,0x84,0x49,0x4b,0x40,0x67,0xee,0x4d,0x93,0x47,0x9d,
+ 0x04,0x20,0x01,0x25,0x8f,0x4c,0xb4,0x28,0x06,0xaa,0x4f,0xc5,0x5d,0x34,0x19,0x40,0xcd,0xb6,0xb9,0xad,0x52,0x3a,0xc3,0x52,0x05,0x9a,0x97,0x5e,0x69,0x9a,0x2a,0x66,0xde,0x48,0x47,0x9d,
+ 0x04,0x20,0x02,0x16,0x80,0xee,0x0a,0xe0,0x62,0x7e,0x67,0x4d,0xab,0x18,0x01,0xb9,0x1e,0x30,0x65,0x6f,0x95,0x07,0x2d,0xe7,0x1f,0xc5,0xac,0xe6,0x7a,0x3f,0x40,0x52,0x7c,0x7e,0x47,0x9d,
+ 0x04,0x20,0x06,0x2f,0xbe,0xc7,0x4c,0x3d,0xb0,0x31,0x67,0x2e,0x85,0x3e,0x1f,0x0d,0x7b,0x95,0x1f,0xc7,0x1e,0x7f,0xe4,0x8c,0xd5,0xc5,0x2a,0xbe,0x03,0x93,0xe8,0xec,0x2b,0x40,0x47,0x9d,
+ 0x04,0x20,0x09,0x15,0xee,0xe9,0x65,0x97,0xd8,0x92,0x73,0xd9,0x05,0x0e,0x5b,0xcc,0x67,0xd6,0x5c,0x72,0x69,0x2f,0x0c,0x98,0xb3,0xd1,0x74,0x95,0x32,0x07,0x6b,0xf4,0xb3,0xec,0x47,0x9d,
0x04,0x20,0x0a,0xb2,0xef,0xb1,0xf7,0xa0,0x23,0xf8,0x9e,0x41,0x45,0x86,0x0b,0xc0,0x58,0x62,0x2e,0x08,0x88,0x23,0x60,0x77,0x21,0x82,0x13,0xaf,0xb0,0x1d,0x4a,0xb0,0x9c,0xf3,0x47,0x9d,
+ 0x04,0x20,0x0d,0xb1,0x41,0xd5,0x7b,0x41,0x77,0x1f,0x92,0x44,0xd0,0x81,0x86,0x15,0xa1,0xbc,0x33,0x31,0x6d,0x86,0x8e,0x91,0xd3,0xd2,0x29,0x9c,0xd6,0x00,0x9d,0x7b,0x19,0x4d,0x47,0x9d,
+ 0x04,0x20,0x0e,0x5b,0xed,0xae,0x4c,0x95,0x2b,0x95,0x9b,0x94,0x80,0x07,0x8c,0x2e,0xe0,0x31,0x86,0x28,0xe5,0x41,0xef,0x99,0x4b,0x68,0x3c,0xd9,0x67,0xd8,0x2b,0x0d,0xae,0x4a,0x47,0x9d,
+ 0x04,0x20,0x17,0xf3,0x18,0x6b,0x10,0x9f,0xa3,0x36,0xf4,0x77,0x50,0xb2,0xfe,0x86,0xbe,0xd2,0xb4,0x96,0x8a,0xbb,0x64,0x84,0xe7,0x6b,0x82,0xd7,0x22,0xb4,0x85,0xeb,0x8e,0x87,0x47,0x9d,
+ 0x04,0x20,0x14,0x0f,0x49,0xe8,0x64,0x04,0xbd,0x20,0x54,0xee,0x7e,0xb1,0x42,0x7e,0xa4,0x0d,0x3f,0xf2,0x8f,0x64,0x43,0x6f,0xbf,0x4d,0x66,0xbc,0x7e,0x10,0xfa,0xab,0x21,0x76,0x47,0x9d,
+ 0x04,0x20,0x15,0x7b,0x9d,0xa3,0x22,0xa7,0xca,0xc9,0x87,0x1c,0x3e,0x12,0xb4,0x3c,0xef,0xf0,0x4f,0xa0,0x6f,0x2c,0x66,0xbf,0x32,0x91,0xa3,0xc0,0xa9,0xbe,0x4e,0xda,0x9a,0x81,0x47,0x9d,
+ 0x04,0x20,0x16,0x17,0xf2,0x51,0x2a,0xba,0xf7,0x2d,0x88,0x34,0x3b,0x1d,0x43,0xaa,0xf3,0xe0,0x86,0x57,0xad,0xe1,0x38,0x35,0x9f,0x27,0xa0,0x18,0x04,0x30,0x43,0x51,0x4a,0x74,0x47,0x9d,
0x04,0x20,0x1f,0xb7,0x52,0xf3,0xb3,0x07,0x04,0x78,0x92,0xcd,0x8d,0x31,0x5c,0x3d,0x9f,0xc0,0x4b,0x79,0xd2,0x7b,0xd7,0xc5,0x19,0xc3,0xd0,0x2e,0x23,0x51,0x5a,0xfc,0xdf,0x22,0x47,0x9d,
- 0x04,0x20,0x21,0x60,0x5b,0x7a,0xa9,0x87,0xcc,0xf3,0x60,0xee,0x95,0x37,0x02,0xeb,0x87,0x94,0x8f,0x77,0x84,0xe0,0xc7,0x35,0xe1,0x0a,0x46,0xcf,0x78,0xa2,0x63,0x82,0xad,0xa8,0x47,0x9d,
+ 0x04,0x20,0x18,0xe5,0x79,0x6f,0x23,0x54,0x9f,0x05,0x0a,0x59,0x65,0xff,0xc8,0xaa,0xdf,0x34,0x12,0x67,0xe7,0x54,0x28,0x79,0x08,0x1f,0x83,0xcf,0x50,0x0c,0x49,0xc4,0xd9,0x6b,0x47,0x9d,
+ 0x04,0x20,0x1d,0x29,0x61,0x95,0xab,0x8d,0x06,0xe6,0xd8,0xc3,0xad,0x41,0x41,0xed,0x1d,0xd6,0x47,0x73,0x68,0x29,0x26,0x3e,0x96,0x66,0x4a,0x30,0x81,0x44,0x60,0x89,0xc1,0x4b,0x47,0x9d,
+ 0x04,0x20,0x1d,0x83,0xcf,0x89,0x90,0x06,0xa6,0x97,0xb2,0xa9,0x01,0x01,0x1f,0x98,0x62,0x04,0x65,0xa5,0x93,0x3e,0x6a,0x08,0x53,0xa3,0x90,0x2e,0xb5,0x02,0x1e,0x78,0x98,0x3d,0x47,0x9d,
+ 0x04,0x20,0x26,0xbe,0xd0,0xa5,0x4e,0xa6,0x98,0xa8,0x51,0xd8,0x9a,0x50,0xbd,0x7c,0xdd,0x3e,0xf9,0x65,0x19,0x33,0x8d,0xa8,0xf6,0xed,0x94,0x16,0x85,0xa0,0xff,0xc3,0x28,0xd5,0x47,0x9d,
+ 0x04,0x20,0x27,0xe6,0xa8,0x97,0xbc,0x69,0xb7,0x0e,0xd4,0x4d,0xe9,0x9b,0xff,0xe6,0xc9,0xb3,0x3f,0xc5,0xa8,0xa0,0xaf,0x19,0x61,0xd2,0xfb,0x7d,0x5c,0xdf,0x62,0xb0,0x36,0xe6,0x47,0x9d,
+ 0x04,0x20,0x21,0x2b,0xba,0xd0,0xfd,0xe8,0xf0,0xc3,0xb7,0x79,0xe2,0xd8,0x70,0x44,0xc2,0xc6,0xaf,0x96,0x79,0x7c,0xc6,0x07,0xd0,0xf0,0x26,0x2c,0xa7,0x7d,0x48,0xbf,0xeb,0x25,0x47,0x9d,
+ 0x04,0x20,0x26,0x12,0x03,0xc4,0xc9,0xfc,0x00,0x3c,0x89,0xd3,0x03,0x6e,0x50,0x9e,0x47,0x92,0x59,0xfc,0x27,0x6f,0xf4,0xe5,0x24,0x51,0xe8,0xa0,0x7e,0xae,0xcb,0xbd,0x6d,0xc5,0x47,0x9d,
+ 0x04,0x20,0x2f,0x81,0x64,0x09,0xc1,0xcc,0x77,0x7e,0x17,0x3b,0x1b,0x6e,0x18,0xb8,0x11,0x0d,0x16,0x48,0x6b,0xc9,0xca,0xe6,0xd5,0xfa,0xca,0x6a,0x9e,0x7d,0x2e,0x97,0x8d,0x2c,0x47,0x9d,
+ 0x04,0x20,0x28,0x50,0xc2,0x49,0xb8,0x3e,0x68,0x10,0xe6,0x02,0xdd,0x01,0x42,0xe5,0x41,0xc1,0x58,0xd5,0x5e,0xb8,0x7b,0xae,0x0a,0x90,0x14,0x0f,0xe3,0x97,0xe4,0xfa,0x2b,0xaf,0x47,0x9d,
+ 0x04,0x20,0x2a,0x45,0x1e,0xf4,0xc6,0xdd,0x6b,0xf8,0x21,0x5e,0xe4,0xae,0xd4,0x1c,0xe4,0xa5,0x54,0x5c,0x4d,0xf5,0xcb,0x3a,0x96,0x1b,0x3d,0xe8,0x9f,0xee,0x6b,0xf8,0xae,0x13,0x47,0x9d,
+ 0x04,0x20,0x2b,0xf3,0x81,0x30,0x59,0xe0,0xe2,0x7e,0x78,0xa7,0x11,0x46,0xa3,0x20,0x2d,0x7f,0xe0,0x64,0x39,0xdb,0xa3,0xe1,0x4b,0xe1,0x36,0x57,0xb2,0x43,0x22,0x21,0x10,0xf9,0x47,0x9d,
+ 0x04,0x20,0x2c,0x17,0x2f,0x8a,0xb4,0x67,0xd6,0xf0,0x58,0x03,0xfb,0x7b,0x98,0xd5,0x91,0x85,0xa2,0x3f,0xfa,0x14,0x17,0x63,0xf7,0x85,0x6d,0x18,0x1c,0x3d,0xda,0x09,0x5b,0xcb,0x47,0x9d,
+ 0x04,0x20,0x2d,0xa5,0x68,0x4f,0x51,0x08,0xc3,0x29,0xdf,0xaa,0xc8,0x38,0x60,0xfc,0x0e,0x56,0xcc,0x4c,0x83,0x25,0x34,0xdc,0xa0,0x0e,0x04,0x45,0x8c,0xa3,0x0d,0x56,0xb0,0xd8,0x47,0x9d,
+ 0x04,0x20,0x2d,0xfe,0x48,0xd9,0x8a,0xa1,0xd3,0xf7,0xe8,0x88,0xa2,0x24,0x9b,0x1b,0x66,0xd8,0x36,0x0b,0x7a,0x86,0x59,0x1e,0x0e,0x7c,0xd6,0x17,0xfc,0x35,0xc6,0xcf,0x16,0xda,0x47,0x9d,
+ 0x04,0x20,0x31,0xe0,0x18,0x3f,0x63,0x44,0x70,0x0f,0x92,0x4f,0x6a,0x76,0xcd,0xa8,0xfe,0x61,0xc0,0xb8,0x5d,0x35,0xff,0x59,0x4a,0x33,0x92,0x25,0x14,0xe7,0x90,0x73,0xb6,0x25,0x47,0x9d,
+ 0x04,0x20,0x33,0xea,0x10,0x8e,0x55,0xf7,0xf7,0x92,0x9b,0x4c,0x78,0x73,0x72,0x5d,0xac,0xae,0xdd,0x00,0x28,0xd0,0x73,0xb1,0x5c,0x66,0x2b,0x3d,0x3c,0xca,0x0b,0x0b,0x2b,0x83,0x47,0x9d,
+ 0x04,0x20,0x34,0x51,0xa4,0xf2,0x74,0x1d,0x5d,0x70,0x67,0x5e,0x48,0x72,0xc6,0xf1,0x4b,0x73,0xbb,0x9f,0xc2,0x48,0xdd,0x4a,0x8d,0x8b,0xae,0x57,0x67,0x46,0xb3,0x78,0xcb,0x0a,0x47,0x9d,
+ 0x04,0x20,0x34,0xad,0xe9,0x37,0x5f,0x85,0x2c,0x5f,0x53,0x72,0xb1,0xa2,0x0f,0x3b,0xeb,0x8b,0xfb,0x00,0x53,0xca,0x9e,0xf0,0xca,0x61,0xd7,0x32,0xa6,0x7f,0x59,0xb3,0xcb,0x34,0x47,0x9d,
0x04,0x20,0x36,0x3c,0xd4,0x1f,0x8f,0x63,0xfa,0x49,0x62,0xb5,0x69,0xd6,0x9f,0x42,0xaa,0xfe,0x54,0x14,0xd1,0xd2,0xb2,0xae,0x52,0xe1,0x08,0x7e,0xc6,0x15,0x56,0x45,0xbd,0xb3,0x47,0x9d,
- 0x04,0x20,0x3d,0x90,0xfc,0xa1,0xd3,0x12,0xee,0x6d,0xac,0x83,0x6f,0x70,0x9e,0xa7,0xcd,0xf3,0xd5,0x13,0x35,0x8b,0x54,0x9d,0x9c,0xae,0x33,0x5b,0x56,0xf3,0x52,0xa8,0xbb,0xaf,0x47,0x9d,
+ 0x04,0x20,0x3f,0x2f,0x1f,0xe1,0xd5,0xc6,0xd4,0x68,0xb8,0xe3,0x58,0x7b,0x95,0xa6,0x78,0xb1,0x08,0xbc,0x0a,0x65,0x31,0x7b,0x0d,0x71,0xab,0x3e,0x1d,0x70,0xb1,0x2c,0x0a,0xfe,0x47,0x9d,
+ 0x04,0x20,0x3f,0x31,0x49,0x19,0x69,0x88,0x10,0x50,0x35,0x09,0xe3,0xee,0xab,0x72,0x0a,0x97,0x10,0x85,0xc0,0x30,0xdf,0x40,0x19,0x23,0x5c,0x12,0x1b,0x4a,0xd3,0x0c,0xef,0x8c,0x47,0x9d,
+ 0x04,0x20,0x38,0x41,0xb6,0x3c,0xf7,0x3b,0xe9,0x8e,0x5f,0xa6,0x4c,0x31,0x0f,0x70,0x36,0x9a,0xf2,0xb2,0xd2,0x42,0xb8,0xbe,0xde,0xac,0xfc,0x57,0x1c,0x8b,0x44,0xc2,0xcf,0x68,0x47,0x9d,
+ 0x04,0x20,0x3a,0x75,0x3b,0xae,0xe0,0x48,0xd6,0x7f,0xa6,0x45,0xb4,0x2f,0x37,0xec,0x4b,0x9a,0xdf,0x39,0x47,0x7b,0x14,0xd2,0xa0,0xdc,0xe1,0xc8,0x70,0x88,0xa9,0x82,0x79,0x4f,0x47,0x9d,
+ 0x04,0x20,0x3b,0x26,0x16,0xe1,0x8e,0xa0,0x10,0xc3,0xb6,0xe0,0xcd,0x13,0x6f,0xa3,0xa1,0xf9,0xe0,0x34,0x5e,0x2b,0x40,0x47,0x86,0xee,0x63,0xe0,0x47,0x6e,0x49,0x3f,0x90,0x5a,0x47,0x9d,
+ 0x04,0x20,0x3c,0xd4,0x88,0x02,0x0e,0x82,0xfe,0xf4,0xca,0x64,0x6b,0x2d,0xea,0xf0,0x2b,0x67,0x97,0xdf,0x8f,0xc7,0x5f,0x98,0x4b,0x5d,0x4c,0x2a,0x37,0x0a,0x31,0xd9,0x2a,0xef,0x47,0x9d,
+ 0x04,0x20,0x3d,0x42,0xc6,0x66,0xb0,0x8b,0xcc,0xf9,0x6a,0xfd,0xa7,0x10,0xfe,0x2a,0x45,0xd9,0x3a,0xcd,0x15,0xa4,0x00,0xbf,0xde,0x1a,0x6d,0x3a,0x5b,0xa8,0xc8,0x95,0x6a,0x3c,0x47,0x9d,
+ 0x04,0x20,0x3d,0x67,0x7c,0x32,0xa3,0x0f,0x7b,0x4f,0xac,0xe3,0xb7,0xbf,0xfe,0x81,0x50,0xc7,0x3c,0x86,0xd1,0xab,0xdd,0x28,0xfd,0x7c,0xcd,0x95,0xd9,0xa0,0xc1,0x95,0xef,0x6c,0x47,0x9d,
+ 0x04,0x20,0x47,0x4a,0x97,0xfc,0xc6,0xbf,0xb5,0x95,0x95,0x48,0x0e,0x5b,0xf9,0x78,0xcb,0x7a,0x5f,0xb3,0xeb,0x0f,0x2b,0x99,0xb5,0xb2,0x08,0xba,0x0d,0xf8,0x04,0x66,0x22,0x77,0x47,0x9d,
0x04,0x20,0x47,0x4c,0xf3,0xdb,0x43,0xd6,0xb9,0x36,0xa2,0x0a,0x49,0x03,0x71,0xdb,0x3d,0xc1,0x82,0x17,0x74,0xc2,0xa4,0x8e,0xec,0x12,0xb5,0xfd,0xfe,0xee,0x77,0x81,0xf4,0x17,0x47,0x9d,
+ 0x04,0x20,0x41,0xc0,0xb3,0x33,0x67,0x97,0x78,0x7f,0x82,0x1b,0xf9,0xc3,0x1c,0x02,0xe2,0x1a,0xdd,0x66,0x2d,0x92,0xef,0x11,0xc1,0x67,0xc7,0x80,0x73,0xc6,0xea,0x09,0x4a,0x2d,0x47,0x9d,
0x04,0x20,0x43,0xc3,0x99,0x69,0x61,0x27,0xd6,0x00,0xea,0xe0,0x42,0xaa,0xa1,0xaa,0xd7,0x40,0x1b,0xe9,0xed,0xa0,0x50,0x1c,0xb9,0xd8,0x32,0x3b,0xc9,0x50,0xcb,0x23,0xab,0xb1,0x47,0x9d,
+ 0x04,0x20,0x46,0x25,0x7d,0x0d,0x7c,0x9b,0xdc,0x94,0x09,0x67,0xde,0x91,0x83,0x91,0x7e,0xcf,0xcf,0xad,0x7c,0x5f,0x77,0xc3,0x4c,0xab,0xb6,0xa4,0x2d,0xe8,0x1e,0x98,0x9d,0x65,0x47,0x9d,
+ 0x04,0x20,0x48,0x4d,0x52,0x7f,0x28,0xe5,0x6f,0xd5,0xff,0xdd,0xe2,0x0f,0xc6,0xe6,0x93,0x93,0xe9,0xbf,0x0e,0xb2,0xf7,0xae,0xb2,0x18,0x48,0xa4,0x74,0x27,0xe1,0x9c,0x30,0xd2,0x47,0x9d,
0x04,0x20,0x4a,0x4b,0x4c,0x27,0xea,0x89,0xb2,0xa6,0x3e,0xf5,0x6e,0xc3,0xa4,0xe8,0xf6,0x5e,0x54,0xcc,0x93,0x64,0xce,0x36,0x82,0xd9,0x5f,0x1b,0x65,0x6b,0x02,0xc6,0x66,0x60,0x47,0x9d,
0x04,0x20,0x4b,0x5e,0x72,0xcc,0x87,0x51,0x65,0x3b,0x05,0x4e,0xdf,0x10,0x3b,0xad,0xee,0xe9,0x47,0x6f,0x2e,0x2e,0x62,0x98,0x4a,0x2a,0xe7,0xdd,0xc4,0xb9,0x9d,0x72,0x99,0x0e,0x47,0x9d,
- 0x04,0x20,0x4c,0x4e,0xfb,0x40,0x07,0x4c,0x53,0xfe,0x9a,0x61,0xf9,0xa7,0xad,0x92,0xa4,0xf7,0x6f,0xf0,0x84,0x16,0xc7,0xd3,0xc2,0x0c,0xec,0x30,0x5d,0xd6,0xa7,0x4c,0x50,0x08,0x47,0x9d,
+ 0x04,0x20,0x4b,0xe8,0x93,0x30,0x51,0xd1,0x66,0xa5,0xde,0x31,0xfd,0x2d,0x73,0xed,0x26,0xe6,0xe9,0x00,0x4f,0x12,0xfd,0x8c,0xe9,0x14,0x2f,0x28,0x6f,0xd9,0xde,0xda,0x6e,0x7f,0x47,0x9d,
+ 0x04,0x20,0x4c,0x85,0xc2,0xc6,0xb5,0x6a,0xf4,0x3d,0x84,0xf9,0xc3,0x8b,0x21,0x7f,0x57,0x7e,0x66,0x66,0x6b,0x6d,0x5f,0x0a,0xd0,0xf0,0x76,0x56,0x65,0x78,0xf8,0xa7,0x42,0x75,0x47,0x9d,
0x04,0x20,0x4d,0x1b,0xe3,0x0d,0x81,0x30,0x25,0x1e,0xfc,0x27,0x8f,0x33,0x2d,0x8c,0xa7,0x17,0x9f,0x97,0x82,0xda,0xfb,0x60,0x1e,0x0c,0x03,0x08,0x11,0xfc,0x44,0x30,0xef,0x73,0x47,0x9d,
- 0x04,0x20,0x77,0x75,0x8f,0x94,0x03,0x9d,0x03,0x1e,0x4e,0x90,0x3a,0x2f,0xec,0x32,0x28,0x6e,0xe1,0x96,0xfe,0x81,0x3f,0x66,0x4b,0x52,0x84,0x3d,0xbb,0x6b,0x88,0x2d,0x2a,0x7d,0x47,0x9d,
- 0x04,0x20,0x8a,0x0c,0x56,0x6d,0x2e,0x41,0x7a,0xb9,0x2f,0xe1,0xfe,0x23,0xe1,0xf8,0x55,0x18,0xe8,0xa0,0x5b,0x0a,0x67,0xd4,0x63,0x53,0x25,0xb2,0x3c,0x37,0xac,0x4a,0xc6,0x7d,0x47,0x9d,
- 0x04,0x20,0x9f,0x87,0xe2,0x3c,0x3d,0x10,0x82,0xee,0x13,0xde,0x40,0x00,0xda,0x2a,0x20,0xbb,0xd2,0xc8,0x22,0x12,0xcf,0x9e,0xe4,0xf6,0x95,0xbd,0x34,0xeb,0x35,0xa7,0x11,0xa9,0x47,0x9d,
- 0x04,0x20,0x99,0x25,0x3d,0x55,0xd9,0x5d,0xcb,0x96,0xb0,0xb8,0xbe,0x55,0x45,0x97,0x6b,0xf4,0x09,0xe1,0xcd,0x1d,0x3c,0x0a,0x99,0x5c,0x11,0xea,0xd8,0xbe,0x74,0x49,0x6e,0x09,0x47,0x9d,
- 0x04,0x20,0xa5,0xe6,0xc9,0xb1,0xea,0x28,0x2e,0x2f,0x64,0x57,0x05,0xcd,0x81,0xc6,0x8a,0xc0,0xfa,0x91,0xc4,0x4f,0xd3,0x3a,0xea,0x05,0xe8,0x62,0x13,0x8e,0x72,0x2d,0x4d,0x31,0x47,0x9d,
+ 0x04,0x20,0x50,0x18,0x06,0x9d,0xdd,0x12,0xc4,0xf6,0xf5,0x7b,0x90,0xbc,0x83,0xee,0xa1,0xe4,0x94,0xc2,0x9c,0xd7,0xb6,0xcf,0xa6,0x1a,0x5f,0x27,0x50,0x32,0x93,0x34,0xe8,0xed,0x47,0x9d,
+ 0x04,0x20,0x51,0x13,0x8c,0xce,0x71,0x26,0x07,0xf6,0xa7,0x52,0xbd,0xf5,0xd6,0xab,0x90,0xb1,0xaf,0x3a,0x43,0x01,0xc2,0xef,0x48,0x45,0x31,0x71,0x3a,0xc0,0x9d,0x71,0xee,0xf4,0x47,0x9d,
+ 0x04,0x20,0x53,0x54,0xa8,0x06,0xe7,0x1a,0x27,0xcb,0xa1,0x6a,0x90,0x7b,0x89,0x6e,0x0d,0x85,0x7d,0xb9,0x80,0xfd,0xa5,0x69,0xb6,0xe9,0x0c,0xa7,0x03,0x81,0x21,0xf4,0xdf,0x78,0x47,0x9d,
+ 0x04,0x20,0x53,0xe5,0x8f,0x84,0x30,0xba,0x1d,0x35,0x77,0xa0,0x00,0x93,0x3d,0x1d,0x00,0x4f,0x8f,0xd7,0xdd,0x29,0xac,0x83,0xed,0x9c,0xce,0x97,0x01,0x82,0xe6,0xd1,0x63,0x65,0x47,0x9d,
+ 0x04,0x20,0x55,0x93,0x75,0x82,0x96,0x4c,0xc8,0x24,0x96,0x48,0xb3,0x9e,0x15,0xf5,0xf5,0x6f,0x5b,0xec,0xf6,0x39,0xff,0xa8,0xaf,0x3a,0x4c,0x5d,0x22,0x3d,0xd3,0x14,0xc3,0x05,0x47,0x9d,
+ 0x04,0x20,0x66,0xbe,0x71,0xeb,0xed,0xf8,0xd8,0xdc,0x18,0x63,0x6b,0xfa,0x16,0x97,0xd5,0x5f,0x68,0xa9,0x7f,0xe9,0x8c,0x35,0x43,0xce,0xf7,0xa9,0x89,0x61,0x2f,0x29,0xb4,0x91,0x47,0x9d,
+ 0x04,0x20,0x66,0xf7,0x96,0x76,0x13,0xc9,0x80,0x5f,0x74,0x07,0x05,0xc2,0xe6,0x7f,0xb9,0x71,0x0f,0x8c,0xc7,0x6b,0x0c,0x0b,0xa7,0x06,0x6f,0xce,0x72,0x92,0x06,0xbf,0xc0,0xff,0x47,0x9d,
+ 0x04,0x20,0x62,0x65,0xe7,0x8d,0xa3,0xe9,0xf9,0x81,0x32,0x46,0x8d,0x2d,0x6e,0x0a,0x32,0x24,0xa1,0x91,0xdb,0x65,0x23,0x06,0x86,0xc9,0x1e,0x71,0x8e,0xc4,0xac,0x7f,0x5b,0xb0,0x47,0x9d,
+ 0x04,0x20,0x6e,0xb6,0x06,0xdb,0x99,0x0f,0xcb,0xb7,0x82,0x2e,0x00,0xbd,0xaf,0x38,0x5a,0x94,0x31,0xbc,0x37,0xaa,0x49,0x5e,0x28,0x54,0x3b,0x5d,0x47,0x8b,0xfc,0x79,0xcb,0xdd,0x47,0x9d,
+ 0x04,0x20,0x6f,0x09,0xe2,0xbf,0xd7,0x76,0x1d,0xa3,0x2e,0x40,0x2a,0x6c,0x10,0x43,0x76,0x44,0x4e,0xb1,0xbd,0x36,0xe3,0x24,0xa6,0xf5,0x79,0x53,0x38,0xee,0xac,0xe7,0xeb,0x7a,0x47,0x9d,
+ 0x04,0x20,0x6b,0xb1,0x9b,0x4d,0xe5,0x86,0x03,0x83,0x91,0x91,0x65,0xf2,0x3f,0xb4,0xbc,0x42,0xfa,0xc3,0xc9,0xcb,0xa3,0xdf,0xfb,0xcd,0x91,0x4b,0xa4,0x09,0xfe,0x03,0x64,0x39,0x47,0x9d,
+ 0x04,0x20,0x72,0xdb,0xfc,0x04,0x48,0xee,0xec,0xae,0x1b,0xad,0xe6,0x9a,0x87,0xe1,0x17,0xae,0x13,0x70,0xae,0x83,0x90,0x62,0x59,0x30,0xed,0x44,0x43,0xe9,0xab,0xee,0xaa,0xd0,0x47,0x9d,
+ 0x04,0x20,0x73,0x83,0x69,0xb7,0xa2,0x92,0x38,0x0a,0x12,0xa1,0xd3,0x65,0xa0,0xf6,0x31,0x4b,0x6e,0xc3,0xaf,0x23,0x60,0x31,0xcc,0xde,0x79,0xaa,0x93,0xf9,0x83,0x11,0x35,0x8a,0x47,0x9d,
+ 0x04,0x20,0x73,0x9a,0x3d,0xc1,0x8d,0x1a,0x82,0x33,0x7f,0xd1,0xc6,0x13,0x99,0x85,0x92,0x65,0x5c,0x9e,0x6e,0x9e,0xe1,0x92,0x78,0xe9,0xb5,0x84,0x51,0x44,0xe2,0x64,0x25,0x39,0x47,0x9d,
+ 0x04,0x20,0x74,0x2e,0x8a,0xdd,0xe8,0x9f,0xf9,0x69,0x39,0xf3,0x90,0x7c,0xa8,0xed,0x5a,0xb9,0x20,0xfc,0x94,0x6e,0xcd,0x6d,0xc6,0x6a,0xd5,0xad,0x13,0x12,0xae,0xee,0xe6,0x14,0x47,0x9d,
+ 0x04,0x20,0x75,0xd5,0x8a,0x25,0xa9,0x0a,0xfc,0xaf,0xa8,0x57,0x00,0xa7,0x82,0xf0,0x0a,0x7e,0xc8,0x99,0x96,0x6d,0x0b,0x33,0x35,0x7a,0x93,0xbc,0xf9,0x9c,0x70,0xa7,0x3c,0xd5,0x47,0x9d,
+ 0x04,0x20,0x7e,0x9c,0x89,0xe2,0x53,0xc0,0x25,0xd7,0xdc,0x8e,0xd7,0xb4,0xc7,0x5f,0xc0,0x71,0x79,0x3a,0x2b,0x01,0x6a,0xfe,0x24,0xfc,0xa2,0xb3,0xa4,0x78,0x12,0x55,0x2a,0xb5,0x47,0x9d,
+ 0x04,0x20,0x7a,0x75,0x1b,0xc3,0x52,0x28,0x6d,0x39,0x42,0x02,0x0b,0x4a,0xdb,0x28,0xdb,0xf0,0xff,0xac,0x08,0x9d,0xf4,0x18,0xfd,0x49,0x29,0x60,0x7e,0x7a,0xe5,0xf9,0x02,0x36,0x47,0x9d,
+ 0x04,0x20,0x7d,0x37,0x91,0x10,0x54,0x4e,0x43,0x21,0x81,0xc6,0x2f,0x20,0x67,0x6e,0x84,0xf7,0xd6,0x8a,0xbb,0x20,0xf6,0x81,0x65,0x94,0xa9,0x6c,0x1b,0x14,0x04,0xcc,0xae,0x20,0x47,0x9d,
+ 0x04,0x20,0x87,0x60,0xeb,0xff,0xbe,0x40,0xfa,0xd2,0x8e,0x9e,0x3c,0xf8,0x33,0x1c,0x5b,0xea,0x49,0x95,0xcb,0x81,0x32,0x44,0x36,0xc4,0x72,0xdb,0xec,0xd1,0xd4,0x77,0xde,0xb2,0x47,0x9d,
+ 0x04,0x20,0x81,0x34,0x90,0x93,0x9c,0xf9,0xc9,0xe7,0x81,0xa5,0xab,0xf1,0x03,0xe1,0xb3,0x2f,0xf7,0xcf,0x19,0x94,0x2f,0x7a,0x1b,0xc5,0x83,0xc9,0x8c,0xc3,0x5b,0x09,0x96,0x14,0x47,0x9d,
+ 0x04,0x20,0x81,0x75,0x30,0x42,0xd3,0xce,0xdf,0x29,0xcf,0xfb,0x39,0x83,0x12,0xd6,0x68,0x59,0x88,0x29,0x0b,0xbd,0xf2,0xd1,0x95,0x65,0x5a,0x12,0x24,0x38,0x23,0xeb,0x8b,0x65,0x47,0x9d,
+ 0x04,0x20,0x82,0x08,0xfe,0x1e,0xb4,0x75,0x48,0x30,0x84,0x5b,0xf1,0xd7,0xf6,0xda,0x4b,0xb2,0x3c,0x03,0xfa,0x96,0xe3,0x5b,0x22,0x61,0x23,0x98,0xbf,0xb1,0x0b,0xb1,0x28,0xc1,0x47,0x9d,
+ 0x04,0x20,0x84,0x32,0x46,0x12,0x33,0x84,0x6d,0xd8,0x0c,0xa0,0x52,0x5c,0x0c,0x6f,0xb6,0x25,0x3d,0x09,0x1e,0x3a,0x5f,0x4f,0xc9,0x31,0x6d,0x80,0x0a,0x8d,0xe6,0x05,0xcc,0xef,0x47,0x9d,
+ 0x04,0x20,0x86,0x6f,0xd2,0xe9,0x06,0xd4,0x55,0xa9,0x4a,0x21,0x73,0xf3,0xac,0xad,0x69,0x87,0x58,0xa2,0x1f,0x68,0xc9,0xcf,0x7d,0xcf,0x62,0x23,0xe4,0x4e,0xc1,0xa7,0xab,0xdd,0x47,0x9d,
+ 0x04,0x20,0x8e,0x82,0x32,0xa8,0x47,0x4e,0xb3,0xe6,0xc4,0x3d,0xf0,0x17,0x40,0xe5,0x81,0xe4,0xed,0x91,0xb4,0x42,0x50,0x45,0x79,0x55,0x52,0xca,0x45,0xe6,0x45,0x0d,0x40,0x40,0x47,0x9d,
+ 0x04,0x20,0x89,0x51,0xa3,0x8d,0xe9,0x39,0xd4,0xd0,0x2d,0x73,0x0d,0x87,0x5c,0x50,0xf2,0x51,0xfb,0x84,0xcb,0xde,0x8c,0x32,0xfc,0x79,0x64,0xc7,0xef,0x3a,0x71,0x55,0x09,0x1c,0x47,0x9d,
+ 0x04,0x20,0x8c,0x41,0xf8,0x7e,0xfb,0x25,0x05,0xb7,0x67,0x04,0x02,0xd1,0x5d,0xce,0x58,0xb4,0x73,0xbe,0x2f,0x9e,0xf1,0x41,0x77,0x1d,0x93,0x9d,0xa6,0x5e,0x8e,0x72,0xfe,0xd9,0x47,0x9d,
+ 0x04,0x20,0x91,0x74,0x55,0x47,0xc7,0x31,0x49,0x92,0x16,0xe0,0x81,0x61,0x06,0xf6,0x24,0x69,0xa2,0xb5,0x56,0xd8,0x9c,0x72,0x47,0xc8,0x15,0xb3,0xa6,0x43,0xbf,0x4b,0x55,0x69,0x47,0x9d,
+ 0x04,0x20,0x91,0xde,0x7d,0x52,0x02,0xa8,0x49,0xa3,0x8b,0x5d,0x86,0xd6,0xdf,0xee,0x12,0x11,0xc9,0xd1,0x8e,0x01,0xe5,0x3b,0x35,0x30,0xd0,0xaf,0xf6,0x04,0x0a,0x2c,0x62,0x94,0x47,0x9d,
+ 0x04,0x20,0x92,0xde,0x83,0x33,0xa4,0x7f,0x32,0x06,0xec,0x1e,0xe8,0x70,0x16,0x93,0xdf,0x79,0xd2,0x8c,0x12,0x41,0xa2,0xbb,0x2d,0x85,0xc3,0x21,0x68,0x76,0xdf,0x42,0x28,0xe6,0x47,0x9d,
+ 0x04,0x20,0x95,0xd9,0xe5,0x5a,0x23,0x7f,0x8b,0xa3,0x18,0x0e,0xc9,0xe2,0xbe,0x7e,0xf4,0xc6,0xc9,0x2d,0xc8,0xcc,0xda,0x2a,0xf7,0xb0,0xfc,0xbb,0x36,0x72,0xb0,0x93,0xad,0x83,0x47,0x9d,
+ 0x04,0x20,0x9e,0xf3,0xf9,0x48,0x49,0x18,0x5b,0x2c,0x0d,0xc7,0xb8,0xa5,0xd6,0xb1,0xd7,0x2a,0x37,0xd7,0xfb,0x35,0xe2,0x6b,0xd4,0xc9,0x73,0x92,0xf8,0x30,0x4f,0x33,0x51,0x0b,0x47,0x9d,
+ 0x04,0x20,0x98,0xda,0x29,0xab,0x8b,0xbf,0xd2,0xd5,0x2d,0xc9,0x44,0x86,0x2c,0xbf,0xc7,0xe0,0x78,0x44,0xce,0x84,0x9e,0x0f,0xd1,0x04,0x8c,0xcb,0x04,0xd7,0x7e,0xb5,0x77,0xec,0x47,0x9d,
+ 0x04,0x20,0x9c,0x6e,0xea,0x54,0xc2,0xb4,0x45,0xb8,0xa8,0x96,0x7e,0x6a,0xab,0x84,0xb5,0x7a,0xe6,0x5b,0x30,0xcb,0xdf,0xec,0xe4,0x51,0x29,0xe5,0x5b,0xed,0xe6,0xc7,0xaa,0xb9,0x47,0x9d,
+ 0x04,0x20,0x9e,0x1d,0xe4,0xd6,0x09,0x3e,0xf9,0x1d,0x07,0xe8,0xe7,0xff,0x75,0x8a,0x36,0x9f,0xe3,0x0d,0x16,0xd4,0xb3,0xc1,0x7e,0xcb,0x6d,0xb6,0xe6,0x50,0xce,0xc1,0x75,0xfe,0x47,0x9d,
+ 0x04,0x20,0xa6,0xf2,0xd2,0xdc,0xfe,0xc2,0x6a,0x25,0xd3,0x6b,0xf7,0x3d,0x9c,0xb0,0xc2,0x5c,0x14,0xc6,0x46,0x31,0xb4,0xc3,0xda,0x46,0x71,0xe5,0x87,0xe9,0x54,0xf1,0x38,0xcd,0x47,0x9d,
+ 0x04,0x20,0xa0,0xb5,0xd9,0xf5,0x83,0x63,0x5f,0x76,0xf7,0x50,0x40,0x76,0x27,0xcb,0x90,0xc0,0xb8,0x63,0x85,0xb3,0x44,0xc9,0x3c,0xa0,0x1a,0xaa,0xa0,0x00,0x59,0x15,0xc4,0x32,0x47,0x9d,
+ 0x04,0x20,0xa0,0xfb,0xd3,0x12,0xa7,0xc9,0xce,0x24,0xc8,0x06,0x39,0x73,0x08,0x7e,0xd8,0xb5,0xd9,0x6f,0xb7,0xd2,0xc1,0xed,0x21,0xcb,0x54,0xb7,0x13,0xf7,0x27,0x4e,0x3f,0x73,0x47,0x9d,
+ 0x04,0x20,0xa1,0x31,0x85,0x31,0xb8,0x82,0xb4,0x16,0xb0,0x26,0xab,0x21,0x10,0xf1,0x25,0x0a,0x6a,0xf3,0x10,0x96,0xf0,0xa9,0x0e,0x18,0x10,0x27,0xeb,0xa7,0x23,0x17,0x05,0x02,0x47,0x9d,
+ 0x04,0x20,0xa5,0xbe,0x82,0xfa,0xd8,0x0b,0xf3,0x9b,0x44,0x16,0x7f,0xa2,0x39,0xa8,0x51,0x43,0xe7,0xfa,0xb2,0x8e,0xe0,0x5f,0x35,0x9b,0x83,0x23,0x7f,0x3d,0x3b,0xfb,0xda,0x78,0x47,0x9d,
+ 0x04,0x20,0xa8,0xa6,0xbb,0x02,0x06,0x65,0x3b,0xb2,0x52,0x79,0xd1,0xc9,0x6a,0x01,0x42,0x43,0xca,0x69,0xe1,0x69,0x90,0xfe,0x2c,0xd2,0x7c,0x18,0xfd,0xab,0xc7,0x71,0x7f,0x8b,0x47,0x9d,
+ 0x04,0x20,0xac,0x1a,0xa1,0xb1,0xec,0x20,0x85,0xd5,0x39,0xa3,0x4e,0xf4,0x9b,0x04,0x8c,0x64,0x68,0x76,0x0f,0xa6,0x53,0x0a,0xd3,0x2a,0x42,0x24,0xd0,0x1c,0xbb,0x31,0xc3,0xf8,0x47,0x9d,
+ 0x04,0x20,0xb6,0x9a,0xd9,0x25,0xfb,0x77,0x5a,0x33,0xf2,0x24,0x74,0x6d,0x2a,0x0d,0x8a,0x4d,0x71,0xb0,0xba,0x9d,0x34,0xfe,0x56,0x52,0x55,0x7e,0xda,0x4d,0x15,0xc9,0x36,0x1e,0x47,0x9d,
+ 0x04,0x20,0xb3,0x6e,0x64,0x99,0x26,0x7a,0xeb,0xd4,0x53,0x8c,0x94,0xb1,0x4a,0x37,0x02,0xaa,0xa9,0xc8,0x36,0x11,0xec,0xf9,0x0f,0x08,0xa3,0x9f,0x3e,0xaf,0xd2,0xd1,0x2a,0x0b,0x47,0x9d,
+ 0x04,0x20,0xb3,0xa9,0xf9,0xa6,0xb4,0x83,0x20,0xbd,0x7d,0x90,0x65,0xc3,0x39,0x46,0x23,0xbb,0x78,0x38,0x06,0x68,0xda,0x42,0xf6,0xa9,0x6a,0x8d,0x20,0x98,0xe6,0x73,0xc6,0x92,0x47,0x9d,
+ 0x04,0x20,0xb3,0xe4,0x03,0xa4,0x24,0x4d,0xc8,0x77,0xe7,0xff,0xd2,0xb3,0x77,0x35,0x3f,0xff,0xde,0x44,0xb9,0x7a,0x02,0x84,0x81,0x0e,0x90,0x75,0x75,0x1f,0xaa,0x6c,0xd0,0x7c,0x47,0x9d,
+ 0x04,0x20,0xb5,0x11,0xd6,0x6b,0x1d,0x0f,0xc4,0xc9,0x6f,0xc0,0x47,0xa4,0x7c,0xe2,0x12,0x37,0xa1,0x32,0x11,0x36,0x65,0xe4,0x5d,0x79,0xb8,0x64,0xbd,0x51,0x61,0x57,0x0d,0x58,0x47,0x9d,
+ 0x04,0x20,0xb5,0x49,0xeb,0x2a,0x44,0x14,0x3c,0x42,0x53,0xda,0x79,0xd4,0xa8,0xa5,0xdd,0xae,0x07,0x12,0x11,0xa0,0xce,0x5f,0xd1,0x78,0xd3,0x9c,0xdd,0xdc,0x36,0x98,0x82,0x49,0x47,0x9d,
+ 0x04,0x20,0xbf,0x2d,0x5b,0xc1,0xd3,0x04,0x52,0xd4,0x23,0xd4,0x27,0x26,0x5a,0xc2,0x7d,0x8d,0xd6,0x2d,0x7d,0xfa,0x17,0x50,0xc5,0x21,0xf2,0xa6,0xbe,0xe7,0xc4,0xb7,0x94,0xd8,0x47,0x9d,
+ 0x04,0x20,0xb8,0x0a,0x2c,0x1f,0xcc,0xbd,0x88,0x1a,0x8a,0x46,0xb7,0x2c,0x20,0xd2,0xdf,0x6f,0x2b,0xfa,0x86,0x07,0x16,0x5a,0x7b,0x40,0x4f,0x80,0xa9,0xe1,0xda,0xda,0x62,0x69,0x47,0x9d,
+ 0x04,0x20,0xbb,0x32,0x43,0x18,0xd9,0xe2,0x98,0x96,0x61,0x0f,0xd0,0xdc,0x6a,0x9d,0x3b,0x06,0x99,0xb9,0x71,0x8a,0x43,0x06,0x91,0xc1,0x56,0x82,0xfa,0xdd,0x8a,0x30,0x24,0xc6,0x47,0x9d,
+ 0x04,0x20,0xbc,0x79,0x56,0x7a,0x37,0x72,0xe5,0x94,0xdb,0xec,0xfe,0xd8,0x84,0x6f,0xaf,0x7b,0x71,0x3f,0x82,0x0f,0xfd,0xbb,0xbc,0x60,0xdf,0x93,0x04,0xf0,0xbb,0x4c,0x36,0xca,0x47,0x9d,
+ 0x04,0x20,0xbc,0x7c,0x30,0x32,0x54,0x79,0x86,0x3b,0x5b,0x28,0x45,0xc0,0x40,0x38,0xc9,0xf7,0xce,0xd4,0x8d,0xe9,0x99,0x31,0xd0,0x89,0xa7,0x97,0x70,0x37,0xbe,0x8b,0xe5,0xba,0x47,0x9d,
0x04,0x20,0xbd,0x0e,0xc8,0x73,0x43,0xa7,0xc6,0x25,0x15,0xcf,0x3e,0x23,0xa8,0xb0,0xbf,0xe8,0x20,0xa7,0xec,0x2a,0xf6,0x37,0x6c,0x60,0x5e,0x4d,0xed,0xf4,0xb1,0xef,0xf7,0xb2,0x47,0x9d,
- 0x04,0x20,0xc8,0x88,0xfe,0x71,0x5f,0xa3,0x6c,0x96,0x6a,0xd7,0x9e,0x38,0x84,0x9f,0x44,0xe1,0x6b,0xdc,0x98,0x31,0xad,0x96,0x29,0xe7,0x00,0x83,0x63,0x03,0xae,0x69,0x2e,0x63,0x47,0x9d,
+ 0x04,0x20,0xc7,0x09,0x41,0xf9,0x00,0x08,0x1d,0xcf,0x7b,0xd5,0x14,0x37,0x01,0x1f,0xca,0xa9,0xbc,0xb3,0x76,0x1d,0x38,0x33,0x92,0x4d,0x5c,0x4b,0x6d,0x1f,0x54,0x43,0xc2,0x47,0x47,0x9d,
+ 0x04,0x20,0xc7,0x4f,0xee,0xe9,0x39,0xf4,0x8c,0xc0,0xf0,0x2a,0x11,0x5a,0x5b,0xb5,0x3a,0xe1,0x9a,0x2c,0xc0,0xbf,0x59,0xc7,0xd5,0xc0,0x35,0x19,0xcb,0xd6,0x3d,0x6b,0xe1,0xb0,0x47,0x9d,
+ 0x04,0x20,0xc0,0x3d,0x2f,0xba,0xbf,0x66,0x11,0x7c,0xee,0x0b,0xd6,0xe9,0xce,0x9e,0x78,0xfb,0x1d,0x77,0x6e,0x3c,0x1e,0xbd,0x00,0x21,0xb6,0xef,0x73,0xee,0xfa,0xb3,0x05,0x3d,0x47,0x9d,
+ 0x04,0x20,0xc0,0xc1,0xf5,0x59,0xe8,0x46,0xf6,0x9d,0x41,0xf0,0xde,0x8b,0x32,0xf9,0x6f,0xd6,0xb2,0xd5,0x36,0x56,0x43,0xd3,0x60,0x08,0x55,0x94,0x13,0xf5,0xef,0x7f,0x4d,0x4a,0x47,0x9d,
+ 0x04,0x20,0xc2,0x80,0xa6,0xc3,0x7d,0xb3,0x6c,0x17,0x05,0xfc,0x39,0xa5,0x71,0x8f,0x75,0x27,0x7f,0xd0,0xc8,0xab,0x94,0xfd,0x77,0xbd,0xdd,0x0f,0x2c,0x2e,0x70,0xaf,0xdd,0xdf,0x47,0x9d,
+ 0x04,0x20,0xc4,0x16,0xad,0xb9,0xd7,0x4b,0xd2,0x3f,0x53,0xe1,0xe2,0x80,0x12,0x6c,0xc8,0x18,0x96,0x5d,0x77,0x14,0x80,0x44,0xf0,0xaa,0xcd,0x20,0xd8,0xb4,0xc5,0x97,0x66,0xe4,0x47,0x9d,
+ 0x04,0x20,0xc8,0xa4,0xdd,0xa7,0xc0,0x95,0x9b,0x12,0xf7,0xd7,0x4e,0x9b,0xd4,0xb7,0x93,0x5d,0x99,0x87,0x43,0x81,0x23,0x52,0xde,0xd1,0x22,0x36,0x79,0xe1,0x3b,0x58,0xec,0xd9,0x47,0x9d,
+ 0x04,0x20,0xc9,0x0a,0xd6,0x83,0x40,0xd9,0x81,0xc2,0x67,0x4d,0xa4,0xeb,0x87,0xb0,0x1f,0x66,0x37,0xd7,0xc6,0xdb,0xc0,0x90,0xd0,0xc2,0xd5,0x07,0xeb,0xc7,0x97,0x60,0xa4,0x60,0x47,0x9d,
+ 0x04,0x20,0xc9,0x2a,0x5e,0xe6,0xcc,0x54,0x34,0xca,0xda,0x96,0xc1,0x41,0x58,0x7b,0x47,0x48,0x1e,0xa1,0x0c,0xb2,0x59,0x2c,0x8c,0x23,0xec,0x5c,0x43,0x7f,0xd7,0x28,0x1c,0xd0,0x47,0x9d,
+ 0x04,0x20,0xc9,0xd0,0x9a,0x69,0xc1,0xba,0x0b,0x07,0xa4,0x22,0x67,0xaf,0x35,0x99,0x23,0x0b,0x8b,0xf4,0x9d,0xc2,0x9d,0x6d,0xbb,0xf7,0xf5,0x3a,0x0b,0x39,0x4c,0x3d,0x3a,0x36,0x47,0x9d,
+ 0x04,0x20,0xca,0x11,0xb7,0xed,0xeb,0x7c,0x27,0xbe,0x5e,0xe3,0xe3,0x23,0xf7,0x16,0xb5,0x45,0xda,0x87,0xcf,0xe8,0x53,0x8e,0x6a,0xa3,0x66,0x9a,0x56,0xdc,0xb8,0xa9,0x4e,0xfe,0x47,0x9d,
+ 0x04,0x20,0xca,0xa0,0x31,0xe6,0x88,0xeb,0xd5,0x18,0x55,0x29,0xd6,0x6d,0x22,0xf5,0x4b,0x6f,0xe5,0x35,0x85,0x96,0xeb,0xd8,0xdf,0x52,0x7c,0xf1,0x5c,0x1a,0xe7,0x15,0xd4,0x9b,0x47,0x9d,
+ 0x04,0x20,0xcb,0x2a,0x8c,0xe7,0xe5,0x1f,0x4e,0x3a,0x13,0xd6,0x9e,0xd7,0x68,0x51,0x83,0xf4,0x2d,0x3e,0x21,0x38,0x63,0x18,0xe9,0x97,0x27,0xff,0x45,0x48,0xc3,0x6c,0xca,0x59,0x47,0x9d,
+ 0x04,0x20,0xcb,0x2e,0xb8,0xe5,0xd7,0x37,0x0a,0xc9,0x3b,0xcb,0xd5,0xe9,0x0e,0xcc,0x77,0x62,0xf0,0x05,0x0e,0x04,0x5a,0xf3,0x44,0x9f,0x60,0xd6,0xd1,0x4c,0x9b,0x99,0x58,0x26,0x47,0x9d,
+ 0x04,0x20,0xcd,0x7a,0x43,0x28,0xac,0x1b,0xe8,0xd3,0x8d,0x9b,0xb1,0xc6,0x0b,0x9b,0x2f,0x40,0x1e,0x15,0x12,0x25,0x80,0xf5,0xc4,0xd2,0x1e,0xe7,0xce,0xcc,0x9c,0x82,0xfc,0x3f,0x47,0x9d,
};
static const uint8_t chainparams_seed_testnet4[] = {
- 0x01,0x04,0x39,0x80,0xb0,0xa3,0xbc,0xcd,
- 0x01,0x04,0x33,0x9e,0xf8,0x08,0xbc,0xcd,
- 0x01,0x04,0x5f,0xd9,0x49,0xa2,0xbc,0xcd,
0x01,0x04,0x12,0xbd,0x9c,0x66,0xbc,0xcd,
- 0x01,0x04,0x67,0x63,0xab,0xd4,0xbc,0xcd,
+ 0x01,0x04,0x12,0xc9,0xcf,0x37,0xbc,0xcd,
+ 0x01,0x04,0x33,0x9e,0xf8,0x08,0xbc,0xcd,
+ 0x01,0x04,0x39,0x80,0xb0,0xa3,0xbc,0xcd,
0x01,0x04,0x52,0x43,0x66,0x0f,0xbc,0xcd,
0x01,0x04,0x58,0x63,0xf8,0x32,0xbc,0xcd,
+ 0x01,0x04,0x5f,0xd9,0x49,0xa2,0xbc,0xcd,
+ 0x01,0x04,0x67,0x63,0xab,0xd4,0xbc,0xcd,
0x01,0x04,0x67,0xa5,0xc0,0xd2,0xbc,0xcd,
- 0x01,0x04,0x12,0xc9,0xcf,0x37,0xbc,0xcd,
};
#endif // BITCOIN_CHAINPARAMSSEEDS_H
diff --git a/src/clientversion.cpp b/src/clientversion.cpp
index e52703c8bf..017366543d 100644
--- a/src/clientversion.cpp
+++ b/src/clientversion.cpp
@@ -25,7 +25,7 @@ const std::string CLIENT_NAME("Satoshi");
#ifdef HAVE_BUILD_INFO
#include <obj/build.h>
-// The <obj/build.h>, which is generated by the build environment (share/genbuild.sh),
+// The <obj/build.h>, which is generated by the build environment (cmake/script/GenerateBuildInfo.cmake),
// could contain only one line of the following:
// - "#define BUILD_GIT_TAG ...", if the top commit is tagged
// - "#define BUILD_GIT_COMMIT ...", if the top commit is not tagged
diff --git a/src/cluster_linearize.h b/src/cluster_linearize.h
index 607ae681d2..e964849f22 100644
--- a/src/cluster_linearize.h
+++ b/src/cluster_linearize.h
@@ -118,6 +118,28 @@ public:
}
}
+ /** Construct a DepGraph object given another DepGraph and a mapping from old to new.
+ *
+ * Complexity: O(N^2) where N=depgraph.TxCount().
+ */
+ DepGraph(const DepGraph<SetType>& depgraph, Span<const ClusterIndex> mapping) noexcept : entries(depgraph.TxCount())
+ {
+ Assert(mapping.size() == depgraph.TxCount());
+ // Fill in fee, size, ancestors.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ const auto& input = depgraph.entries[i];
+ auto& output = entries[mapping[i]];
+ output.feerate = input.feerate;
+ for (auto j : input.ancestors) output.ancestors.Set(mapping[j]);
+ }
+ // Fill in descendant information.
+ for (ClusterIndex i = 0; i < entries.size(); ++i) {
+ for (auto j : entries[i].ancestors) {
+ entries[j].descendants.Set(i);
+ }
+ }
+ }
+
/** Get the number of transactions in the graph. Complexity: O(1). */
auto TxCount() const noexcept { return entries.size(); }
/** Get the feerate of a given transaction i. Complexity: O(1). */
@@ -257,6 +279,14 @@ struct SetInfo
explicit SetInfo(const DepGraph<SetType>& depgraph, const SetType& txn) noexcept :
transactions(txn), feerate(depgraph.FeeRate(txn)) {}
+ /** Add a transaction to this SetInfo (which must not yet be in it). */
+ void Set(const DepGraph<SetType>& depgraph, ClusterIndex pos) noexcept
+ {
+ Assume(!transactions[pos]);
+ transactions.Set(pos);
+ feerate += depgraph.FeeRate(pos);
+ }
+
/** Add the transactions of other to this SetInfo (no overlap allowed). */
SetInfo& operator|=(const SetInfo& other) noexcept
{
@@ -506,6 +536,12 @@ public:
return m_todo.None();
}
+ /** Count the number of remaining unlinearized transactions. */
+ ClusterIndex NumRemaining() const noexcept
+ {
+ return m_todo.Count();
+ }
+
/** Find the best (highest-feerate, smallest among those in case of a tie) ancestor set
* among the remaining transactions. Requires !AllDone().
*
@@ -541,23 +577,60 @@ class SearchCandidateFinder
{
/** Internal RNG. */
InsecureRandomContext m_rng;
- /** Internal dependency graph for the cluster. */
- const DepGraph<SetType>& m_depgraph;
- /** Which transactions are left to do (sorted indices). */
+ /** m_sorted_to_original[i] is the original position that sorted transaction position i had. */
+ std::vector<ClusterIndex> m_sorted_to_original;
+ /** m_original_to_sorted[i] is the sorted position original transaction position i has. */
+ std::vector<ClusterIndex> m_original_to_sorted;
+ /** Internal dependency graph for the cluster (with transactions in decreasing individual
+ * feerate order). */
+ DepGraph<SetType> m_sorted_depgraph;
+ /** Which transactions are left to do (indices in m_sorted_depgraph's order). */
SetType m_todo;
+ /** Given a set of transactions with sorted indices, get their original indices. */
+ SetType SortedToOriginal(const SetType& arg) const noexcept
+ {
+ SetType ret;
+ for (auto pos : arg) ret.Set(m_sorted_to_original[pos]);
+ return ret;
+ }
+
+ /** Given a set of transactions with original indices, get their sorted indices. */
+ SetType OriginalToSorted(const SetType& arg) const noexcept
+ {
+ SetType ret;
+ for (auto pos : arg) ret.Set(m_original_to_sorted[pos]);
+ return ret;
+ }
+
public:
/** Construct a candidate finder for a graph.
*
* @param[in] depgraph Dependency graph for the to-be-linearized cluster.
* @param[in] rng_seed A random seed to control the search order.
*
- * Complexity: O(1).
+ * Complexity: O(N^2) where N=depgraph.Count().
*/
- SearchCandidateFinder(const DepGraph<SetType>& depgraph LIFETIMEBOUND, uint64_t rng_seed) noexcept :
+ SearchCandidateFinder(const DepGraph<SetType>& depgraph, uint64_t rng_seed) noexcept :
m_rng(rng_seed),
- m_depgraph(depgraph),
- m_todo(SetType::Fill(depgraph.TxCount())) {}
+ m_sorted_to_original(depgraph.TxCount()),
+ m_original_to_sorted(depgraph.TxCount()),
+ m_todo(SetType::Fill(depgraph.TxCount()))
+ {
+ // Determine reordering mapping, by sorting by decreasing feerate.
+ std::iota(m_sorted_to_original.begin(), m_sorted_to_original.end(), ClusterIndex{0});
+ std::sort(m_sorted_to_original.begin(), m_sorted_to_original.end(), [&](auto a, auto b) {
+ auto feerate_cmp = depgraph.FeeRate(a) <=> depgraph.FeeRate(b);
+ if (feerate_cmp == 0) return a < b;
+ return feerate_cmp > 0;
+ });
+ // Compute reverse mapping.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ m_original_to_sorted[m_sorted_to_original[i]] = i;
+ }
+ // Compute reordered dependency graph.
+ m_sorted_depgraph = DepGraph(depgraph, m_original_to_sorted);
+ }
/** Check whether any unlinearized transactions remain. */
bool AllDone() const noexcept
@@ -580,12 +653,15 @@ public:
* be <= max_iterations. If strictly < max_iterations, the
* returned subset is optimal.
*
- * Complexity: O(N * min(max_iterations, 2^N)) where N=depgraph.TxCount().
+ * Complexity: possibly O(N * min(max_iterations, sqrt(2^N))) where N=depgraph.TxCount().
*/
std::pair<SetInfo<SetType>, uint64_t> FindCandidateSet(uint64_t max_iterations, SetInfo<SetType> best) noexcept
{
Assume(!AllDone());
+ // Convert the provided best to internal sorted indices.
+ best.transactions = OriginalToSorted(best.transactions);
+
/** Type for work queue items. */
struct WorkItem
{
@@ -596,16 +672,27 @@ public:
/** Set of undecided transactions. This must be a subset of m_todo, and have no overlap
* with inc. The set (inc | und) must be topologically valid. */
SetType und;
+ /** (Only when inc is not empty) The best feerate of any superset of inc that is also a
+ * subset of (inc | und), without requiring it to be topologically valid. It forms a
+ * conservative upper bound on how good a set this work item can give rise to.
+ * Transactions whose feerate is below best's are ignored when determining this value,
+ * which means it may technically be an underestimate, but if so, this work item
+ * cannot result in something that beats best anyway. */
+ FeeFrac pot_feerate;
/** Construct a new work item. */
- WorkItem(SetInfo<SetType>&& i, SetType&& u) noexcept :
- inc(std::move(i)), und(std::move(u)) {}
+ WorkItem(SetInfo<SetType>&& i, SetType&& u, FeeFrac&& p_f) noexcept :
+ inc(std::move(i)), und(std::move(u)), pot_feerate(std::move(p_f))
+ {
+ Assume(pot_feerate.IsEmpty() == inc.feerate.IsEmpty());
+ }
/** Swap two WorkItems. */
void Swap(WorkItem& other) noexcept
{
swap(inc, other.inc);
swap(und, other.und);
+ swap(pot_feerate, other.pot_feerate);
}
};
@@ -613,39 +700,111 @@ public:
VecDeque<WorkItem> queue;
queue.reserve(std::max<size_t>(256, 2 * m_todo.Count()));
- // Create an initial entry with m_todo as undecided. Also use it as best if not provided,
- // so that during the work processing loop below, and during the add_fn/split_fn calls, we
- // do not need to deal with the best=empty case.
- if (best.feerate.IsEmpty()) best = SetInfo(m_depgraph, m_todo);
- queue.emplace_back(SetInfo<SetType>{}, SetType{m_todo});
+ // Create initial entries per connected component of m_todo. While clusters themselves are
+ // generally connected, this is not necessarily true after some parts have already been
+ // removed from m_todo. Without this, effort can be wasted on searching "inc" sets that
+ // span multiple components.
+ auto to_cover = m_todo;
+ do {
+ auto component = m_sorted_depgraph.FindConnectedComponent(to_cover);
+ to_cover -= component;
+ // If best is not provided, set it to the first component, so that during the work
+ // processing loop below, and during the add_fn/split_fn calls, we do not need to deal
+ // with the best=empty case.
+ if (best.feerate.IsEmpty()) best = SetInfo(m_sorted_depgraph, component);
+ queue.emplace_back(/*inc=*/SetInfo<SetType>{},
+ /*und=*/std::move(component),
+ /*pot_feerate=*/FeeFrac{});
+ } while (to_cover.Any());
/** Local copy of the iteration limit. */
uint64_t iterations_left = max_iterations;
+ /** The set of transactions in m_todo which have feerate > best's. */
+ SetType imp = m_todo;
+ while (imp.Any()) {
+ ClusterIndex check = imp.Last();
+ if (m_sorted_depgraph.FeeRate(check) >> best.feerate) break;
+ imp.Reset(check);
+ }
+
/** Internal function to add an item to the queue of elements to explore if there are any
- * transactions left to split on, and to update best.
+ * transactions left to split on, possibly improving it before doing so, and to update
+ * best/imp.
*
* - inc: the "inc" value for the new work item (must be topological).
* - und: the "und" value for the new work item ((inc | und) must be topological).
*/
auto add_fn = [&](SetInfo<SetType> inc, SetType und) noexcept {
+ /** SetInfo object with the set whose feerate will become the new work item's
+ * pot_feerate. It starts off equal to inc. */
+ auto pot = inc;
if (!inc.feerate.IsEmpty()) {
+ // Add entries to pot. We iterate over all undecided transactions whose feerate is
+ // higher than best. While undecided transactions of lower feerate may improve pot,
+ // the resulting pot feerate cannot possibly exceed best's (and this item will be
+ // skipped in split_fn anyway).
+ for (auto pos : imp & und) {
+ // Determine if adding transaction pos to pot (ignoring topology) would improve
+ // it. If not, we're done updating pot. This relies on the fact that
+ // m_sorted_depgraph, and thus the transactions iterated over, are in decreasing
+ // individual feerate order.
+ if (!(m_sorted_depgraph.FeeRate(pos) >> pot.feerate)) break;
+ pot.Set(m_sorted_depgraph, pos);
+ }
+
+ // The "jump ahead" optimization: whenever pot has a topologically-valid subset,
+ // that subset can be added to inc. Any subset of (pot - inc) has the property that
+ // its feerate exceeds that of any set compatible with this work item (superset of
+ // inc, subset of (inc | und)). Thus, if T is a topological subset of pot, and B is
+ // the best topologically-valid set compatible with this work item, and (T - B) is
+ // non-empty, then (T | B) is better than B and also topological. This is in
+ // contradiction with the assumption that B is best. Thus, (T - B) must be empty,
+ // or T must be a subset of B.
+ //
+ // See https://delvingbitcoin.org/t/how-to-linearize-your-cluster/303 section 2.4.
+ const auto init_inc = inc.transactions;
+ for (auto pos : pot.transactions - inc.transactions) {
+ // If the transaction's ancestors are a subset of pot, we can add it together
+ // with its ancestors to inc. Just update the transactions here; the feerate
+ // update happens below.
+ auto anc_todo = m_sorted_depgraph.Ancestors(pos) & m_todo;
+ if (anc_todo.IsSubsetOf(pot.transactions)) inc.transactions |= anc_todo;
+ }
+ // Finally update und and inc's feerate to account for the added transactions.
+ und -= inc.transactions;
+ inc.feerate += m_sorted_depgraph.FeeRate(inc.transactions - init_inc);
+
// If inc's feerate is better than best's, remember it as our new best.
if (inc.feerate > best.feerate) {
best = inc;
+ // See if we can remove any entries from imp now.
+ while (imp.Any()) {
+ ClusterIndex check = imp.Last();
+ if (m_sorted_depgraph.FeeRate(check) >> best.feerate) break;
+ imp.Reset(check);
+ }
}
+
+ // If no potential transactions exist beyond the already included ones, no
+ // improvement is possible anymore.
+ if (pot.feerate.size == inc.feerate.size) return;
+ // At this point und must be non-empty. If it were empty then pot would equal inc.
+ Assume(und.Any());
} else {
Assume(inc.transactions.None());
+ // If inc is empty, we just make sure there are undecided transactions left to
+ // split on.
+ if (und.None()) return;
}
- // Make sure there are undecided transactions left to split on.
- if (und.None()) return;
-
// Actually construct a new work item on the queue. Due to the switch to DFS when queue
// space runs out (see below), we know that no reallocation of the queue should ever
// occur.
Assume(queue.size() < queue.capacity());
- queue.emplace_back(std::move(inc), std::move(und));
+ queue.emplace_back(/*inc=*/std::move(inc),
+ /*und=*/std::move(und),
+ /*pot_feerate=*/std::move(pot.feerate));
};
/** Internal process function. It takes an existing work item, and splits it in two: one
@@ -659,18 +818,66 @@ public:
Assume(elem.inc.transactions.IsSubsetOf(m_todo) && elem.und.IsSubsetOf(m_todo));
// Included transactions cannot be undecided.
Assume(!elem.inc.transactions.Overlaps(elem.und));
+ // If pot is empty, then so is inc.
+ Assume(elem.inc.feerate.IsEmpty() == elem.pot_feerate.IsEmpty());
+
+ const ClusterIndex first = elem.und.First();
+ if (!elem.inc.feerate.IsEmpty()) {
+ // If no undecided transactions remain with feerate higher than best, this entry
+ // cannot be improved beyond best.
+ if (!elem.und.Overlaps(imp)) return;
+ // We can ignore any queue item whose potential feerate isn't better than the best
+ // seen so far.
+ if (elem.pot_feerate <= best.feerate) return;
+ } else {
+ // In case inc is empty use a simpler alternative check.
+ if (m_sorted_depgraph.FeeRate(first) <= best.feerate) return;
+ }
- // Pick the first undecided transaction as the one to split on.
- const ClusterIndex split = elem.und.First();
+ // Decide which transaction to split on. Splitting is how new work items are added, and
+ // how progress is made. One split transaction is chosen among the queue item's
+ // undecided ones, and:
+ // - A work item is (potentially) added with that transaction plus its remaining
+ // descendants excluded (removed from the und set).
+ // - A work item is (potentially) added with that transaction plus its remaining
+ // ancestors included (added to the inc set).
+ //
+ // To decide what to split on, consider the undecided ancestors of the highest
+ // individual feerate undecided transaction. Pick the one which reduces the search space
+ // most. Let I(t) be the size of the undecided set after including t, and E(t) the size
+ // of the undecided set after excluding t. Then choose the split transaction t such
+ // that 2^I(t) + 2^E(t) is minimal, tie-breaking by highest individual feerate for t.
+ ClusterIndex split = 0;
+ const auto select = elem.und & m_sorted_depgraph.Ancestors(first);
+ Assume(select.Any());
+ std::optional<std::pair<ClusterIndex, ClusterIndex>> split_counts;
+ for (auto t : select) {
+ // Call max = max(I(t), E(t)) and min = min(I(t), E(t)). Let counts = {max,min}.
+ // Sorting by the tuple counts is equivalent to sorting by 2^I(t) + 2^E(t). This
+ // expression is equal to 2^max + 2^min = 2^max * (1 + 1/2^(max - min)). The second
+ // factor (1 + 1/2^(max - min)) there is in (1,2]. Thus increasing max will always
+ // increase it, even when min decreases. Because of this, we can first sort by max.
+ std::pair<ClusterIndex, ClusterIndex> counts{
+ (elem.und - m_sorted_depgraph.Ancestors(t)).Count(),
+ (elem.und - m_sorted_depgraph.Descendants(t)).Count()};
+ if (counts.first < counts.second) std::swap(counts.first, counts.second);
+ // Remember the t with the lowest counts.
+ if (!split_counts.has_value() || counts < *split_counts) {
+ split = t;
+ split_counts = counts;
+ }
+ }
+ // Since there was at least one transaction in select, we must always find one.
+ Assume(split_counts.has_value());
// Add a work item corresponding to exclusion of the split transaction.
- const auto& desc = m_depgraph.Descendants(split);
+ const auto& desc = m_sorted_depgraph.Descendants(split);
add_fn(/*inc=*/elem.inc,
/*und=*/elem.und - desc);
// Add a work item corresponding to inclusion of the split transaction.
- const auto anc = m_depgraph.Ancestors(split) & m_todo;
- add_fn(/*inc=*/elem.inc.Add(m_depgraph, anc),
+ const auto anc = m_sorted_depgraph.Ancestors(split) & m_todo;
+ add_fn(/*inc=*/elem.inc.Add(m_sorted_depgraph, anc),
/*und=*/elem.und - anc);
// Account for the performed split.
@@ -713,7 +920,9 @@ public:
split_fn(std::move(elem));
}
- // Return the found best set and the number of iterations performed.
+ // Return the found best set (converted to the original transaction indices), and the
+ // number of iterations performed.
+ best.transactions = SortedToOriginal(best.transactions);
return {std::move(best), max_iterations - iterations_left};
}
@@ -723,9 +932,10 @@ public:
*/
void MarkDone(const SetType& done) noexcept
{
- Assume(done.Any());
- Assume(done.IsSubsetOf(m_todo));
- m_todo -= done;
+ const auto done_sorted = OriginalToSorted(done);
+ Assume(done_sorted.Any());
+ Assume(done_sorted.IsSubsetOf(m_todo));
+ m_todo -= done_sorted;
}
};
@@ -744,7 +954,7 @@ public:
* - A boolean indicating whether the result is guaranteed to be
* optimal.
*
- * Complexity: O(N * min(max_iterations + N, 2^N)) where N=depgraph.TxCount().
+ * Complexity: possibly O(N * min(max_iterations + N, sqrt(2^N))) where N=depgraph.TxCount().
*/
template<typename SetType>
std::pair<std::vector<ClusterIndex>, bool> Linearize(const DepGraph<SetType>& depgraph, uint64_t max_iterations, uint64_t rng_seed, Span<const ClusterIndex> old_linearization = {}) noexcept
@@ -756,10 +966,20 @@ std::pair<std::vector<ClusterIndex>, bool> Linearize(const DepGraph<SetType>& de
std::vector<ClusterIndex> linearization;
AncestorCandidateFinder anc_finder(depgraph);
- SearchCandidateFinder src_finder(depgraph, rng_seed);
+ std::optional<SearchCandidateFinder<SetType>> src_finder;
linearization.reserve(depgraph.TxCount());
bool optimal = true;
+ // Treat the initialization of SearchCandidateFinder as taking N^2/64 (rounded up) iterations
+ // (largely due to the cost of constructing the internal sorted-by-feerate DepGraph inside
+ // SearchCandidateFinder), a rough approximation based on benchmark. If we don't have that
+ // many, don't start it.
+ uint64_t start_iterations = (uint64_t{depgraph.TxCount()} * depgraph.TxCount() + 63) / 64;
+ if (iterations_left > start_iterations) {
+ iterations_left -= start_iterations;
+ src_finder.emplace(depgraph, rng_seed);
+ }
+
/** Chunking of what remains of the old linearization. */
LinearizationChunking old_chunking(depgraph, old_linearization);
@@ -772,12 +992,22 @@ std::pair<std::vector<ClusterIndex>, bool> Linearize(const DepGraph<SetType>& de
auto best = anc_finder.FindCandidateSet();
if (!best_prefix.feerate.IsEmpty() && best_prefix.feerate >= best.feerate) best = best_prefix;
- // Invoke bounded search to update best, with up to half of our remaining iterations as
- // limit.
- uint64_t max_iterations_now = (iterations_left + 1) / 2;
uint64_t iterations_done_now = 0;
- std::tie(best, iterations_done_now) = src_finder.FindCandidateSet(max_iterations_now, best);
- iterations_left -= iterations_done_now;
+ uint64_t max_iterations_now = 0;
+ if (src_finder) {
+ // Treat the invocation of SearchCandidateFinder::FindCandidateSet() as costing N/4
+ // up-front (rounded up) iterations (largely due to the cost of connected-component
+ // splitting), a rough approximation based on benchmarks.
+ uint64_t base_iterations = (anc_finder.NumRemaining() + 3) / 4;
+ if (iterations_left > base_iterations) {
+ // Invoke bounded search to update best, with up to half of our remaining
+ // iterations as limit.
+ iterations_left -= base_iterations;
+ max_iterations_now = (iterations_left + 1) / 2;
+ std::tie(best, iterations_done_now) = src_finder->FindCandidateSet(max_iterations_now, best);
+ iterations_left -= iterations_done_now;
+ }
+ }
if (iterations_done_now == max_iterations_now) {
optimal = false;
@@ -795,7 +1025,7 @@ std::pair<std::vector<ClusterIndex>, bool> Linearize(const DepGraph<SetType>& de
// Update state to reflect best is no longer to be linearized.
anc_finder.MarkDone(best.transactions);
if (anc_finder.AllDone()) break;
- src_finder.MarkDone(best.transactions);
+ if (src_finder) src_finder->MarkDone(best.transactions);
if (old_chunking.NumChunksLeft() > 0) {
old_chunking.MarkDone(best.transactions);
}
diff --git a/src/common/args.cpp b/src/common/args.cpp
index a37a16b62b..f59d2b8f0f 100644
--- a/src/common/args.cpp
+++ b/src/common/args.cpp
@@ -16,6 +16,7 @@
#include <util/fs.h>
#include <util/fs_helpers.h>
#include <util/strencodings.h>
+#include <util/string.h>
#ifdef WIN32
#include <codecvt> /* for codecvt_utf8_utf16 */
@@ -588,6 +589,23 @@ void ArgsManager::AddHiddenArgs(const std::vector<std::string>& names)
}
}
+void ArgsManager::CheckMultipleCLIArgs() const
+{
+ LOCK(cs_args);
+ std::vector<std::string> found{};
+ auto cmds = m_available_args.find(OptionsCategory::CLI_COMMANDS);
+ if (cmds != m_available_args.end()) {
+ for (const auto& [cmd, argspec] : cmds->second) {
+ if (IsArgSet(cmd)) {
+ found.push_back(cmd);
+ }
+ }
+ if (found.size() > 1) {
+ throw std::runtime_error(strprintf("Only one of %s may be specified.", util::Join(found, ", ")));
+ }
+ }
+}
+
std::string ArgsManager::GetHelpMessage() const
{
const bool show_debug = GetBoolArg("-help-debug", false);
@@ -617,6 +635,9 @@ std::string ArgsManager::GetHelpMessage() const
case OptionsCategory::RPC:
usage += HelpMessageGroup("RPC server options:");
break;
+ case OptionsCategory::IPC:
+ usage += HelpMessageGroup("IPC interprocess connection options:");
+ break;
case OptionsCategory::WALLET:
usage += HelpMessageGroup("Wallet options:");
break;
@@ -635,6 +656,9 @@ std::string ArgsManager::GetHelpMessage() const
case OptionsCategory::REGISTER_COMMANDS:
usage += HelpMessageGroup("Register Commands:");
break;
+ case OptionsCategory::CLI_COMMANDS:
+ usage += HelpMessageGroup("CLI Commands:");
+ break;
default:
break;
}
diff --git a/src/common/args.h b/src/common/args.h
index 323a86d8dc..8d9daf5f65 100644
--- a/src/common/args.h
+++ b/src/common/args.h
@@ -63,6 +63,8 @@ enum class OptionsCategory {
GUI,
COMMANDS,
REGISTER_COMMANDS,
+ CLI_COMMANDS,
+ IPC,
HIDDEN // Always the last option to avoid printing these in the help
};
@@ -364,6 +366,13 @@ protected:
}
/**
+ * Check CLI command args
+ *
+ * @throws std::runtime_error when multiple CLI_COMMAND arguments are specified
+ */
+ void CheckMultipleCLIArgs() const;
+
+ /**
* Get the help string
*/
std::string GetHelpMessage() const;
diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h
index 384f70bc10..cffe9cdafd 100644
--- a/src/consensus/consensus.h
+++ b/src/consensus/consensus.h
@@ -27,4 +27,11 @@ static const size_t MIN_SERIALIZABLE_TRANSACTION_WEIGHT = WITNESS_SCALE_FACTOR *
/** Interpret sequence numbers as relative lock-time constraints. */
static constexpr unsigned int LOCKTIME_VERIFY_SEQUENCE = (1 << 0);
+/**
+ * Maximum number of seconds that the timestamp of the first
+ * block of a difficulty adjustment period is allowed to
+ * be earlier than the last block of the previous period (BIP94).
+ */
+static constexpr int64_t MAX_TIMEWARP = 600;
+
#endif // BITCOIN_CONSENSUS_CONSENSUS_H
diff --git a/src/consensus/params.h b/src/consensus/params.h
index d970e41637..dd29b9408e 100644
--- a/src/consensus/params.h
+++ b/src/consensus/params.h
@@ -108,6 +108,10 @@ struct Params {
/** Proof of work parameters */
uint256 powLimit;
bool fPowAllowMinDifficultyBlocks;
+ /**
+ * Enforce BIP94 timewarp attack mitigation. On testnet4 this also enforces
+ * the block storm mitigation.
+ */
bool enforce_BIP94;
bool fPowNoRetargeting;
int64_t nPowTargetSpacing;
diff --git a/src/crypto/CMakeLists.txt b/src/crypto/CMakeLists.txt
new file mode 100644
index 0000000000..03c6972dca
--- /dev/null
+++ b/src/crypto/CMakeLists.txt
@@ -0,0 +1,68 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(bitcoin_crypto STATIC EXCLUDE_FROM_ALL
+ aes.cpp
+ chacha20.cpp
+ chacha20poly1305.cpp
+ hex_base.cpp
+ hkdf_sha256_32.cpp
+ hmac_sha256.cpp
+ hmac_sha512.cpp
+ muhash.cpp
+ poly1305.cpp
+ ripemd160.cpp
+ sha1.cpp
+ sha256.cpp
+ sha256_sse4.cpp
+ sha3.cpp
+ sha512.cpp
+ siphash.cpp
+ ../support/cleanse.cpp
+)
+
+target_link_libraries(bitcoin_crypto
+ PRIVATE
+ core_interface
+)
+
+if(HAVE_SSE41)
+ add_library(bitcoin_crypto_sse41 STATIC EXCLUDE_FROM_ALL
+ sha256_sse41.cpp
+ )
+ target_compile_definitions(bitcoin_crypto_sse41 PUBLIC ENABLE_SSE41)
+ target_compile_options(bitcoin_crypto_sse41 PRIVATE ${SSE41_CXXFLAGS})
+ target_link_libraries(bitcoin_crypto_sse41 PRIVATE core_interface)
+ target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_sse41)
+endif()
+
+if(HAVE_AVX2)
+ add_library(bitcoin_crypto_avx2 STATIC EXCLUDE_FROM_ALL
+ sha256_avx2.cpp
+ )
+ target_compile_definitions(bitcoin_crypto_avx2 PUBLIC ENABLE_AVX2)
+ target_compile_options(bitcoin_crypto_avx2 PRIVATE ${AVX2_CXXFLAGS})
+ target_link_libraries(bitcoin_crypto_avx2 PRIVATE core_interface)
+ target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_avx2)
+endif()
+
+if(HAVE_SSE41 AND HAVE_X86_SHANI)
+ add_library(bitcoin_crypto_x86_shani STATIC EXCLUDE_FROM_ALL
+ sha256_x86_shani.cpp
+ )
+ target_compile_definitions(bitcoin_crypto_x86_shani PUBLIC ENABLE_SSE41 ENABLE_X86_SHANI)
+ target_compile_options(bitcoin_crypto_x86_shani PRIVATE ${X86_SHANI_CXXFLAGS})
+ target_link_libraries(bitcoin_crypto_x86_shani PRIVATE core_interface)
+ target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_x86_shani)
+endif()
+
+if(HAVE_ARM_SHANI)
+ add_library(bitcoin_crypto_arm_shani STATIC EXCLUDE_FROM_ALL
+ sha256_arm_shani.cpp
+ )
+ target_compile_definitions(bitcoin_crypto_arm_shani PUBLIC ENABLE_ARM_SHANI)
+ target_compile_options(bitcoin_crypto_arm_shani PRIVATE ${ARM_SHANI_CXXFLAGS})
+ target_link_libraries(bitcoin_crypto_arm_shani PRIVATE core_interface)
+ target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_arm_shani)
+endif()
diff --git a/src/dbwrapper.cpp b/src/dbwrapper.cpp
index 479064d468..e0f153fd61 100644
--- a/src/dbwrapper.cpp
+++ b/src/dbwrapper.cpp
@@ -130,7 +130,7 @@ static void SetMaxOpenFiles(leveldb::Options *options) {
options->max_open_files = 64;
}
#endif
- LogPrint(BCLog::LEVELDB, "LevelDB using max_open_files=%d (default=%d)\n",
+ LogDebug(BCLog::LEVELDB, "LevelDB using max_open_files=%d (default=%d)\n",
options->max_open_files, default_open_files);
}
@@ -299,7 +299,7 @@ bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync)
HandleError(status);
if (log_memory) {
double mem_after = DynamicMemoryUsage() / 1024.0 / 1024;
- LogPrint(BCLog::LEVELDB, "WriteBatch memory usage: db=%s, before=%.1fMiB, after=%.1fMiB\n",
+ LogDebug(BCLog::LEVELDB, "WriteBatch memory usage: db=%s, before=%.1fMiB, after=%.1fMiB\n",
m_name, mem_before, mem_after);
}
return true;
@@ -310,7 +310,7 @@ size_t CDBWrapper::DynamicMemoryUsage() const
std::string memory;
std::optional<size_t> parsed;
if (!DBContext().pdb->GetProperty("leveldb.approximate-memory-usage", &memory) || !(parsed = ToIntegral<size_t>(memory))) {
- LogPrint(BCLog::LEVELDB, "Failed to get approximate-memory-usage property\n");
+ LogDebug(BCLog::LEVELDB, "Failed to get approximate-memory-usage property\n");
return 0;
}
return parsed.value();
diff --git a/src/external_signer.cpp b/src/external_signer.cpp
index ff159a2aa5..1810f45bc8 100644
--- a/src/external_signer.cpp
+++ b/src/external_signer.cpp
@@ -80,10 +80,10 @@ bool ExternalSigner::SignTransaction(PartiallySignedTransaction& psbtx, std::str
// Check if signer fingerprint matches any input master key fingerprint
auto matches_signer_fingerprint = [&](const PSBTInput& input) {
for (const auto& entry : input.hd_keypaths) {
- if (parsed_m_fingerprint == MakeUCharSpan(entry.second.fingerprint)) return true;
+ if (std::ranges::equal(parsed_m_fingerprint, entry.second.fingerprint)) return true;
}
for (const auto& entry : input.m_tap_bip32_paths) {
- if (parsed_m_fingerprint == MakeUCharSpan(entry.second.second.fingerprint)) return true;
+ if (std::ranges::equal(parsed_m_fingerprint, entry.second.second.fingerprint)) return true;
}
return false;
};
diff --git a/src/flatfile.cpp b/src/flatfile.cpp
index 6aba0c371d..388b30efae 100644
--- a/src/flatfile.cpp
+++ b/src/flatfile.cpp
@@ -66,7 +66,7 @@ size_t FlatFileSeq::Allocate(const FlatFilePos& pos, size_t add_size, bool& out_
if (CheckDiskSpace(m_dir, inc_size)) {
FILE *file = Open(pos);
if (file) {
- LogPrint(BCLog::VALIDATION, "Pre-allocating up to position 0x%x in %s%05u.dat\n", new_size, m_prefix, pos.nFile);
+ LogDebug(BCLog::VALIDATION, "Pre-allocating up to position 0x%x in %s%05u.dat\n", new_size, m_prefix, pos.nFile);
AllocateFileRange(file, pos.nPos, inc_size);
fclose(file);
return inc_size;
diff --git a/src/headerssync.cpp b/src/headerssync.cpp
index b41fe07754..b134ef6452 100644
--- a/src/headerssync.cpp
+++ b/src/headerssync.cpp
@@ -13,11 +13,11 @@
// contrib/devtools/headerssync-params.py.
//! Store one header commitment per HEADER_COMMITMENT_PERIOD blocks.
-constexpr size_t HEADER_COMMITMENT_PERIOD{606};
+constexpr size_t HEADER_COMMITMENT_PERIOD{615};
//! Only feed headers to validation once this many headers on top have been
//! received and validated against commitments.
-constexpr size_t REDOWNLOAD_BUFFER_SIZE{14441}; // 14441/606 = ~23.8 commitments
+constexpr size_t REDOWNLOAD_BUFFER_SIZE{14621}; // 14621/615 = ~23.8 commitments
// Our memory analysis assumes 48 bytes for a CompressedHeader (so we should
// re-calculate parameters if we compress further)
@@ -43,7 +43,7 @@ HeadersSyncState::HeadersSyncState(NodeId id, const Consensus::Params& consensus
// could try again, if necessary, to sync a longer chain).
m_max_commitments = 6*(Ticks<std::chrono::seconds>(NodeClock::now() - NodeSeconds{std::chrono::seconds{chain_start->GetMedianTimePast()}}) + MAX_FUTURE_BLOCK_TIME) / HEADER_COMMITMENT_PERIOD;
- LogPrint(BCLog::NET, "Initial headers sync started with peer=%d: height=%i, max_commitments=%i, min_work=%s\n", m_id, m_current_height, m_max_commitments, m_minimum_required_work.ToString());
+ LogDebug(BCLog::NET, "Initial headers sync started with peer=%d: height=%i, max_commitments=%i, min_work=%s\n", m_id, m_current_height, m_max_commitments, m_minimum_required_work.ToString());
}
/** Free any memory in use, and mark this object as no longer usable. This is
@@ -93,7 +93,7 @@ HeadersSyncState::ProcessingResult HeadersSyncState::ProcessNextHeaders(const
// If we're in PRESYNC and we get a non-full headers
// message, then the peer's chain has ended and definitely doesn't
// have enough work, so we can stop our sync.
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: incomplete headers message at height=%i (presync phase)\n", m_id, m_current_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: incomplete headers message at height=%i (presync phase)\n", m_id, m_current_height);
}
}
} else if (m_download_state == State::REDOWNLOAD) {
@@ -119,7 +119,7 @@ HeadersSyncState::ProcessingResult HeadersSyncState::ProcessNextHeaders(const
// If we hit our target blockhash, then all remaining headers will be
// returned and we can clear any leftover internal state.
if (m_redownloaded_headers.empty() && m_process_all_remaining_headers) {
- LogPrint(BCLog::NET, "Initial headers sync complete with peer=%d: releasing all at height=%i (redownload phase)\n", m_id, m_redownload_buffer_last_height);
+ LogDebug(BCLog::NET, "Initial headers sync complete with peer=%d: releasing all at height=%i (redownload phase)\n", m_id, m_redownload_buffer_last_height);
} else if (full_headers_message) {
// If the headers message is full, we need to request more.
ret.request_more = true;
@@ -128,7 +128,7 @@ HeadersSyncState::ProcessingResult HeadersSyncState::ProcessNextHeaders(const
// declining to serve us that full chain again. Give up.
// Note that there's no more processing to be done with these
// headers, so we can still return success.
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: incomplete headers message at height=%i (redownload phase)\n", m_id, m_redownload_buffer_last_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: incomplete headers message at height=%i (redownload phase)\n", m_id, m_redownload_buffer_last_height);
}
}
}
@@ -151,7 +151,7 @@ bool HeadersSyncState::ValidateAndStoreHeadersCommitments(const std::vector<CBlo
// This might be benign -- perhaps our peer reorged away from the chain
// they were on. Give up on this sync for now (likely we will start a
// new sync with a new starting point).
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: non-continuous headers at height=%i (presync phase)\n", m_id, m_current_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: non-continuous headers at height=%i (presync phase)\n", m_id, m_current_height);
return false;
}
@@ -170,7 +170,7 @@ bool HeadersSyncState::ValidateAndStoreHeadersCommitments(const std::vector<CBlo
m_redownload_buffer_last_hash = m_chain_start->GetBlockHash();
m_redownload_chain_work = m_chain_start->nChainWork;
m_download_state = State::REDOWNLOAD;
- LogPrint(BCLog::NET, "Initial headers sync transition with peer=%d: reached sufficient work at height=%i, redownloading from height=%i\n", m_id, m_current_height, m_redownload_buffer_last_height);
+ LogDebug(BCLog::NET, "Initial headers sync transition with peer=%d: reached sufficient work at height=%i, redownloading from height=%i\n", m_id, m_current_height, m_redownload_buffer_last_height);
}
return true;
}
@@ -189,7 +189,7 @@ bool HeadersSyncState::ValidateAndProcessSingleHeader(const CBlockHeader& curren
// adjustment maximum.
if (!PermittedDifficultyTransition(m_consensus_params, next_height,
m_last_header_received.nBits, current.nBits)) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: invalid difficulty transition at height=%i (presync phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: invalid difficulty transition at height=%i (presync phase)\n", m_id, next_height);
return false;
}
@@ -201,7 +201,7 @@ bool HeadersSyncState::ValidateAndProcessSingleHeader(const CBlockHeader& curren
// It's possible the chain grew since we started the sync; so
// potentially we could succeed in syncing the peer's chain if we
// try again later.
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: exceeded max commitments at height=%i (presync phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: exceeded max commitments at height=%i (presync phase)\n", m_id, next_height);
return false;
}
}
@@ -223,7 +223,7 @@ bool HeadersSyncState::ValidateAndStoreRedownloadedHeader(const CBlockHeader& he
// Ensure that we're working on a header that connects to the chain we're
// downloading.
if (header.hashPrevBlock != m_redownload_buffer_last_hash) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: non-continuous headers at height=%i (redownload phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: non-continuous headers at height=%i (redownload phase)\n", m_id, next_height);
return false;
}
@@ -237,7 +237,7 @@ bool HeadersSyncState::ValidateAndStoreRedownloadedHeader(const CBlockHeader& he
if (!PermittedDifficultyTransition(m_consensus_params, next_height,
previous_nBits, header.nBits)) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: invalid difficulty transition at height=%i (redownload phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: invalid difficulty transition at height=%i (redownload phase)\n", m_id, next_height);
return false;
}
@@ -256,7 +256,7 @@ bool HeadersSyncState::ValidateAndStoreRedownloadedHeader(const CBlockHeader& he
// target blockhash just because we ran out of commitments.
if (!m_process_all_remaining_headers && next_height % HEADER_COMMITMENT_PERIOD == m_commit_offset) {
if (m_header_commitments.size() == 0) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: commitment overrun at height=%i (redownload phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: commitment overrun at height=%i (redownload phase)\n", m_id, next_height);
// Somehow our peer managed to feed us a different chain and
// we've run out of commitments.
return false;
@@ -265,7 +265,7 @@ bool HeadersSyncState::ValidateAndStoreRedownloadedHeader(const CBlockHeader& he
bool expected_commitment = m_header_commitments.front();
m_header_commitments.pop_front();
if (commitment != expected_commitment) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: commitment mismatch at height=%i (redownload phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: commitment mismatch at height=%i (redownload phase)\n", m_id, next_height);
return false;
}
}
diff --git a/src/httprpc.cpp b/src/httprpc.cpp
index af809eaf38..69dd821dc0 100644
--- a/src/httprpc.cpp
+++ b/src/httprpc.cpp
@@ -314,8 +314,9 @@ static bool InitRPCAuthentication()
LogPrintf("Config options rpcuser and rpcpassword will soon be deprecated. Locally-run instances may remove rpcuser to use cookie-based auth, or may be replaced with rpcauth. Please see share/rpcauth for rpcauth auth generation.\n");
strRPCUserColonPass = gArgs.GetArg("-rpcuser", "") + ":" + gArgs.GetArg("-rpcpassword", "");
}
- if (gArgs.GetArg("-rpcauth", "") != "") {
- LogPrintf("Using rpcauth authentication.\n");
+
+ if (!gArgs.GetArgs("-rpcauth").empty()) {
+ LogInfo("Using rpcauth authentication.\n");
for (const std::string& rpcauth : gArgs.GetArgs("-rpcauth")) {
std::vector<std::string> fields{SplitString(rpcauth, ':')};
const std::vector<std::string> salt_hmac{SplitString(fields.back(), '$')};
@@ -357,7 +358,7 @@ static bool InitRPCAuthentication()
bool StartHTTPRPC(const std::any& context)
{
- LogPrint(BCLog::RPC, "Starting HTTP RPC server\n");
+ LogDebug(BCLog::RPC, "Starting HTTP RPC server\n");
if (!InitRPCAuthentication())
return false;
@@ -375,12 +376,12 @@ bool StartHTTPRPC(const std::any& context)
void InterruptHTTPRPC()
{
- LogPrint(BCLog::RPC, "Interrupting HTTP RPC server\n");
+ LogDebug(BCLog::RPC, "Interrupting HTTP RPC server\n");
}
void StopHTTPRPC()
{
- LogPrint(BCLog::RPC, "Stopping HTTP RPC server\n");
+ LogDebug(BCLog::RPC, "Stopping HTTP RPC server\n");
UnregisterHTTPHandler("/", true);
if (g_wallet_init_interface.HasWalletSupport()) {
UnregisterHTTPHandler("/wallet/", false);
diff --git a/src/httpserver.cpp b/src/httpserver.cpp
index b6c6db8b35..ebdab1043e 100644
--- a/src/httpserver.cpp
+++ b/src/httpserver.cpp
@@ -235,7 +235,7 @@ static bool InitHTTPAllowList()
std::string strAllowed;
for (const CSubNet& subnet : rpc_allow_subnets)
strAllowed += subnet.ToString() + " ";
- LogPrint(BCLog::HTTP, "Allowing HTTP connections from: %s\n", strAllowed);
+ LogDebug(BCLog::HTTP, "Allowing HTTP connections from: %s\n", strAllowed);
return true;
}
@@ -287,7 +287,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
// Early address-based allow check
if (!ClientAllowed(hreq->GetPeer())) {
- LogPrint(BCLog::HTTP, "HTTP request from %s rejected: Client network is not allowed RPC access\n",
+ LogDebug(BCLog::HTTP, "HTTP request from %s rejected: Client network is not allowed RPC access\n",
hreq->GetPeer().ToStringAddrPort());
hreq->WriteReply(HTTP_FORBIDDEN);
return;
@@ -295,13 +295,13 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
// Early reject unknown HTTP methods
if (hreq->GetRequestMethod() == HTTPRequest::UNKNOWN) {
- LogPrint(BCLog::HTTP, "HTTP request from %s rejected: Unknown HTTP request method\n",
+ LogDebug(BCLog::HTTP, "HTTP request from %s rejected: Unknown HTTP request method\n",
hreq->GetPeer().ToStringAddrPort());
hreq->WriteReply(HTTP_BAD_METHOD);
return;
}
- LogPrint(BCLog::HTTP, "Received a %s request for %s from %s\n",
+ LogDebug(BCLog::HTTP, "Received a %s request for %s from %s\n",
RequestMethodString(hreq->GetRequestMethod()), SanitizeString(hreq->GetURI(), SAFE_CHARS_URI).substr(0, 100), hreq->GetPeer().ToStringAddrPort());
// Find registered handler for prefix
@@ -315,7 +315,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
if (i->exactMatch)
match = (strURI == i->prefix);
else
- match = (strURI.substr(0, i->prefix.size()) == i->prefix);
+ match = strURI.starts_with(i->prefix);
if (match) {
path = strURI.substr(i->prefix.size());
break;
@@ -340,7 +340,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
/** Callback to reject HTTP requests after shutdown. */
static void http_reject_request_cb(struct evhttp_request* req, void*)
{
- LogPrint(BCLog::HTTP, "Rejecting request while shutting down\n");
+ LogDebug(BCLog::HTTP, "Rejecting request while shutting down\n");
evhttp_send_error(req, HTTP_SERVUNAVAIL, nullptr);
}
@@ -348,10 +348,10 @@ static void http_reject_request_cb(struct evhttp_request* req, void*)
static void ThreadHTTP(struct event_base* base)
{
util::ThreadRename("http");
- LogPrint(BCLog::HTTP, "Entering http event loop\n");
+ LogDebug(BCLog::HTTP, "Entering http event loop\n");
event_base_dispatch(base);
// Event loop will be interrupted by InterruptHTTPServer()
- LogPrint(BCLog::HTTP, "Exited http event loop\n");
+ LogDebug(BCLog::HTTP, "Exited http event loop\n");
}
/** Bind HTTP server to specified addresses */
@@ -388,6 +388,12 @@ static bool HTTPBindAddresses(struct evhttp* http)
if (i->first.empty() || (addr.has_value() && addr->IsBindAny())) {
LogPrintf("WARNING: the RPC server is not safe to expose to untrusted networks such as the public internet\n");
}
+ // Set the no-delay option (disable Nagle's algorithm) on the TCP socket.
+ evutil_socket_t fd = evhttp_bound_socket_get_fd(bind_handle);
+ int one = 1;
+ if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (sockopt_arg_type)&one, sizeof(one)) == SOCKET_ERROR) {
+ LogInfo("WARNING: Unable to set TCP_NODELAY on RPC server socket, continuing anyway\n");
+ }
boundSockets.push_back(bind_handle);
} else {
LogPrintf("Binding RPC on address %s port %i failed.\n", i->first, i->second);
@@ -460,7 +466,7 @@ bool InitHTTPServer(const util::SignalInterrupt& interrupt)
return false;
}
- LogPrint(BCLog::HTTP, "Initialized HTTP server\n");
+ LogDebug(BCLog::HTTP, "Initialized HTTP server\n");
int workQueueDepth = std::max((long)gArgs.GetIntArg("-rpcworkqueue", DEFAULT_HTTP_WORKQUEUE), 1L);
LogDebug(BCLog::HTTP, "creating work queue of depth %d\n", workQueueDepth);
@@ -495,7 +501,7 @@ void StartHTTPServer()
void InterruptHTTPServer()
{
- LogPrint(BCLog::HTTP, "Interrupting HTTP server\n");
+ LogDebug(BCLog::HTTP, "Interrupting HTTP server\n");
if (eventHTTP) {
// Reject requests on current connections
evhttp_set_gencb(eventHTTP, http_reject_request_cb, nullptr);
@@ -507,9 +513,9 @@ void InterruptHTTPServer()
void StopHTTPServer()
{
- LogPrint(BCLog::HTTP, "Stopping HTTP server\n");
+ LogDebug(BCLog::HTTP, "Stopping HTTP server\n");
if (g_work_queue) {
- LogPrint(BCLog::HTTP, "Waiting for HTTP worker threads to exit\n");
+ LogDebug(BCLog::HTTP, "Waiting for HTTP worker threads to exit\n");
for (auto& thread : g_thread_http_workers) {
thread.join();
}
@@ -523,7 +529,7 @@ void StopHTTPServer()
boundSockets.clear();
{
if (const auto n_connections{g_requests.CountActiveConnections()}; n_connections != 0) {
- LogPrint(BCLog::HTTP, "Waiting for %d connections to stop HTTP server\n", n_connections);
+ LogDebug(BCLog::HTTP, "Waiting for %d connections to stop HTTP server\n", n_connections);
}
g_requests.WaitUntilEmpty();
}
@@ -537,13 +543,13 @@ void StopHTTPServer()
}, nullptr, nullptr);
}
if (eventBase) {
- LogPrint(BCLog::HTTP, "Waiting for HTTP event thread to exit\n");
+ LogDebug(BCLog::HTTP, "Waiting for HTTP event thread to exit\n");
if (g_thread_http.joinable()) g_thread_http.join();
event_base_free(eventBase);
eventBase = nullptr;
}
g_work_queue.reset();
- LogPrint(BCLog::HTTP, "Stopped HTTP server\n");
+ LogDebug(BCLog::HTTP, "Stopped HTTP server\n");
}
struct event_base* EventBase()
@@ -742,7 +748,7 @@ std::optional<std::string> GetQueryParameterFromUri(const char* uri, const std::
void RegisterHTTPHandler(const std::string &prefix, bool exactMatch, const HTTPRequestHandler &handler)
{
- LogPrint(BCLog::HTTP, "Registering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
+ LogDebug(BCLog::HTTP, "Registering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
LOCK(g_httppathhandlers_mutex);
pathHandlers.emplace_back(prefix, exactMatch, handler);
}
@@ -757,7 +763,7 @@ void UnregisterHTTPHandler(const std::string &prefix, bool exactMatch)
break;
if (i != iend)
{
- LogPrint(BCLog::HTTP, "Unregistering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
+ LogDebug(BCLog::HTTP, "Unregistering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
pathHandlers.erase(i);
}
}
diff --git a/src/index/base.cpp b/src/index/base.cpp
index 955d7b67c9..6f9860415f 100644
--- a/src/index/base.cpp
+++ b/src/index/base.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2017-2022 The Bitcoin Core developers
+// Copyright (c) 2017-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -14,6 +14,7 @@
#include <node/database_args.h>
#include <node/interface_ui.h>
#include <tinyformat.h>
+#include <util/string.h>
#include <util/thread.h>
#include <util/translation.h>
#include <validation.h> // For g_chainman
@@ -27,7 +28,7 @@ constexpr auto SYNC_LOG_INTERVAL{30s};
constexpr auto SYNC_LOCATOR_WRITE_INTERVAL{30s};
template <typename... Args>
-void BaseIndex::FatalErrorf(const char* fmt, const Args&... args)
+void BaseIndex::FatalErrorf(util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args)
{
auto message = tfm::format(fmt, args...);
node::AbortNode(m_chain->context()->shutdown, m_chain->context()->exit_status, Untranslated(message), m_chain->context()->warnings.get());
diff --git a/src/index/base.h b/src/index/base.h
index 0eb1d9ca3b..beb1575ab2 100644
--- a/src/index/base.h
+++ b/src/index/base.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2017-2022 The Bitcoin Core developers
+// Copyright (c) 2017-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -7,6 +7,7 @@
#include <dbwrapper.h>
#include <interfaces/chain.h>
+#include <util/string.h>
#include <util/threadinterrupt.h>
#include <validationinterface.h>
@@ -94,7 +95,7 @@ private:
virtual bool AllowPrune() const = 0;
template <typename... Args>
- void FatalErrorf(const char* fmt, const Args&... args);
+ void FatalErrorf(util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args);
protected:
std::unique_ptr<interfaces::Chain> m_chain;
diff --git a/src/init.cpp b/src/init.cpp
index faaf3353d0..d6c80d8f84 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -29,6 +29,7 @@
#include <init/common.h>
#include <interfaces/chain.h>
#include <interfaces/init.h>
+#include <interfaces/ipc.h>
#include <interfaces/mining.h>
#include <interfaces/node.h>
#include <kernel/context.h>
@@ -147,11 +148,12 @@ static constexpr bool DEFAULT_STOPAFTERBLOCKIMPORT{false};
// Win32 LevelDB doesn't use filedescriptors, and the ones used for
// accessing block files don't count towards the fd_set size limit
// anyway.
-#define MIN_CORE_FILEDESCRIPTORS 0
+#define MIN_LEVELDB_FDS 0
#else
-#define MIN_CORE_FILEDESCRIPTORS 150
+#define MIN_LEVELDB_FDS 150
#endif
+static constexpr int MIN_CORE_FDS = MIN_LEVELDB_FDS + NUM_FDS_MESSAGE_CAPTURE;
static const char* DEFAULT_ASMAP_FILENAME="ip_asn.map";
/**
@@ -296,7 +298,7 @@ void Shutdown(NodeContext& node)
StopTorControl();
- if (node.chainman && node.chainman->m_thread_load.joinable()) node.chainman->m_thread_load.join();
+ if (node.background_init_thread.joinable()) node.background_init_thread.join();
// After everything has been shut down, but before things get flushed, stop the
// the scheduler. After this point, SyncWithValidationInterfaceQueue() should not be called anymore
// as this would prevent the shutdown from completing.
@@ -438,10 +440,10 @@ static void OnRPCStopped()
rpc_notify_block_change_connection.disconnect();
RPCNotifyBlockChange(nullptr);
g_best_block_cv.notify_all();
- LogPrint(BCLog::RPC, "RPC stopped.\n");
+ LogDebug(BCLog::RPC, "RPC stopped.\n");
}
-void SetupServerArgs(ArgsManager& argsman)
+void SetupServerArgs(ArgsManager& argsman, bool can_listen_ipc)
{
SetupHelpOptions(argsman);
argsman.AddArg("-help-debug", "Print help message with debugging options and exit", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); // server-only for now
@@ -488,7 +490,7 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-conf=<file>", strprintf("Specify path to read-only configuration file. Relative paths will be prefixed by datadir location (only useable from command line, not configuration file) (default: %s)", BITCOIN_CONF_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-dbbatchsize", strprintf("Maximum database write batch size in bytes (default: %u)", nDefaultDbBatchSize), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
- argsman.AddArg("-dbcache=<n>", strprintf("Maximum database cache size <n> MiB (%d to %d, default: %d). In addition, unused mempool memory is shared for this cache (see -maxmempool).", nMinDbCache, nMaxDbCache, nDefaultDbCache), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
+ argsman.AddArg("-dbcache=<n>", strprintf("Maximum database cache size <n> MiB (minimum %d, default: %d). Make sure you have enough RAM. In addition, unused memory allocated to the mempool is shared with this cache (see -maxmempool).", nMinDbCache, nDefaultDbCache), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-includeconf=<file>", "Specify additional configuration file, relative to the -datadir path (only useable from configuration file, not command line)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-allowignoredconf", strprintf("For backwards compatibility, treat an unused %s file in the datadir as a warning, not an error.", BITCOIN_CONF_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-loadblock=<file>", "Imports blocks from external file on startup", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
@@ -676,6 +678,9 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-rpcwhitelistdefault", "Sets default behavior for rpc whitelisting. Unless rpcwhitelistdefault is set to 0, if any -rpcwhitelist is set, the rpc server acts as if all rpc users are subject to empty-unless-otherwise-specified whitelists. If rpcwhitelistdefault is set to 1 and no -rpcwhitelist is set, rpc server acts as if all rpc users are subject to empty whitelists.", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
argsman.AddArg("-rpcworkqueue=<n>", strprintf("Set the depth of the work queue to service RPC calls (default: %d)", DEFAULT_HTTP_WORKQUEUE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::RPC);
argsman.AddArg("-server", "Accept command line and JSON-RPC commands", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
+ if (can_listen_ipc) {
+ argsman.AddArg("-ipcbind=<address>", "Bind to Unix socket address and listen for incoming connections. Valid address values are \"unix\" to listen on the default path, <datadir>/node.sock, or \"unix:/custom/path\" to specify a custom path. Can be specified multiple times to listen on multiple paths. Default behavior is not to listen on any path. If relative paths are specified, they are interpreted relative to the network data directory. If paths include any parent directory components and the parent directories do not exist, they will be created.", ArgsManager::ALLOW_ANY, OptionsCategory::IPC);
+ }
#if HAVE_DECL_FORK
argsman.AddArg("-daemon", strprintf("Run in the background as a daemon and accept commands (default: %d)", DEFAULT_DAEMON), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
@@ -834,8 +839,7 @@ void InitLogging(const ArgsManager& args)
namespace { // Variables internal to initialization process only
int nMaxConnections;
-int nUserMaxConnections;
-int nFD;
+int available_fds;
ServiceFlags nLocalServices = ServiceFlags(NODE_NETWORK_LIMITED | NODE_WITNESS);
int64_t peer_connect_timeout;
std::set<BlockFilterType> g_enabled_filter_types;
@@ -987,27 +991,33 @@ bool AppInitParameterInteraction(const ArgsManager& args)
return InitError(Untranslated("Cannot set -listen=0 together with -listenonion=1"));
}
- // Make sure enough file descriptors are available
- int nBind = std::max(nUserBind, size_t(1));
- nUserMaxConnections = args.GetIntArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS);
- nMaxConnections = std::max(nUserMaxConnections, 0);
-
- nFD = RaiseFileDescriptorLimit(nMaxConnections + MIN_CORE_FILEDESCRIPTORS + MAX_ADDNODE_CONNECTIONS + nBind + NUM_FDS_MESSAGE_CAPTURE);
+ // Make sure enough file descriptors are available. We need to reserve enough FDs to account for the bare minimum,
+ // plus all manual connections and all bound interfaces. Any remainder will be available for connection sockets
-#ifdef USE_POLL
- int fd_max = nFD;
-#else
- int fd_max = FD_SETSIZE;
+ // Number of bound interfaces (we have at least one)
+ int nBind = std::max(nUserBind, size_t(1));
+ // Maximum number of connections with other nodes, this accounts for all types of outbounds and inbounds except for manual
+ int user_max_connection = args.GetIntArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS);
+ if (user_max_connection < 0) {
+ return InitError(Untranslated("-maxconnections must be greater or equal than zero"));
+ }
+ // Reserve enough FDs to account for the bare minimum, plus any manual connections, plus the bound interfaces
+ int min_required_fds = MIN_CORE_FDS + MAX_ADDNODE_CONNECTIONS + nBind;
+
+ // Try raising the FD limit to what we need (available_fds may be smaller than the requested amount if this fails)
+ available_fds = RaiseFileDescriptorLimit(user_max_connection + min_required_fds);
+ // If we are using select instead of poll, our actual limit may be even smaller
+#ifndef USE_POLL
+ available_fds = std::min(FD_SETSIZE, available_fds);
#endif
+ if (available_fds < min_required_fds)
+ return InitError(strprintf(_("Not enough file descriptors available. %d available, %d required."), available_fds, min_required_fds));
+
// Trim requested connection counts, to fit into system limitations
- // <int> in std::min<int>(...) to work around FreeBSD compilation issue described in #2695
- nMaxConnections = std::max(std::min<int>(nMaxConnections, fd_max - nBind - MIN_CORE_FILEDESCRIPTORS - MAX_ADDNODE_CONNECTIONS - NUM_FDS_MESSAGE_CAPTURE), 0);
- if (nFD < MIN_CORE_FILEDESCRIPTORS)
- return InitError(_("Not enough file descriptors available."));
- nMaxConnections = std::min(nFD - MIN_CORE_FILEDESCRIPTORS - MAX_ADDNODE_CONNECTIONS - NUM_FDS_MESSAGE_CAPTURE, nMaxConnections);
+ nMaxConnections = std::min(available_fds - min_required_fds, user_max_connection);
- if (nMaxConnections < nUserMaxConnections)
- InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections));
+ if (nMaxConnections < user_max_connection)
+ InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), user_max_connection, nMaxConnections));
// ********************************************************* Step 3: parameter-to-internal-flags
if (auto result{init::SetLoggingCategories(args)}; !result) return InitError(util::ErrorString(result));
@@ -1155,7 +1165,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
return false;
}
- LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD);
+ LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, available_fds);
// Warn about relative -datadir path.
if (args.IsArgSet("-datadir") && !args.GetPathArg("-datadir").is_absolute()) {
@@ -1200,6 +1210,17 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
g_wallet_init_interface.Construct(node);
uiInterface.InitWallet();
+ if (interfaces::Ipc* ipc = node.init->ipc()) {
+ for (std::string address : gArgs.GetArgs("-ipcbind")) {
+ try {
+ ipc->listenAddress(address);
+ } catch (const std::exception& e) {
+ return InitError(strprintf(Untranslated("Unable to bind to IPC address '%s'. %s"), address, e.what()));
+ }
+ LogPrintf("Listening for IPC requests on address %s\n", address);
+ }
+ }
+
/* Register RPC commands regardless of -server setting so they will be
* available in the GUI RPC console even if external calls are disabled.
*/
@@ -1335,7 +1356,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
if (!SplitHostPort(socket_addr, port_out, host_out)) {
#ifdef HAVE_SOCKADDR_UN
// Allow unix domain sockets for some options e.g. unix:/some/file/path
- if (!unix || socket_addr.find(ADDR_PREFIX_UNIX) != 0) {
+ if (!unix || !socket_addr.starts_with(ADDR_PREFIX_UNIX)) {
return InitError(InvalidPortErrMsg(arg, socket_addr));
}
#else
@@ -1558,7 +1579,12 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// This is defined and set here instead of inline in validation.h to avoid a hard
// dependency between validation and index/base, since the latter is not in
// libbitcoinkernel.
- chainman.restart_indexes = [&node]() {
+ chainman.snapshot_download_completed = [&node]() {
+ if (!node.chainman->m_blockman.IsPruneMode()) {
+ LogPrintf("[snapshot] re-enabling NODE_NETWORK services\n");
+ node.connman->AddLocalServices(NODE_NETWORK);
+ }
+
LogPrintf("[snapshot] restarting indexes\n");
// Drain the validation interface queue to ensure that the old indexes
@@ -1695,8 +1721,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
}
}
} else {
- LogPrintf("Setting NODE_NETWORK on non-prune mode\n");
- nLocalServices = ServiceFlags(nLocalServices | NODE_NETWORK);
+ // Prior to setting NODE_NETWORK, check if we can provide historical blocks.
+ if (!WITH_LOCK(chainman.GetMutex(), return chainman.BackgroundSyncInProgress())) {
+ LogPrintf("Setting NODE_NETWORK on non-prune mode\n");
+ nLocalServices = ServiceFlags(nLocalServices | NODE_NETWORK);
+ } else {
+ LogPrintf("Running node in NODE_NETWORK_LIMITED mode until snapshot background sync completes\n");
+ }
}
// ********************************************************* Step 11: import blocks
@@ -1758,7 +1789,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
vImportFiles.push_back(fs::PathFromString(strFile));
}
- chainman.m_thread_load = std::thread(&util::TraceThread, "initload", [=, &chainman, &args, &node] {
+ node.background_init_thread = std::thread(&util::TraceThread, "initload", [=, &chainman, &args, &node] {
ScheduleBatchPriority();
// Import blocks
ImportBlocks(chainman, vImportFiles);
diff --git a/src/init.h b/src/init.h
index 40a5da3c0b..6d8a35d80e 100644
--- a/src/init.h
+++ b/src/init.h
@@ -74,7 +74,7 @@ bool AppInitMain(node::NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip
/**
* Register all arguments with the ArgsManager
*/
-void SetupServerArgs(ArgsManager& argsman);
+void SetupServerArgs(ArgsManager& argsman, bool can_listen_ipc=false);
/** Validates requirements to run the indexes and spawns each index initial sync thread */
bool StartIndexBackgroundSync(node::NodeContext& node);
diff --git a/src/init/bitcoin-gui.cpp b/src/init/bitcoin-gui.cpp
index aceff1e40f..eae30bc995 100644
--- a/src/init/bitcoin-gui.cpp
+++ b/src/init/bitcoin-gui.cpp
@@ -34,6 +34,11 @@ public:
}
std::unique_ptr<interfaces::Echo> makeEcho() override { return interfaces::MakeEcho(); }
interfaces::Ipc* ipc() override { return m_ipc.get(); }
+ // bitcoin-gui accepts -ipcbind option even though it does not use it
+ // directly. It just returns true here to accept the option because
+ // bitcoin-node accepts the option, and bitcoin-gui accepts all bitcoin-node
+ // options and will start the node with those options.
+ bool canListenIpc() override { return true; }
node::NodeContext m_node;
std::unique_ptr<interfaces::Ipc> m_ipc;
};
diff --git a/src/init/bitcoin-node.cpp b/src/init/bitcoin-node.cpp
index 00a3822791..3f8c50b8d6 100644
--- a/src/init/bitcoin-node.cpp
+++ b/src/init/bitcoin-node.cpp
@@ -37,6 +37,7 @@ public:
}
std::unique_ptr<interfaces::Echo> makeEcho() override { return interfaces::MakeEcho(); }
interfaces::Ipc* ipc() override { return m_ipc.get(); }
+ bool canListenIpc() override { return true; }
node::NodeContext& m_node;
std::unique_ptr<interfaces::Ipc> m_ipc;
};
diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h
index af45f81f95..be596b1765 100644
--- a/src/interfaces/chain.h
+++ b/src/interfaces/chain.h
@@ -96,6 +96,17 @@ struct BlockInfo {
BlockInfo(const uint256& hash LIFETIMEBOUND) : hash(hash) {}
};
+//! The action to be taken after updating a settings value.
+//! WRITE indicates that the updated value must be written to disk,
+//! while SKIP_WRITE indicates that the change will be kept in memory-only
+//! without persisting it.
+enum class SettingsAction {
+ WRITE,
+ SKIP_WRITE
+};
+
+using SettingsUpdate = std::function<std::optional<interfaces::SettingsAction>(common::SettingsValue&)>;
+
//! Interface giving clients (wallet processes, maybe other analysis tools in
//! the future) ability to access to the chain state, receive notifications,
//! estimate fees, and submit transactions.
@@ -344,9 +355,16 @@ public:
//! Return <datadir>/settings.json setting value.
virtual common::SettingsValue getRwSetting(const std::string& name) = 0;
- //! Write a setting to <datadir>/settings.json. Optionally just update the
- //! setting in memory and do not write the file.
- virtual bool updateRwSetting(const std::string& name, const common::SettingsValue& value, bool write=true) = 0;
+ //! Updates a setting in <datadir>/settings.json.
+ //! Depending on the action returned by the update function, this will either
+ //! update the setting in memory or write the updated settings to disk.
+ virtual bool updateRwSetting(const std::string& name, const SettingsUpdate& update_function) = 0;
+
+ //! Replace a setting in <datadir>/settings.json with a new value.
+ virtual bool overwriteRwSetting(const std::string& name, common::SettingsValue& value, bool write = true) = 0;
+
+ //! Delete a given setting in <datadir>/settings.json.
+ virtual bool deleteRwSettings(const std::string& name, bool write = true) = 0;
//! Synchronously send transactionAddedToMempool notifications about all
//! current mempool transactions to the specified handler and return after
diff --git a/src/interfaces/init.h b/src/interfaces/init.h
index 094ead399d..b496ada05f 100644
--- a/src/interfaces/init.h
+++ b/src/interfaces/init.h
@@ -37,6 +37,7 @@ public:
virtual std::unique_ptr<WalletLoader> makeWalletLoader(Chain& chain) { return nullptr; }
virtual std::unique_ptr<Echo> makeEcho() { return nullptr; }
virtual Ipc* ipc() { return nullptr; }
+ virtual bool canListenIpc() { return false; }
};
//! Return implementation of Init interface for the node process. If the argv
diff --git a/src/interfaces/ipc.h b/src/interfaces/ipc.h
index 963649fc9a..fb340552c5 100644
--- a/src/interfaces/ipc.h
+++ b/src/interfaces/ipc.h
@@ -41,6 +41,11 @@ class Init;
//! to make other proxy objects calling other remote interfaces. It can also
//! destroy the initial interfaces::Init object to close the connection and
//! shut down the spawned process.
+//!
+//! When connecting to an existing process, the steps are similar to spawning a
+//! new process, except a socket is created instead of a socketpair, and
+//! destroying an Init interface doesn't end the process, since there can be
+//! multiple connections.
class Ipc
{
public:
@@ -54,6 +59,17 @@ public:
//! true. If this is not a spawned child process, return false.
virtual bool startSpawnedProcess(int argc, char* argv[], int& exit_status) = 0;
+ //! Connect to a socket address and make a client interface proxy object
+ //! using provided callback. connectAddress returns an interface pointer if
+ //! the connection was established, returns null if address is empty ("") or
+ //! disabled ("0") or if a connection was refused but not required ("auto"),
+ //! and throws an exception if there was an unexpected error.
+ virtual std::unique_ptr<Init> connectAddress(std::string& address) = 0;
+
+ //! Connect to a socket address and make a client interface proxy object
+ //! using provided callback. Throws an exception if there was an error.
+ virtual void listenAddress(std::string& address) = 0;
+
//! Add cleanup callback to remote interface that will run when the
//! interface is deleted.
template<typename Interface>
diff --git a/src/interfaces/mining.h b/src/interfaces/mining.h
index cebe97edb7..c73465bd2a 100644
--- a/src/interfaces/mining.h
+++ b/src/interfaces/mining.h
@@ -5,26 +5,45 @@
#ifndef BITCOIN_INTERFACES_MINING_H
#define BITCOIN_INTERFACES_MINING_H
-#include <node/types.h>
-#include <uint256.h>
+#include <consensus/amount.h> // for CAmount
+#include <node/types.h> // for BlockCreateOptions
+#include <primitives/block.h> // for CBlock, CBlockHeader
+#include <primitives/transaction.h> // for CTransactionRef
+#include <stdint.h> // for int64_t
+#include <uint256.h> // for uint256
-#include <memory>
-#include <optional>
+#include <memory> // for unique_ptr, shared_ptr
+#include <optional> // for optional
+#include <vector> // for vector
namespace node {
-struct CBlockTemplate;
struct NodeContext;
} // namespace node
class BlockValidationState;
-class CBlock;
class CScript;
namespace interfaces {
+//! Block template interface
+class BlockTemplate
+{
+public:
+ virtual ~BlockTemplate() = default;
+
+ virtual CBlockHeader getBlockHeader() = 0;
+ virtual CBlock getBlock() = 0;
+
+ virtual std::vector<CAmount> getTxFees() = 0;
+ virtual std::vector<int64_t> getTxSigops() = 0;
+
+ virtual CTransactionRef getCoinbaseTx() = 0;
+ virtual std::vector<unsigned char> getCoinbaseCommitment() = 0;
+ virtual int getWitnessCommitmentIndex() = 0;
+};
+
//! Interface giving clients (RPC, Stratum v2 Template Provider in the future)
//! ability to create block templates.
-
class Mining
{
public:
@@ -39,14 +58,14 @@ public:
//! Returns the hash for the tip of this chain
virtual std::optional<uint256> getTipHash() = 0;
- /**
+ /**
* Construct a new block template
*
* @param[in] script_pub_key the coinbase output
* @param[in] options options for creating the block
* @returns a block template
*/
- virtual std::unique_ptr<node::CBlockTemplate> createNewBlock(const CScript& script_pub_key, const node::BlockCreateOptions& options={}) = 0;
+ virtual std::unique_ptr<BlockTemplate> createNewBlock(const CScript& script_pub_key, const node::BlockCreateOptions& options = {}) = 0;
/**
* Processes new block. A valid new block is automatically relayed to peers.
diff --git a/src/interfaces/node.h b/src/interfaces/node.h
index 81844c6185..b87c78db52 100644
--- a/src/interfaces/node.h
+++ b/src/interfaces/node.h
@@ -7,6 +7,7 @@
#include <common/settings.h>
#include <consensus/amount.h> // For CAmount
+#include <logging.h> // For BCLog::CategoryMask
#include <net.h> // For NodeId
#include <net_types.h> // For banmap_t
#include <netaddress.h> // For Network
@@ -84,7 +85,7 @@ public:
virtual int getExitStatus() = 0;
// Get log flags.
- virtual uint32_t getLogCategories() = 0;
+ virtual BCLog::CategoryMask getLogCategories() = 0;
//! Initialize app dependencies.
virtual bool baseInitialize() = 0;
diff --git a/src/ipc/CMakeLists.txt b/src/ipc/CMakeLists.txt
new file mode 100644
index 0000000000..94b1ceb54e
--- /dev/null
+++ b/src/ipc/CMakeLists.txt
@@ -0,0 +1,18 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(bitcoin_ipc STATIC EXCLUDE_FROM_ALL
+ capnp/protocol.cpp
+ interfaces.cpp
+ process.cpp
+)
+
+target_capnp_sources(bitcoin_ipc ${PROJECT_SOURCE_DIR}
+ capnp/echo.capnp capnp/init.capnp
+)
+
+target_link_libraries(bitcoin_ipc
+ PRIVATE
+ core_interface
+)
diff --git a/src/ipc/capnp/.gitignore b/src/ipc/capnp/.gitignore
deleted file mode 100644
index 036df1430c..0000000000
--- a/src/ipc/capnp/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# capnp generated files
-*.capnp.*
diff --git a/src/ipc/capnp/protocol.cpp b/src/ipc/capnp/protocol.cpp
index 37b57a9525..4b67a5bd1e 100644
--- a/src/ipc/capnp/protocol.cpp
+++ b/src/ipc/capnp/protocol.cpp
@@ -23,6 +23,8 @@
#include <mutex>
#include <optional>
#include <string>
+#include <sys/socket.h>
+#include <system_error>
#include <thread>
namespace ipc {
@@ -30,7 +32,7 @@ namespace capnp {
namespace {
void IpcLogFn(bool raise, std::string message)
{
- LogPrint(BCLog::IPC, "%s\n", message);
+ LogDebug(BCLog::IPC, "%s\n", message);
if (raise) throw Exception(message);
}
@@ -51,11 +53,20 @@ public:
startLoop(exe_name);
return mp::ConnectStream<messages::Init>(*m_loop, fd);
}
- void serve(int fd, const char* exe_name, interfaces::Init& init) override
+ void listen(int listen_fd, const char* exe_name, interfaces::Init& init) override
+ {
+ startLoop(exe_name);
+ if (::listen(listen_fd, /*backlog=*/5) != 0) {
+ throw std::system_error(errno, std::system_category());
+ }
+ mp::ListenConnections<messages::Init>(*m_loop, listen_fd, init);
+ }
+ void serve(int fd, const char* exe_name, interfaces::Init& init, const std::function<void()>& ready_fn = {}) override
{
assert(!m_loop);
mp::g_thread_context.thread_name = mp::ThreadName(exe_name);
m_loop.emplace(exe_name, &IpcLogFn, &m_context);
+ if (ready_fn) ready_fn();
mp::ServeStream<messages::Init>(*m_loop, fd, init);
m_loop->loop();
m_loop.reset();
diff --git a/src/ipc/interfaces.cpp b/src/ipc/interfaces.cpp
index e446cc98db..33555f05d4 100644
--- a/src/ipc/interfaces.cpp
+++ b/src/ipc/interfaces.cpp
@@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <common/args.h>
#include <common/system.h>
#include <interfaces/init.h>
#include <interfaces/ipc.h>
@@ -37,11 +38,11 @@ public:
{
int pid;
int fd = m_process->spawn(new_exe_name, m_process_argv0, pid);
- LogPrint(::BCLog::IPC, "Process %s pid %i launched\n", new_exe_name, pid);
+ LogDebug(::BCLog::IPC, "Process %s pid %i launched\n", new_exe_name, pid);
auto init = m_protocol->connect(fd, m_exe_name);
Ipc::addCleanup(*init, [this, new_exe_name, pid] {
int status = m_process->waitSpawned(pid);
- LogPrint(::BCLog::IPC, "Process %s pid %i exited with status %i\n", new_exe_name, pid, status);
+ LogDebug(::BCLog::IPC, "Process %s pid %i exited with status %i\n", new_exe_name, pid, status);
});
return init;
}
@@ -56,6 +57,35 @@ public:
exit_status = EXIT_SUCCESS;
return true;
}
+ std::unique_ptr<interfaces::Init> connectAddress(std::string& address) override
+ {
+ if (address.empty() || address == "0") return nullptr;
+ int fd;
+ if (address == "auto") {
+ // Treat "auto" the same as "unix" except don't treat it an as error
+ // if the connection is not accepted. Just return null so the caller
+ // can work offline without a connection, or spawn a new
+ // bitcoin-node process and connect to it.
+ address = "unix";
+ try {
+ fd = m_process->connect(gArgs.GetDataDirNet(), "bitcoin-node", address);
+ } catch (const std::system_error& e) {
+ // If connection type is auto and socket path isn't accepting connections, or doesn't exist, catch the error and return null;
+ if (e.code() == std::errc::connection_refused || e.code() == std::errc::no_such_file_or_directory) {
+ return nullptr;
+ }
+ throw;
+ }
+ } else {
+ fd = m_process->connect(gArgs.GetDataDirNet(), "bitcoin-node", address);
+ }
+ return m_protocol->connect(fd, m_exe_name);
+ }
+ void listenAddress(std::string& address) override
+ {
+ int fd = m_process->bind(gArgs.GetDataDirNet(), m_exe_name, address);
+ m_protocol->listen(fd, m_exe_name, m_init);
+ }
void addCleanup(std::type_index type, void* iface, std::function<void()> cleanup) override
{
m_protocol->addCleanup(type, iface, std::move(cleanup));
diff --git a/src/ipc/process.cpp b/src/ipc/process.cpp
index 9657dcd092..432c365d8f 100644
--- a/src/ipc/process.cpp
+++ b/src/ipc/process.cpp
@@ -4,22 +4,28 @@
#include <ipc/process.h>
#include <ipc/protocol.h>
+#include <logging.h>
#include <mp/util.h>
#include <tinyformat.h>
#include <util/fs.h>
#include <util/strencodings.h>
+#include <util/syserror.h>
#include <cstdint>
#include <cstdlib>
+#include <errno.h>
#include <exception>
#include <iostream>
#include <stdexcept>
#include <string.h>
-#include <system_error>
+#include <sys/socket.h>
+#include <sys/un.h>
#include <unistd.h>
#include <utility>
#include <vector>
+using util::RemovePrefixView;
+
namespace ipc {
namespace {
class ProcessImpl : public Process
@@ -54,7 +60,95 @@ public:
}
return true;
}
+ int connect(const fs::path& data_dir,
+ const std::string& dest_exe_name,
+ std::string& address) override;
+ int bind(const fs::path& data_dir, const std::string& exe_name, std::string& address) override;
};
+
+static bool ParseAddress(std::string& address,
+ const fs::path& data_dir,
+ const std::string& dest_exe_name,
+ struct sockaddr_un& addr,
+ std::string& error)
+{
+ if (address.compare(0, 4, "unix") == 0 && (address.size() == 4 || address[4] == ':')) {
+ fs::path path;
+ if (address.size() <= 5) {
+ path = data_dir / fs::PathFromString(strprintf("%s.sock", RemovePrefixView(dest_exe_name, "bitcoin-")));
+ } else {
+ path = data_dir / fs::PathFromString(address.substr(5));
+ }
+ std::string path_str = fs::PathToString(path);
+ address = strprintf("unix:%s", path_str);
+ if (path_str.size() >= sizeof(addr.sun_path)) {
+ error = strprintf("Unix address path %s exceeded maximum socket path length", fs::quoted(fs::PathToString(path)));
+ return false;
+ }
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, path_str.c_str(), sizeof(addr.sun_path)-1);
+ return true;
+ }
+
+ error = strprintf("Unrecognized address '%s'", address);
+ return false;
+}
+
+int ProcessImpl::connect(const fs::path& data_dir,
+ const std::string& dest_exe_name,
+ std::string& address)
+{
+ struct sockaddr_un addr;
+ std::string error;
+ if (!ParseAddress(address, data_dir, dest_exe_name, addr, error)) {
+ throw std::invalid_argument(error);
+ }
+
+ int fd;
+ if ((fd = ::socket(addr.sun_family, SOCK_STREAM, 0)) == -1) {
+ throw std::system_error(errno, std::system_category());
+ }
+ if (::connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) {
+ return fd;
+ }
+ int connect_error = errno;
+ if (::close(fd) != 0) {
+ LogPrintf("Error closing file descriptor %i '%s': %s\n", fd, address, SysErrorString(errno));
+ }
+ throw std::system_error(connect_error, std::system_category());
+}
+
+int ProcessImpl::bind(const fs::path& data_dir, const std::string& exe_name, std::string& address)
+{
+ struct sockaddr_un addr;
+ std::string error;
+ if (!ParseAddress(address, data_dir, exe_name, addr, error)) {
+ throw std::invalid_argument(error);
+ }
+
+ if (addr.sun_family == AF_UNIX) {
+ fs::path path = addr.sun_path;
+ if (path.has_parent_path()) fs::create_directories(path.parent_path());
+ if (fs::symlink_status(path).type() == fs::file_type::socket) {
+ fs::remove(path);
+ }
+ }
+
+ int fd;
+ if ((fd = ::socket(addr.sun_family, SOCK_STREAM, 0)) == -1) {
+ throw std::system_error(errno, std::system_category());
+ }
+
+ if (::bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) {
+ return fd;
+ }
+ int bind_error = errno;
+ if (::close(fd) != 0) {
+ LogPrintf("Error closing file descriptor %i: %s\n", fd, SysErrorString(errno));
+ }
+ throw std::system_error(bind_error, std::system_category());
+}
} // namespace
std::unique_ptr<Process> MakeProcess() { return std::make_unique<ProcessImpl>(); }
diff --git a/src/ipc/process.h b/src/ipc/process.h
index 40f2d2acf6..2ed8b73fab 100644
--- a/src/ipc/process.h
+++ b/src/ipc/process.h
@@ -34,6 +34,16 @@ public:
//! process. If so, return true and a file descriptor for communicating
//! with the parent process.
virtual bool checkSpawned(int argc, char* argv[], int& fd) = 0;
+
+ //! Canonicalize and connect to address, returning socket descriptor.
+ virtual int connect(const fs::path& data_dir,
+ const std::string& dest_exe_name,
+ std::string& address) = 0;
+
+ //! Create listening socket, bind and canonicalize address, and return socket descriptor.
+ virtual int bind(const fs::path& data_dir,
+ const std::string& exe_name,
+ std::string& address) = 0;
};
//! Constructor for Process interface. Implementation will vary depending on
diff --git a/src/ipc/protocol.h b/src/ipc/protocol.h
index 4cd892e411..b2ebf99e8c 100644
--- a/src/ipc/protocol.h
+++ b/src/ipc/protocol.h
@@ -25,12 +25,38 @@ public:
//! Return Init interface that forwards requests over given socket descriptor.
//! Socket communication is handled on a background thread.
+ //!
+ //! @note It could be potentially useful in the future to add
+ //! std::function<void()> on_disconnect callback argument here. But there
+ //! isn't an immediate need, because the protocol implementation can clean
+ //! up its own state (calling ProxyServer destructors, etc) on disconnect,
+ //! and any client calls will just throw ipc::Exception errors after a
+ //! disconnect.
virtual std::unique_ptr<interfaces::Init> connect(int fd, const char* exe_name) = 0;
+ //! Listen for connections on provided socket descriptor, accept them, and
+ //! handle requests on accepted connections. This method doesn't block, and
+ //! performs I/O on a background thread.
+ virtual void listen(int listen_fd, const char* exe_name, interfaces::Init& init) = 0;
+
//! Handle requests on provided socket descriptor, forwarding them to the
//! provided Init interface. Socket communication is handled on the
//! current thread, and this call blocks until the socket is closed.
- virtual void serve(int fd, const char* exe_name, interfaces::Init& init) = 0;
+ //!
+ //! @note: If this method is called, it needs be called before connect() or
+ //! listen() methods, because for ease of implementation it's inflexible and
+ //! always runs the event loop in the foreground thread. It can share its
+ //! event loop with the other methods but can't share an event loop that was
+ //! created by them. This isn't really a problem because serve() is only
+ //! called by spawned child processes that call it immediately to
+ //! communicate back with parent processes.
+ //
+ //! The optional `ready_fn` callback will be called after the event loop is
+ //! created but before it is started. This can be useful in tests to trigger
+ //! client connections from another thread as soon as the event loop is
+ //! available, but should not be neccessary in normal code which starts
+ //! clients and servers independently.
+ virtual void serve(int fd, const char* exe_name, interfaces::Init& init, const std::function<void()>& ready_fn = {}) = 0;
//! Add cleanup callback to interface that will run when the interface is
//! deleted.
diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt
new file mode 100644
index 0000000000..65d753b3af
--- /dev/null
+++ b/src/kernel/CMakeLists.txt
@@ -0,0 +1,146 @@
+# Copyright (c) 2024-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+# TODO: libbitcoinkernel is a work in progress consensus engine
+# library, as more and more modules are decoupled from the
+# consensus engine, this list will shrink to only those
+# which are absolutely necessary.
+add_library(bitcoinkernel
+ bitcoinkernel.cpp
+ chain.cpp
+ checks.cpp
+ chainparams.cpp
+ coinstats.cpp
+ context.cpp
+ cs_main.cpp
+ disconnected_transactions.cpp
+ mempool_removal_reason.cpp
+ ../arith_uint256.cpp
+ ../chain.cpp
+ ../coins.cpp
+ ../compressor.cpp
+ ../consensus/merkle.cpp
+ ../consensus/tx_check.cpp
+ ../consensus/tx_verify.cpp
+ ../core_read.cpp
+ ../dbwrapper.cpp
+ ../deploymentinfo.cpp
+ ../deploymentstatus.cpp
+ ../flatfile.cpp
+ ../hash.cpp
+ ../logging.cpp
+ ../node/blockstorage.cpp
+ ../node/chainstate.cpp
+ ../node/utxo_snapshot.cpp
+ ../policy/feerate.cpp
+ ../policy/packages.cpp
+ ../policy/policy.cpp
+ ../policy/rbf.cpp
+ ../policy/settings.cpp
+ ../policy/truc_policy.cpp
+ ../pow.cpp
+ ../primitives/block.cpp
+ ../primitives/transaction.cpp
+ ../pubkey.cpp
+ ../random.cpp
+ ../randomenv.cpp
+ ../script/interpreter.cpp
+ ../script/script.cpp
+ ../script/script_error.cpp
+ ../script/sigcache.cpp
+ ../script/solver.cpp
+ ../signet.cpp
+ ../streams.cpp
+ ../support/lockedpool.cpp
+ ../sync.cpp
+ ../txdb.cpp
+ ../txmempool.cpp
+ ../uint256.cpp
+ ../util/chaintype.cpp
+ ../util/check.cpp
+ ../util/feefrac.cpp
+ ../util/fs.cpp
+ ../util/fs_helpers.cpp
+ ../util/hasher.cpp
+ ../util/moneystr.cpp
+ ../util/rbf.cpp
+ ../util/serfloat.cpp
+ ../util/signalinterrupt.cpp
+ ../util/strencodings.cpp
+ ../util/string.cpp
+ ../util/syserror.cpp
+ ../util/threadnames.cpp
+ ../util/time.cpp
+ ../util/tokenpipe.cpp
+ ../validation.cpp
+ ../validationinterface.cpp
+ ../versionbits.cpp
+)
+target_link_libraries(bitcoinkernel
+ PRIVATE
+ core_interface
+ bitcoin_clientversion
+ bitcoin_crypto
+ leveldb
+ secp256k1
+ PUBLIC
+ Boost::headers
+)
+
+# libbitcoinkernel requires default symbol visibility, explicitly
+# specify that here so that things still work even when user
+# configures with -DREDUCE_EXPORTS=ON
+#
+# Note this is a quick hack that will be removed as we
+# incrementally define what to export from the library.
+set_target_properties(bitcoinkernel PROPERTIES
+ CXX_VISIBILITY_PRESET default
+)
+
+# When building the static library, install all static libraries the
+# bitcoinkernel depends on.
+if(NOT BUILD_SHARED_LIBS)
+ # Recursively get all the static libraries a target depends on and put them in libs_out
+ function(get_target_static_link_libs target libs_out)
+ get_target_property(linked_libraries ${target} LINK_LIBRARIES)
+ foreach(dep ${linked_libraries})
+ if(TARGET ${dep})
+ get_target_property(dep_type ${dep} TYPE)
+ if(dep_type STREQUAL "STATIC_LIBRARY")
+ list(APPEND ${libs_out} ${dep})
+ get_target_static_link_libs(${dep} ${libs_out})
+ endif()
+ endif()
+ endforeach()
+ set(${libs_out} ${${libs_out}} PARENT_SCOPE)
+ endfunction()
+
+ set(all_kernel_static_link_libs "")
+ get_target_static_link_libs(bitcoinkernel all_kernel_static_link_libs)
+
+ # LIBS_PRIVATE is substituted in the pkg-config file.
+ set(LIBS_PRIVATE "")
+ foreach(lib ${all_kernel_static_link_libs})
+ install(TARGETS ${lib} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+ string(APPEND LIBS_PRIVATE " -l${lib}")
+ endforeach()
+
+ string(STRIP "${LIBS_PRIVATE}" LIBS_PRIVATE)
+endif()
+
+configure_file(${PROJECT_SOURCE_DIR}/libbitcoinkernel.pc.in ${PROJECT_BINARY_DIR}/libbitcoinkernel.pc @ONLY)
+install(FILES ${PROJECT_BINARY_DIR}/libbitcoinkernel.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+
+include(GNUInstallDirs)
+install(TARGETS bitcoinkernel
+ RUNTIME
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
+ COMPONENT Kernel
+ LIBRARY
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ COMPONENT Kernel
+ ARCHIVE
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ COMPONENT Kernel
+)
diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp
index 4fd2d5e2d0..18c2026a88 100644
--- a/src/kernel/chainparams.cpp
+++ b/src/kernel/chainparams.cpp
@@ -26,6 +26,8 @@
#include <cstring>
#include <type_traits>
+using namespace util::hex_literals;
+
// Workaround MSVC bug triggering C7595 when calling consteval constructors in
// initializer lists.
// A fix may be on the way:
@@ -71,7 +73,7 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
- const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
+ const CScript genesisOutputScript = CScript() << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex_v_u8 << OP_CHECKSIG;
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}
@@ -115,8 +117,8 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1628640000; // August 11th, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 709632; // Approximately November 12th, 2021
- consensus.nMinimumChainWork = uint256{"000000000000000000000000000000000000000063c4ebd298db40af57541800"};
- consensus.defaultAssumeValid = uint256{"000000000000000000026811d149d4d261995ec5b3f64f439a0a10e1a464af9a"}; // 824000
+ consensus.nMinimumChainWork = uint256{"000000000000000000000000000000000000000088e186b70e0862c193ec44d6"};
+ consensus.defaultAssumeValid = uint256{"000000000000000000011c5890365bdbe5d25b97ce0057589acaef4f1a57263f"}; // 856760
/**
* The message start string is designed to be unlikely to occur in normal data.
@@ -129,8 +131,8 @@ public:
pchMessageStart[3] = 0xd9;
nDefaultPort = 8333;
nPruneAfterHeight = 100000;
- m_assumed_blockchain_size = 600;
- m_assumed_chain_state_size = 10;
+ m_assumed_blockchain_size = 620;
+ m_assumed_chain_state_size = 14;
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
@@ -145,7 +147,6 @@ public:
vSeeds.emplace_back("seed.bitcoin.sipa.be."); // Pieter Wuille, only supports x1, x5, x9, and xd
vSeeds.emplace_back("dnsseed.bluematt.me."); // Matt Corallo, only supports x9
vSeeds.emplace_back("dnsseed.bitcoin.dashjr-list-of-p2p-nodes.us."); // Luke Dashjr
- vSeeds.emplace_back("seed.bitcoinstats.com."); // Christian Decker, supports x1 - xf
vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch."); // Jonas Schnelli, only supports x1, x5, x9, and xd
vSeeds.emplace_back("seed.btc.petertodd.net."); // Peter Todd, only supports x1, x5, x9, and xd
vSeeds.emplace_back("seed.bitcoin.sprovoost.nl."); // Sjors Provoost
@@ -194,10 +195,10 @@ public:
};
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 000000000000000000026811d149d4d261995ec5b3f64f439a0a10e1a464af9a
- .nTime = 1704194835,
- .tx_count = 946728933,
- .dTxRate = 6.569290261471664,
+ // Data from RPC: getchaintxstats 4096 000000000000000000011c5890365bdbe5d25b97ce0057589acaef4f1a57263f
+ .nTime = 1723649144,
+ .tx_count = 1059312821,
+ .dTxRate = 6.721086701157182,
};
}
};
@@ -240,8 +241,8 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1628640000; // August 11th, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
- consensus.nMinimumChainWork = uint256{"000000000000000000000000000000000000000000000c59b14e264ba6c15db9"};
- consensus.defaultAssumeValid = uint256{"000000000001323071f38f21ea5aae529ece491eadaccce506a59bcc2d968917"}; // 2550000
+ consensus.nMinimumChainWork = uint256{"000000000000000000000000000000000000000000000f209695166be8b61fa9"};
+ consensus.defaultAssumeValid = uint256{"000000000000000465b1a66c9f386308e8c75acef9201f3f577811da09fc90ad"}; // 2873500
pchMessageStart[0] = 0x0b;
pchMessageStart[1] = 0x11;
@@ -249,8 +250,8 @@ public:
pchMessageStart[3] = 0x07;
nDefaultPort = 18333;
nPruneAfterHeight = 1000;
- m_assumed_blockchain_size = 42;
- m_assumed_chain_state_size = 3;
+ m_assumed_blockchain_size = 93;
+ m_assumed_chain_state_size = 19;
genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
@@ -295,10 +296,10 @@ public:
};
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 000000000001323071f38f21ea5aae529ece491eadaccce506a59bcc2d968917
- .nTime = 1703579240,
- .tx_count = 67845391,
- .dTxRate = 1.464436832560951,
+ // Data from RPC: getchaintxstats 4096 000000000000000465b1a66c9f386308e8c75acef9201f3f577811da09fc90ad
+ .nTime = 1723613341,
+ .tx_count = 187917082,
+ .dTxRate = 3.265051477698455,
};
}
};
@@ -320,7 +321,7 @@ public:
consensus.CSVHeight = 1;
consensus.SegwitHeight = 1;
consensus.MinBIP9WarningHeight = 0;
- consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
+ consensus.powLimit = uint256{"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = true;
@@ -339,8 +340,8 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
- consensus.nMinimumChainWork = uint256{"000000000000000000000000000000000000000000000056faca98a0cd9bdf5f"};
- consensus.defaultAssumeValid = uint256{};
+ consensus.nMinimumChainWork = uint256{"00000000000000000000000000000000000000000000005faa15d02e6202f3ba"};
+ consensus.defaultAssumeValid = uint256{"000000005be348057db991fa5d89fe7c4695b667cfb311391a8db374b6f681fd"}; // 39550
pchMessageStart[0] = 0x1c;
pchMessageStart[1] = 0x16;
@@ -348,11 +349,11 @@ public:
pchMessageStart[3] = 0x28;
nDefaultPort = 48333;
nPruneAfterHeight = 1000;
- m_assumed_blockchain_size = 0;
+ m_assumed_blockchain_size = 1;
m_assumed_chain_state_size = 0;
const char* testnet4_genesis_msg = "03/May/2024 000000000000000000001ebd58c244970b3aa9d783bb001011fbe8ea8e98e00e";
- const CScript testnet4_genesis_script = CScript() << ParseHex("000000000000000000000000000000000000000000000000000000000000000000") << OP_CHECKSIG;
+ const CScript testnet4_genesis_script = CScript() << "000000000000000000000000000000000000000000000000000000000000000000"_hex_v_u8 << OP_CHECKSIG;
genesis = CreateGenesisBlock(testnet4_genesis_msg,
testnet4_genesis_script,
1714777860,
@@ -361,8 +362,8 @@ public:
1,
50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
- assert(consensus.hashGenesisBlock == uint256S("0x00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be350b0da8bf043"));
- assert(genesis.hashMerkleRoot == uint256S("0x7aa0a7ae1e223414cb807e40cd57e667b718e42aaf9306db9102fe28912b7b4e"));
+ assert(consensus.hashGenesisBlock == uint256{"00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be350b0da8bf043"});
+ assert(genesis.hashMerkleRoot == uint256{"7aa0a7ae1e223414cb807e40cd57e667b718e42aaf9306db9102fe28912b7b4e"});
vFixedSeeds.clear();
vSeeds.clear();
@@ -394,9 +395,10 @@ public:
};
chainTxData = ChainTxData{
- .nTime = 0,
- .tx_count = 0,
- .dTxRate = 0,
+ // Data from RPC: getchaintxstats 4096 000000005be348057db991fa5d89fe7c4695b667cfb311391a8db374b6f681fd
+ .nTime = 1723651702,
+ .tx_count = 757229,
+ .dTxRate = 0.01570402633472492,
};
}
};
@@ -412,7 +414,7 @@ public:
vSeeds.clear();
if (!options.challenge) {
- bin = ParseHex("512103ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430210359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c452ae");
+ bin = "512103ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430210359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c452ae"_hex_v_u8;
vSeeds.emplace_back("seed.signet.bitcoin.sprovoost.nl.");
vSeeds.emplace_back("seed.signet.achownodes.xyz."); // Ava Chow, only supports x1, x5, x9, x49, x809, x849, xd, x400, x404, x408, x448, xc08, xc48, x40c
@@ -420,15 +422,15 @@ public:
vSeeds.emplace_back("178.128.221.177");
vSeeds.emplace_back("v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333");
- consensus.nMinimumChainWork = uint256{"00000000000000000000000000000000000000000000000000000206e86f08e8"};
- consensus.defaultAssumeValid = uint256{"0000000870f15246ba23c16e370a7ffb1fc8a3dcf8cb4492882ed4b0e3d4cd26"}; // 180000
- m_assumed_blockchain_size = 1;
+ consensus.nMinimumChainWork = uint256{"0000000000000000000000000000000000000000000000000000025dbd66e58f"};
+ consensus.defaultAssumeValid = uint256{"0000014aad1d58dddcb964dd749b073374c6306e716b22f573a2efe68d414539"}; // 208800
+ m_assumed_blockchain_size = 2;
m_assumed_chain_state_size = 0;
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 0000000870f15246ba23c16e370a7ffb1fc8a3dcf8cb4492882ed4b0e3d4cd26
- .nTime = 1706331472,
- .tx_count = 2425380,
- .dTxRate = 0.008277759863833788,
+ // Data from RPC: getchaintxstats 4096 0000014aad1d58dddcb964dd749b073374c6306e716b22f573a2efe68d414539
+ .nTime = 1723655233,
+ .tx_count = 5507045,
+ .dTxRate = 0.06271073277261494,
};
} else {
bin = *options.challenge;
@@ -537,10 +539,10 @@ public:
consensus.SegwitHeight = 0; // Always active unless overridden
consensus.MinBIP9WarningHeight = 0;
consensus.powLimit = uint256{"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
- consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
+ consensus.nPowTargetTimespan = 24 * 60 * 60; // one day
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = true;
- consensus.enforce_BIP94 = false;
+ consensus.enforce_BIP94 = true;
consensus.fPowNoRetargeting = true;
consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
@@ -694,15 +696,15 @@ std::optional<ChainType> GetNetworkForMagic(const MessageStartChars& message)
const auto regtest_msg = CChainParams::RegTest({})->MessageStart();
const auto signet_msg = CChainParams::SigNet({})->MessageStart();
- if (std::equal(message.begin(), message.end(), mainnet_msg.data())) {
+ if (std::ranges::equal(message, mainnet_msg)) {
return ChainType::MAIN;
- } else if (std::equal(message.begin(), message.end(), testnet_msg.data())) {
+ } else if (std::ranges::equal(message, testnet_msg)) {
return ChainType::TESTNET;
- } else if (std::equal(message.begin(), message.end(), testnet4_msg.data())) {
+ } else if (std::ranges::equal(message, testnet4_msg)) {
return ChainType::TESTNET4;
- } else if (std::equal(message.begin(), message.end(), regtest_msg.data())) {
+ } else if (std::ranges::equal(message, regtest_msg)) {
return ChainType::REGTEST;
- } else if (std::equal(message.begin(), message.end(), signet_msg.data())) {
+ } else if (std::ranges::equal(message, signet_msg)) {
return ChainType::SIGNET;
}
return std::nullopt;
diff --git a/src/logging.h b/src/logging.h
index 2ff58979cb..d583419d3a 100644
--- a/src/logging.h
+++ b/src/logging.h
@@ -37,40 +37,41 @@ struct LogCategory {
};
namespace BCLog {
- enum LogFlags : uint32_t {
- NONE = 0,
- NET = (1 << 0),
- TOR = (1 << 1),
- MEMPOOL = (1 << 2),
- HTTP = (1 << 3),
- BENCH = (1 << 4),
- ZMQ = (1 << 5),
- WALLETDB = (1 << 6),
- RPC = (1 << 7),
- ESTIMATEFEE = (1 << 8),
- ADDRMAN = (1 << 9),
- SELECTCOINS = (1 << 10),
- REINDEX = (1 << 11),
- CMPCTBLOCK = (1 << 12),
- RAND = (1 << 13),
- PRUNE = (1 << 14),
- PROXY = (1 << 15),
- MEMPOOLREJ = (1 << 16),
- LIBEVENT = (1 << 17),
- COINDB = (1 << 18),
- QT = (1 << 19),
- LEVELDB = (1 << 20),
- VALIDATION = (1 << 21),
- I2P = (1 << 22),
- IPC = (1 << 23),
+ using CategoryMask = uint64_t;
+ enum LogFlags : CategoryMask {
+ NONE = CategoryMask{0},
+ NET = (CategoryMask{1} << 0),
+ TOR = (CategoryMask{1} << 1),
+ MEMPOOL = (CategoryMask{1} << 2),
+ HTTP = (CategoryMask{1} << 3),
+ BENCH = (CategoryMask{1} << 4),
+ ZMQ = (CategoryMask{1} << 5),
+ WALLETDB = (CategoryMask{1} << 6),
+ RPC = (CategoryMask{1} << 7),
+ ESTIMATEFEE = (CategoryMask{1} << 8),
+ ADDRMAN = (CategoryMask{1} << 9),
+ SELECTCOINS = (CategoryMask{1} << 10),
+ REINDEX = (CategoryMask{1} << 11),
+ CMPCTBLOCK = (CategoryMask{1} << 12),
+ RAND = (CategoryMask{1} << 13),
+ PRUNE = (CategoryMask{1} << 14),
+ PROXY = (CategoryMask{1} << 15),
+ MEMPOOLREJ = (CategoryMask{1} << 16),
+ LIBEVENT = (CategoryMask{1} << 17),
+ COINDB = (CategoryMask{1} << 18),
+ QT = (CategoryMask{1} << 19),
+ LEVELDB = (CategoryMask{1} << 20),
+ VALIDATION = (CategoryMask{1} << 21),
+ I2P = (CategoryMask{1} << 22),
+ IPC = (CategoryMask{1} << 23),
#ifdef DEBUG_LOCKCONTENTION
- LOCK = (1 << 24),
+ LOCK = (CategoryMask{1} << 24),
#endif
- BLOCKSTORAGE = (1 << 25),
- TXRECONCILIATION = (1 << 26),
- SCAN = (1 << 27),
- TXPACKAGES = (1 << 28),
- ALL = ~(uint32_t)0,
+ BLOCKSTORAGE = (CategoryMask{1} << 25),
+ TXRECONCILIATION = (CategoryMask{1} << 26),
+ SCAN = (CategoryMask{1} << 27),
+ TXPACKAGES = (CategoryMask{1} << 28),
+ ALL = ~NONE,
};
enum class Level {
Trace = 0, // High-volume or detailed logging for development/debugging
@@ -119,7 +120,7 @@ namespace BCLog {
std::atomic<Level> m_log_level{DEFAULT_LOG_LEVEL};
/** Log categories bitfield. */
- std::atomic<uint32_t> m_categories{BCLog::NONE};
+ std::atomic<CategoryMask> m_categories{BCLog::NONE};
void FormatLogStrInPlace(std::string& str, LogFlags category, Level level, std::string_view source_file, int source_line, std::string_view logging_function, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const;
@@ -204,7 +205,7 @@ namespace BCLog {
void SetLogLevel(Level level) { m_log_level = level; }
bool SetLogLevel(std::string_view level);
- uint32_t GetCategoryMask() const { return m_categories.load(); }
+ CategoryMask GetCategoryMask() const { return m_categories.load(); }
void EnableCategory(LogFlags flag);
bool EnableCategory(std::string_view str);
@@ -272,7 +273,6 @@ static inline void LogPrintf_(std::string_view logging_function, std::string_vie
// Deprecated unconditional logging.
#define LogPrintf(...) LogInfo(__VA_ARGS__)
-#define LogPrintfCategory(category, ...) LogPrintLevel_(category, BCLog::Level::Info, __VA_ARGS__)
// Use a macro instead of a function for conditional logging to prevent
// evaluating arguments when logging for the category is not enabled.
@@ -289,7 +289,4 @@ static inline void LogPrintf_(std::string_view logging_function, std::string_vie
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
#define LogTrace(category, ...) LogPrintLevel(category, BCLog::Level::Trace, __VA_ARGS__)
-// Deprecated conditional logging
-#define LogPrint(category, ...) LogDebug(category, __VA_ARGS__)
-
#endif // BITCOIN_LOGGING_H
diff --git a/src/logging/timer.h b/src/logging/timer.h
index 993ba99c25..0a6813cdd5 100644
--- a/src/logging/timer.h
+++ b/src/logging/timer.h
@@ -55,7 +55,7 @@ public:
if (m_log_category == BCLog::LogFlags::ALL) {
LogPrintf("%s\n", full_msg);
} else {
- LogPrint(m_log_category, "%s\n", full_msg);
+ LogDebug(m_log_category, "%s\n", full_msg);
}
}
@@ -87,7 +87,7 @@ private:
//! A descriptive message of what is being timed.
const std::string m_title;
- //! Forwarded on to LogPrint if specified - has the effect of only
+ //! Forwarded on to LogDebug if specified - has the effect of only
//! outputting the timing log when a particular debug= category is specified.
const BCLog::LogFlags m_log_category;
diff --git a/src/net.cpp b/src/net.cpp
index e1206745a4..d87adcc031 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -46,13 +46,12 @@
#include <algorithm>
#include <array>
+#include <cmath>
#include <cstdint>
#include <functional>
#include <optional>
#include <unordered_map>
-#include <math.h>
-
/** Maximum number of block-relay-only anchor connections */
static constexpr size_t MAX_BLOCK_RELAY_ONLY_ANCHORS = 2;
static_assert (MAX_BLOCK_RELAY_ONLY_ANCHORS <= static_cast<size_t>(MAX_BLOCK_RELAY_ONLY_CONNECTIONS), "MAX_BLOCK_RELAY_ONLY_ANCHORS must not exceed MAX_BLOCK_RELAY_ONLY_CONNECTIONS.");
@@ -65,6 +64,9 @@ static constexpr std::chrono::minutes DUMP_PEERS_INTERVAL{15};
/** Number of DNS seeds to query when the number of connections is low. */
static constexpr int DNSSEEDS_TO_QUERY_AT_ONCE = 3;
+/** Minimum number of outbound connections under which we will keep fetching our address seeds. */
+static constexpr int SEED_OUTBOUND_CONNECTION_THRESHOLD = 2;
+
/** How long to delay before querying DNS seeds
*
* If we have more than THRESHOLD entries in addrman, then it's likely
@@ -202,7 +204,7 @@ static std::vector<CAddress> ConvertSeeds(const std::vector<uint8_t> &vSeedsIn)
s >> endpoint;
CAddress addr{endpoint, SeedsServiceFlags()};
addr.nTime = rng.rand_uniform_delay(Now<NodeSeconds>() - one_week, -one_week);
- LogPrint(BCLog::NET, "Added hardcoded seed: %s\n", addr.ToStringAddrPort());
+ LogDebug(BCLog::NET, "Added hardcoded seed: %s\n", addr.ToStringAddrPort());
vSeedsOut.push_back(addr);
}
return vSeedsOut;
@@ -255,7 +257,7 @@ std::optional<CService> GetLocalAddrForPeer(CNode& node)
}
}
if (addrLocal.IsRoutable()) {
- LogPrint(BCLog::NET, "Advertising address %s to peer=%d\n", addrLocal.ToStringAddrPort(), node.GetId());
+ LogDebug(BCLog::NET, "Advertising address %s to peer=%d\n", addrLocal.ToStringAddrPort(), node.GetId());
return addrLocal;
}
// Address is unroutable. Don't advertise.
@@ -421,7 +423,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
for (const auto& r : resolved) {
addrConnect = CAddress{MaybeFlipIPv6toCJDNS(r), NODE_NONE};
if (!addrConnect.IsValid()) {
- LogPrint(BCLog::NET, "Resolver returned invalid address %s for %s\n", addrConnect.ToStringAddrPort(), pszDest);
+ LogDebug(BCLog::NET, "Resolver returned invalid address %s for %s\n", addrConnect.ToStringAddrPort(), pszDest);
return nullptr;
}
// It is possible that we already have a connection to the IP/port pszDest resolved to.
@@ -551,7 +553,7 @@ void CNode::CloseSocketDisconnect()
fDisconnect = true;
LOCK(m_sock_mutex);
if (m_sock) {
- LogPrint(BCLog::NET, "disconnecting peer=%d\n", id);
+ LogDebug(BCLog::NET, "disconnecting peer=%d\n", id);
m_sock.reset();
}
m_i2p_sam_session.reset();
@@ -720,19 +722,19 @@ int V1Transport::readHeader(Span<const uint8_t> msg_bytes)
hdrbuf >> hdr;
}
catch (const std::exception&) {
- LogPrint(BCLog::NET, "Header error: Unable to deserialize, peer=%d\n", m_node_id);
+ LogDebug(BCLog::NET, "Header error: Unable to deserialize, peer=%d\n", m_node_id);
return -1;
}
// Check start string, network magic
if (hdr.pchMessageStart != m_magic_bytes) {
- LogPrint(BCLog::NET, "Header error: Wrong MessageStart %s received, peer=%d\n", HexStr(hdr.pchMessageStart), m_node_id);
+ LogDebug(BCLog::NET, "Header error: Wrong MessageStart %s received, peer=%d\n", HexStr(hdr.pchMessageStart), m_node_id);
return -1;
}
// reject messages larger than MAX_SIZE or MAX_PROTOCOL_MESSAGE_LENGTH
if (hdr.nMessageSize > MAX_SIZE || hdr.nMessageSize > MAX_PROTOCOL_MESSAGE_LENGTH) {
- LogPrint(BCLog::NET, "Header error: Size too large (%s, %u bytes), peer=%d\n", SanitizeString(hdr.GetCommand()), hdr.nMessageSize, m_node_id);
+ LogDebug(BCLog::NET, "Header error: Size too large (%s, %u bytes), peer=%d\n", SanitizeString(hdr.GetCommand()), hdr.nMessageSize, m_node_id);
return -1;
}
@@ -791,14 +793,14 @@ CNetMessage V1Transport::GetReceivedMessage(const std::chrono::microseconds time
// Check checksum and header message type string
if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0) {
- LogPrint(BCLog::NET, "Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n",
+ LogDebug(BCLog::NET, "Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n",
SanitizeString(msg.m_type), msg.m_message_size,
HexStr(Span{hash}.first(CMessageHeader::CHECKSUM_SIZE)),
HexStr(hdr.pchChecksum),
m_node_id);
reject_message = true;
} else if (!hdr.IsCommandValid()) {
- LogPrint(BCLog::NET, "Header error: Invalid message type (%s, %u bytes), peer=%d\n",
+ LogDebug(BCLog::NET, "Header error: Invalid message type (%s, %u bytes), peer=%d\n",
SanitizeString(hdr.GetCommand()), msg.m_message_size, m_node_id);
reject_message = true;
}
@@ -1101,7 +1103,7 @@ bool V2Transport::ProcessReceivedKeyBytes() noexcept
static constexpr size_t OFFSET = std::tuple_size_v<MessageStartChars>;
if (!m_initiating && m_recv_buffer.size() >= OFFSET + MATCH.size()) {
if (std::equal(MATCH.begin(), MATCH.end(), m_recv_buffer.begin() + OFFSET)) {
- LogPrint(BCLog::NET, "V2 transport error: V1 peer with wrong MessageStart %s\n",
+ LogDebug(BCLog::NET, "V2 transport error: V1 peer with wrong MessageStart %s\n",
HexStr(Span(m_recv_buffer).first(OFFSET)));
return false;
}
@@ -1150,7 +1152,7 @@ bool V2Transport::ProcessReceivedGarbageBytes() noexcept
Assume(m_recv_state == RecvState::GARB_GARBTERM);
Assume(m_recv_buffer.size() <= MAX_GARBAGE_LEN + BIP324Cipher::GARBAGE_TERMINATOR_LEN);
if (m_recv_buffer.size() >= BIP324Cipher::GARBAGE_TERMINATOR_LEN) {
- if (MakeByteSpan(m_recv_buffer).last(BIP324Cipher::GARBAGE_TERMINATOR_LEN) == m_cipher.GetReceiveGarbageTerminator()) {
+ if (std::ranges::equal(MakeByteSpan(m_recv_buffer).last(BIP324Cipher::GARBAGE_TERMINATOR_LEN), m_cipher.GetReceiveGarbageTerminator())) {
// Garbage terminator received. Store garbage to authenticate it as AAD later.
m_recv_aad = std::move(m_recv_buffer);
m_recv_aad.resize(m_recv_aad.size() - BIP324Cipher::GARBAGE_TERMINATOR_LEN);
@@ -1159,7 +1161,7 @@ bool V2Transport::ProcessReceivedGarbageBytes() noexcept
} else if (m_recv_buffer.size() == MAX_GARBAGE_LEN + BIP324Cipher::GARBAGE_TERMINATOR_LEN) {
// We've reached the maximum length for garbage + garbage terminator, and the
// terminator still does not match. Abort.
- LogPrint(BCLog::NET, "V2 transport error: missing garbage terminator, peer=%d\n", m_nodeid);
+ LogDebug(BCLog::NET, "V2 transport error: missing garbage terminator, peer=%d\n", m_nodeid);
return false;
} else {
// We still need to receive more garbage and/or garbage terminator bytes.
@@ -1188,7 +1190,7 @@ bool V2Transport::ProcessReceivedPacketBytes() noexcept
// Length descriptor received.
m_recv_len = m_cipher.DecryptLength(MakeByteSpan(m_recv_buffer));
if (m_recv_len > MAX_CONTENTS_LEN) {
- LogPrint(BCLog::NET, "V2 transport error: packet too large (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
+ LogDebug(BCLog::NET, "V2 transport error: packet too large (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
return false;
}
} else if (m_recv_buffer.size() > BIP324Cipher::LENGTH_LEN && m_recv_buffer.size() == m_recv_len + BIP324Cipher::EXPANSION) {
@@ -1203,7 +1205,7 @@ bool V2Transport::ProcessReceivedPacketBytes() noexcept
/*ignore=*/ignore,
/*contents=*/MakeWritableByteSpan(m_recv_decode_buffer));
if (!ret) {
- LogPrint(BCLog::NET, "V2 transport error: packet decryption failure (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
+ LogDebug(BCLog::NET, "V2 transport error: packet decryption failure (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
return false;
}
// We have decrypted a valid packet with the AAD we expected, so clear the expected AAD.
@@ -1439,7 +1441,7 @@ CNetMessage V2Transport::GetReceivedMessage(std::chrono::microseconds time, bool
msg.m_recv.resize(contents.size());
std::copy(contents.begin(), contents.end(), UCharCast(msg.m_recv.data()));
} else {
- LogPrint(BCLog::NET, "V2 transport error: invalid message type (%u bytes contents), peer=%d\n", m_recv_decode_buffer.size(), m_nodeid);
+ LogDebug(BCLog::NET, "V2 transport error: invalid message type (%u bytes contents), peer=%d\n", m_recv_decode_buffer.size(), m_nodeid);
reject_message = true;
}
ClearShrink(m_recv_decode_buffer);
@@ -1504,7 +1506,7 @@ void V2Transport::MarkBytesSent(size_t bytes_sent) noexcept
if (m_send_state == SendState::V1) return m_v1_fallback.MarkBytesSent(bytes_sent);
if (m_send_state == SendState::AWAITING_KEY && m_send_pos == 0 && bytes_sent > 0) {
- LogPrint(BCLog::NET, "start sending v2 handshake to peer=%d\n", m_nodeid);
+ LogDebug(BCLog::NET, "start sending v2 handshake to peer=%d\n", m_nodeid);
}
m_send_pos += bytes_sent;
@@ -1628,7 +1630,7 @@ std::pair<size_t, bool> CConnman::SocketSendData(CNode& node) const
// error
int nErr = WSAGetLastError();
if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) {
- LogPrint(BCLog::NET, "socket send error for peer=%d: %s\n", node.GetId(), NetworkErrorString(nErr));
+ LogDebug(BCLog::NET, "socket send error for peer=%d: %s\n", node.GetId(), NetworkErrorString(nErr));
node.CloseSocketDisconnect();
}
}
@@ -1688,7 +1690,7 @@ bool CConnman::AttemptToEvictConnection()
LOCK(m_nodes_mutex);
for (CNode* pnode : m_nodes) {
if (pnode->GetId() == *node_id_to_evict) {
- LogPrint(BCLog::NET, "selected %s connection for eviction peer=%d; disconnecting\n", pnode->ConnectionTypeAsString(), pnode->GetId());
+ LogDebug(BCLog::NET, "selected %s connection for eviction peer=%d; disconnecting\n", pnode->ConnectionTypeAsString(), pnode->GetId());
pnode->fDisconnect = true;
return true;
}
@@ -1741,7 +1743,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
}
if (!fNetworkActive) {
- LogPrint(BCLog::NET, "connection from %s dropped: not accepting new connections\n", addr.ToStringAddrPort());
+ LogDebug(BCLog::NET, "connection from %s dropped: not accepting new connections\n", addr.ToStringAddrPort());
return;
}
@@ -1754,7 +1756,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
// on all platforms. Set it again here just to be sure.
const int on{1};
if (sock->SetSockOpt(IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == SOCKET_ERROR) {
- LogPrint(BCLog::NET, "connection from %s: unable to set TCP_NODELAY, continuing anyway\n",
+ LogDebug(BCLog::NET, "connection from %s: unable to set TCP_NODELAY, continuing anyway\n",
addr.ToStringAddrPort());
}
@@ -1762,7 +1764,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
bool banned = m_banman && m_banman->IsBanned(addr);
if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && banned)
{
- LogPrint(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToStringAddrPort());
+ LogDebug(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToStringAddrPort());
return;
}
@@ -1770,7 +1772,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
bool discouraged = m_banman && m_banman->IsDiscouraged(addr);
if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && nInbound + 1 >= m_max_inbound && discouraged)
{
- LogPrint(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToStringAddrPort());
+ LogDebug(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToStringAddrPort());
return;
}
@@ -1778,7 +1780,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
{
if (!AttemptToEvictConnection()) {
// No connection to evict, disconnect the new connection
- LogPrint(BCLog::NET, "failed to find an eviction candidate - connection dropped (full)\n");
+ LogDebug(BCLog::NET, "failed to find an eviction candidate - connection dropped (full)\n");
return;
}
}
@@ -1789,7 +1791,8 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end();
// The V2Transport transparently falls back to V1 behavior when an incoming V1 connection is
// detected, so use it whenever we signal NODE_P2P_V2.
- const bool use_v2transport(nLocalServices & NODE_P2P_V2);
+ ServiceFlags local_services = GetLocalServices();
+ const bool use_v2transport(local_services & NODE_P2P_V2);
CNode* pnode = new CNode(id,
std::move(sock),
@@ -1807,7 +1810,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
.use_v2transport = use_v2transport,
});
pnode->AddRef();
- m_msgproc->InitializeNode(*pnode, nLocalServices);
+ m_msgproc->InitializeNode(*pnode, local_services);
{
LOCK(m_nodes_mutex);
m_nodes.push_back(pnode);
@@ -1871,7 +1874,7 @@ void CConnman::DisconnectNodes()
// Disconnect any connected nodes
for (CNode* pnode : m_nodes) {
if (!pnode->fDisconnect) {
- LogPrint(BCLog::NET, "Network not active, dropping peer=%d\n", pnode->GetId());
+ LogDebug(BCLog::NET, "Network not active, dropping peer=%d\n", pnode->GetId());
pnode->fDisconnect = true;
}
}
@@ -1896,7 +1899,7 @@ void CConnman::DisconnectNodes()
.destination = pnode->m_dest,
.conn_type = pnode->m_conn_type,
.use_v2transport = false});
- LogPrint(BCLog::NET, "retrying with v1 transport protocol for peer=%d\n", pnode->GetId());
+ LogDebug(BCLog::NET, "retrying with v1 transport protocol for peer=%d\n", pnode->GetId());
}
// release outbound grant (if any)
@@ -1964,25 +1967,25 @@ bool CConnman::InactivityCheck(const CNode& node) const
if (!ShouldRunInactivityChecks(node, now)) return false;
if (last_recv.count() == 0 || last_send.count() == 0) {
- LogPrint(BCLog::NET, "socket no message in first %i seconds, %d %d peer=%d\n", count_seconds(m_peer_connect_timeout), last_recv.count() != 0, last_send.count() != 0, node.GetId());
+ LogDebug(BCLog::NET, "socket no message in first %i seconds, %d %d peer=%d\n", count_seconds(m_peer_connect_timeout), last_recv.count() != 0, last_send.count() != 0, node.GetId());
return true;
}
if (now > last_send + TIMEOUT_INTERVAL) {
- LogPrint(BCLog::NET, "socket sending timeout: %is peer=%d\n", count_seconds(now - last_send), node.GetId());
+ LogDebug(BCLog::NET, "socket sending timeout: %is peer=%d\n", count_seconds(now - last_send), node.GetId());
return true;
}
if (now > last_recv + TIMEOUT_INTERVAL) {
- LogPrint(BCLog::NET, "socket receive timeout: %is peer=%d\n", count_seconds(now - last_recv), node.GetId());
+ LogDebug(BCLog::NET, "socket receive timeout: %is peer=%d\n", count_seconds(now - last_recv), node.GetId());
return true;
}
if (!node.fSuccessfullyConnected) {
if (node.m_transport->GetInfo().transport_type == TransportProtocolType::DETECTING) {
- LogPrint(BCLog::NET, "V2 handshake timeout peer=%d\n", node.GetId());
+ LogDebug(BCLog::NET, "V2 handshake timeout peer=%d\n", node.GetId());
} else {
- LogPrint(BCLog::NET, "version handshake timeout peer=%d\n", node.GetId());
+ LogDebug(BCLog::NET, "version handshake timeout peer=%d\n", node.GetId());
}
return true;
}
@@ -2122,7 +2125,7 @@ void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
{
// socket closed gracefully
if (!pnode->fDisconnect) {
- LogPrint(BCLog::NET, "socket closed for peer=%d\n", pnode->GetId());
+ LogDebug(BCLog::NET, "socket closed for peer=%d\n", pnode->GetId());
}
pnode->CloseSocketDisconnect();
}
@@ -2133,7 +2136,7 @@ void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
{
if (!pnode->fDisconnect) {
- LogPrint(BCLog::NET, "socket recv error for peer=%d: %s\n", pnode->GetId(), NetworkErrorString(nErr));
+ LogDebug(BCLog::NET, "socket recv error for peer=%d: %s\n", pnode->GetId(), NetworkErrorString(nErr));
}
pnode->CloseSocketDisconnect();
}
@@ -2180,7 +2183,6 @@ void CConnman::WakeMessageHandler()
void CConnman::ThreadDNSAddressSeed()
{
- constexpr int TARGET_OUTBOUND_CONNECTIONS = 2;
int outbound_connection_count = 0;
if (gArgs.IsArgSet("-seednode")) {
@@ -2199,7 +2201,7 @@ void CConnman::ThreadDNSAddressSeed()
}
outbound_connection_count = GetFullOutboundConnCount();
- if (outbound_connection_count >= TARGET_OUTBOUND_CONNECTIONS) {
+ if (outbound_connection_count >= SEED_OUTBOUND_CONNECTION_THRESHOLD) {
LogPrintf("P2P peers available. Finished fetching data from seed nodes.\n");
break;
}
@@ -2222,7 +2224,7 @@ void CConnman::ThreadDNSAddressSeed()
}
// Proceed with dnsseeds if seednodes hasn't reached the target or if forcednsseed is set
- if (outbound_connection_count < TARGET_OUTBOUND_CONNECTIONS || seeds_right_now) {
+ if (outbound_connection_count < SEED_OUTBOUND_CONNECTION_THRESHOLD || seeds_right_now) {
// goal: only query DNS seed if address need is acute
// * If we have a reasonable number of peers in addrman, spend
// some time trying them first. This improves user privacy by
@@ -2253,7 +2255,7 @@ void CConnman::ThreadDNSAddressSeed()
if (!interruptNet.sleep_for(w)) return;
to_wait -= w;
- if (GetFullOutboundConnCount() >= TARGET_OUTBOUND_CONNECTIONS) {
+ if (GetFullOutboundConnCount() >= SEED_OUTBOUND_CONNECTION_THRESHOLD) {
if (found > 0) {
LogPrintf("%d addresses found from DNS seeds\n", found);
LogPrintf("P2P peers available. Finished DNS seeding.\n");
@@ -2324,7 +2326,7 @@ void CConnman::DumpAddresses()
DumpPeerAddresses(::gArgs, addrman);
- LogPrint(BCLog::NET, "Flushed %d addresses to peers.dat %dms\n",
+ LogDebug(BCLog::NET, "Flushed %d addresses to peers.dat %dms\n",
addrman.Size(), Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
}
@@ -2357,12 +2359,12 @@ bool CConnman::GetTryNewOutboundPeer() const
void CConnman::SetTryNewOutboundPeer(bool flag)
{
m_try_another_outbound_peer = flag;
- LogPrint(BCLog::NET, "setting try another outbound peer=%s\n", flag ? "true" : "false");
+ LogDebug(BCLog::NET, "setting try another outbound peer=%s\n", flag ? "true" : "false");
}
void CConnman::StartExtraBlockRelayPeers()
{
- LogPrint(BCLog::NET, "enabling extra block-relay-only peers\n");
+ LogDebug(BCLog::NET, "enabling extra block-relay-only peers\n");
m_start_extra_block_relay_peers = true;
}
@@ -2448,7 +2450,7 @@ bool CConnman::MaybePickPreferredNetwork(std::optional<Network>& network)
return false;
}
-void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
+void CConnman::ThreadOpenConnections(const std::vector<std::string> connect, Span<const std::string> seed_nodes)
{
AssertLockNotHeld(m_unused_i2p_sessions_mutex);
AssertLockNotHeld(m_reconnections_mutex);
@@ -2488,12 +2490,28 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
bool add_fixed_seeds = gArgs.GetBoolArg("-fixedseeds", DEFAULT_FIXEDSEEDS);
const bool use_seednodes{gArgs.IsArgSet("-seednode")};
+ auto seed_node_timer = NodeClock::now();
+ bool add_addr_fetch{addrman.Size() == 0 && !seed_nodes.empty()};
+ constexpr std::chrono::seconds ADD_NEXT_SEEDNODE = 10s;
+
if (!add_fixed_seeds) {
LogPrintf("Fixed seeds are disabled\n");
}
while (!interruptNet)
{
+ if (add_addr_fetch) {
+ add_addr_fetch = false;
+ const auto& seed{SpanPopBack(seed_nodes)};
+ AddAddrFetch(seed);
+
+ if (addrman.Size() == 0) {
+ LogInfo("Empty addrman, adding seednode (%s) to addrfetch\n", seed);
+ } else {
+ LogInfo("Couldn't connect to peers from addrman after %d seconds. Adding seednode (%s) to addrfetch\n", ADD_NEXT_SEEDNODE.count(), seed);
+ }
+ }
+
ProcessAddrFetch();
if (!interruptNet.sleep_for(std::chrono::milliseconds(500)))
@@ -2594,6 +2612,13 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
}
}
+ if (!seed_nodes.empty() && nOutboundFullRelay < SEED_OUTBOUND_CONNECTION_THRESHOLD) {
+ if (NodeClock::now() > seed_node_timer + ADD_NEXT_SEEDNODE) {
+ seed_node_timer = NodeClock::now();
+ add_addr_fetch = true;
+ }
+ }
+
ConnectionType conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
auto now = GetTime<std::chrono::microseconds>();
bool anchor = false;
@@ -2668,6 +2693,8 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
const auto current_time{NodeClock::now()};
int nTries = 0;
+ const auto reachable_nets{g_reachable_nets.All()};
+
while (!interruptNet)
{
if (anchor && !m_anchors.empty()) {
@@ -2677,7 +2704,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
!m_msgproc->HasAllDesirableServiceFlags(addr.nServices) ||
outbound_ipv46_peer_netgroups.count(m_netgroupman.GetGroup(addr))) continue;
addrConnect = addr;
- LogPrint(BCLog::NET, "Trying to make an anchor connection to %s\n", addrConnect.ToStringAddrPort());
+ LogDebug(BCLog::NET, "Trying to make an anchor connection to %s\n", addrConnect.ToStringAddrPort());
break;
}
@@ -2699,7 +2726,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
if (!addr.IsValid()) {
// No tried table collisions. Select a new table address
// for our feeler.
- std::tie(addr, addr_last_try) = addrman.Select(true);
+ std::tie(addr, addr_last_try) = addrman.Select(true, reachable_nets);
} else if (AlreadyConnectedToAddress(addr)) {
// If test-before-evict logic would have us connect to a
// peer that we're already connected to, just mark that
@@ -2708,14 +2735,16 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
// a currently-connected peer.
addrman.Good(addr);
// Select a new table address for our feeler instead.
- std::tie(addr, addr_last_try) = addrman.Select(true);
+ std::tie(addr, addr_last_try) = addrman.Select(true, reachable_nets);
}
} else {
// Not a feeler
// If preferred_net has a value set, pick an extra outbound
// peer from that network. The eviction logic in net_processing
// ensures that a peer from another network will be evicted.
- std::tie(addr, addr_last_try) = addrman.Select(false, preferred_net);
+ std::tie(addr, addr_last_try) = preferred_net.has_value()
+ ? addrman.Select(false, {*preferred_net})
+ : addrman.Select(false, reachable_nets);
}
// Require outbound IPv4/IPv6 connections, other than feelers, to be to distinct network groups
@@ -2772,10 +2801,10 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
if (!interruptNet.sleep_for(rng.rand_uniform_duration<CThreadInterrupt::Clock>(FEELER_SLEEP_WINDOW))) {
return;
}
- LogPrint(BCLog::NET, "Making feeler connection to %s\n", addrConnect.ToStringAddrPort());
+ LogDebug(BCLog::NET, "Making feeler connection to %s\n", addrConnect.ToStringAddrPort());
}
- if (preferred_net != std::nullopt) LogPrint(BCLog::NET, "Making network specific connection to %s on %s.\n", addrConnect.ToStringAddrPort(), GetNetworkName(preferred_net.value()));
+ if (preferred_net != std::nullopt) LogDebug(BCLog::NET, "Making network specific connection to %s on %s.\n", addrConnect.ToStringAddrPort(), GetNetworkName(preferred_net.value()));
// Record addrman failure attempts when node has at least 2 persistent outbound connections to peers with
// different netgroups in ipv4/ipv6 networks + all peers in Tor/I2P/CJDNS networks.
@@ -3250,8 +3279,10 @@ bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
i2p_sam, &interruptNet);
}
- for (const auto& strDest : connOptions.vSeedNodes) {
- AddAddrFetch(strDest);
+ // Randomize the order in which we may query seednode to potentially prevent connecting to the same one every restart (and signal that we have restarted)
+ std::vector<std::string> seed_nodes = connOptions.vSeedNodes;
+ if (!seed_nodes.empty()) {
+ std::shuffle(seed_nodes.begin(), seed_nodes.end(), FastRandomContext{});
}
if (m_use_addrman_outgoing) {
@@ -3312,7 +3343,7 @@ bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
if (connOptions.m_use_addrman_outgoing || !connOptions.m_specified_outgoing.empty()) {
threadOpenConnections = std::thread(
&util::TraceThread, "opencon",
- [this, connect = connOptions.m_specified_outgoing] { ThreadOpenConnections(connect); });
+ [this, connect = connOptions.m_specified_outgoing, seed_nodes = std::move(seed_nodes)] { ThreadOpenConnections(connect, seed_nodes); });
}
// Process messages
@@ -3574,7 +3605,7 @@ bool CConnman::DisconnectNode(const std::string& strNode)
{
LOCK(m_nodes_mutex);
if (CNode* pnode = FindNode(strNode)) {
- LogPrint(BCLog::NET, "disconnect by address%s matched peer=%d; disconnecting\n", (fLogIPs ? strprintf("=%s", strNode) : ""), pnode->GetId());
+ LogDebug(BCLog::NET, "disconnect by address%s matched peer=%d; disconnecting\n", (fLogIPs ? strprintf("=%s", strNode) : ""), pnode->GetId());
pnode->fDisconnect = true;
return true;
}
@@ -3587,7 +3618,7 @@ bool CConnman::DisconnectNode(const CSubNet& subnet)
LOCK(m_nodes_mutex);
for (CNode* pnode : m_nodes) {
if (subnet.Match(pnode->addr)) {
- LogPrint(BCLog::NET, "disconnect by subnet%s matched peer=%d; disconnecting\n", (fLogIPs ? strprintf("=%s", subnet.ToString()) : ""), pnode->GetId());
+ LogDebug(BCLog::NET, "disconnect by subnet%s matched peer=%d; disconnecting\n", (fLogIPs ? strprintf("=%s", subnet.ToString()) : ""), pnode->GetId());
pnode->fDisconnect = true;
disconnected = true;
}
@@ -3605,7 +3636,7 @@ bool CConnman::DisconnectNode(NodeId id)
LOCK(m_nodes_mutex);
for(CNode* pnode : m_nodes) {
if (id == pnode->GetId()) {
- LogPrint(BCLog::NET, "disconnect by id peer=%d; disconnecting\n", pnode->GetId());
+ LogDebug(BCLog::NET, "disconnect by id peer=%d; disconnecting\n", pnode->GetId());
pnode->fDisconnect = true;
return true;
}
@@ -3762,9 +3793,9 @@ CNode::CNode(NodeId idIn,
mapRecvBytesPerMsgType[NET_MESSAGE_TYPE_OTHER] = 0;
if (fLogIPs) {
- LogPrint(BCLog::NET, "Added connection to %s peer=%d\n", m_addr_name, id);
+ LogDebug(BCLog::NET, "Added connection to %s peer=%d\n", m_addr_name, id);
} else {
- LogPrint(BCLog::NET, "Added connection peer=%d\n", id);
+ LogDebug(BCLog::NET, "Added connection peer=%d\n", id);
}
}
@@ -3808,7 +3839,7 @@ void CConnman::PushMessage(CNode* pnode, CSerializedNetMsg&& msg)
{
AssertLockNotHeld(m_total_bytes_sent_mutex);
size_t nMessageSize = msg.data.size();
- LogPrint(BCLog::NET, "sending %s (%d bytes) peer=%d\n", msg.m_type, nMessageSize, pnode->GetId());
+ LogDebug(BCLog::NET, "sending %s (%d bytes) peer=%d\n", msg.m_type, nMessageSize, pnode->GetId());
if (gArgs.GetBoolArg("-capturemessages", false)) {
CaptureMessage(pnode->addr, msg.m_type, msg.data, /*is_incoming=*/false);
}
diff --git a/src/net.h b/src/net.h
index beec58c389..2f65a01ce1 100644
--- a/src/net.h
+++ b/src/net.h
@@ -1221,6 +1221,11 @@ public:
//! that peer during `net_processing.cpp:PushNodeVersion()`.
ServiceFlags GetLocalServices() const;
+ //! Updates the local services that this node advertises to other peers
+ //! during connection handshake.
+ void AddLocalServices(ServiceFlags services) { nLocalServices = ServiceFlags(nLocalServices | services); };
+ void RemoveLocalServices(ServiceFlags services) { nLocalServices = ServiceFlags(nLocalServices & ~services); }
+
uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
std::chrono::seconds GetMaxOutboundTimeframe() const;
@@ -1273,7 +1278,7 @@ private:
void ThreadOpenAddedConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex, !m_unused_i2p_sessions_mutex, !m_reconnections_mutex);
void AddAddrFetch(const std::string& strDest) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex);
void ProcessAddrFetch() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_unused_i2p_sessions_mutex);
- void ThreadOpenConnections(std::vector<std::string> connect) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_added_nodes_mutex, !m_nodes_mutex, !m_unused_i2p_sessions_mutex, !m_reconnections_mutex);
+ void ThreadOpenConnections(std::vector<std::string> connect, Span<const std::string> seed_nodes) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_added_nodes_mutex, !m_nodes_mutex, !m_unused_i2p_sessions_mutex, !m_reconnections_mutex);
void ThreadMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc);
void ThreadI2PAcceptIncoming();
void AcceptConnection(const ListenSocket& hListenSocket);
@@ -1460,11 +1465,12 @@ private:
* This data is replicated in each Peer instance we create.
*
* This data is not marked const, but after being set it should not
- * change.
+ * change. Unless AssumeUTXO is started, in which case, the peer
+ * will be limited until the background chain sync finishes.
*
* \sa Peer::our_services
*/
- ServiceFlags nLocalServices;
+ std::atomic<ServiceFlags> nLocalServices;
std::unique_ptr<CSemaphore> semOutbound;
std::unique_ptr<CSemaphore> semAddnode;
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index 13ea3a29be..b7d0f5360d 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -54,6 +54,8 @@
#include <typeinfo>
#include <utility>
+using namespace util::hex_literals;
+
/** Headers download timeout.
* Timeout = base + per_header * (expected number of headers) */
static constexpr auto HEADERS_DOWNLOAD_TIMEOUT_BASE = 15min;
@@ -111,9 +113,6 @@ static const int MAX_BLOCKS_IN_TRANSIT_PER_PEER = 16;
static constexpr auto BLOCK_STALLING_TIMEOUT_DEFAULT{2s};
/** Maximum timeout for stalling block download. */
static constexpr auto BLOCK_STALLING_TIMEOUT_MAX{64s};
-/** Number of headers sent in one getheaders result. We rely on the assumption that if a peer sends
- * less than this number, we reached its tip. Changing this value is a protocol upgrade. */
-static const unsigned int MAX_HEADERS_RESULTS = 2000;
/** Maximum depth of blocks we're willing to serve as compact blocks to peers
* when requested. For older blocks, a regular BLOCK response will be sent. */
static const int MAX_CMPCTBLOCK_DEPTH = 5;
@@ -222,6 +221,9 @@ struct Peer {
/** Services this peer offered to us. */
std::atomic<ServiceFlags> m_their_services{NODE_NONE};
+ //! Whether this peer is an inbound connection
+ const bool m_is_inbound;
+
/** Protects misbehavior data members */
Mutex m_misbehavior_mutex;
/** Whether this peer should be disconnected and marked as discouraged (unless it has NetPermissionFlags::NoBan permission). */
@@ -392,9 +394,10 @@ struct Peer {
* timestamp the peer sent in the version message. */
std::atomic<std::chrono::seconds> m_time_offset{0s};
- explicit Peer(NodeId id, ServiceFlags our_services)
+ explicit Peer(NodeId id, ServiceFlags our_services, bool is_inbound)
: m_id{id}
, m_our_services{our_services}
+ , m_is_inbound{is_inbound}
{}
private:
@@ -474,11 +477,6 @@ struct CNodeState {
//! Time of last new block announcement
int64_t m_last_block_announcement{0};
-
- //! Whether this peer is an inbound connection
- const bool m_is_inbound;
-
- CNodeState(bool is_inbound) : m_is_inbound(is_inbound) {}
};
class PeerManagerImpl final : public PeerManager
@@ -1013,7 +1011,7 @@ private:
bool IsBlockRequested(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
/** Have we requested this block from an outbound peer */
- bool IsBlockRequestedFromOutbound(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
+ bool IsBlockRequestedFromOutbound(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main, !m_peer_mutex);
/** Remove this block from our tracked requested blocks. Called if:
* - the block has been received from a peer
@@ -1097,7 +1095,7 @@ private:
* lNodesAnnouncingHeaderAndIDs, and keeping that list under a certain size by
* removing the first element if necessary.
*/
- void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
+ void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid) EXCLUSIVE_LOCKS_REQUIRED(cs_main, !m_peer_mutex);
/** Stack of nodes which we have set to announce using compact blocks */
std::list<NodeId> lNodesAnnouncingHeaderAndIDs GUARDED_BY(cs_main);
@@ -1300,8 +1298,8 @@ bool PeerManagerImpl::IsBlockRequestedFromOutbound(const uint256& hash)
{
for (auto range = mapBlocksInFlight.equal_range(hash); range.first != range.second; range.first++) {
auto [nodeid, block_it] = range.first->second;
- CNodeState& nodestate = *Assert(State(nodeid));
- if (!nodestate.m_is_inbound) return true;
+ PeerRef peer{GetPeerRef(nodeid)};
+ if (peer && !peer->m_is_inbound) return true;
}
return false;
@@ -1390,6 +1388,7 @@ void PeerManagerImpl::MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid)
if (m_opts.ignore_incoming_txs) return;
CNodeState* nodestate = State(nodeid);
+ PeerRef peer{GetPeerRef(nodeid)};
if (!nodestate || !nodestate->m_provides_cmpctblocks) {
// Don't request compact blocks if the peer has not signalled support
return;
@@ -1402,15 +1401,15 @@ void PeerManagerImpl::MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid)
lNodesAnnouncingHeaderAndIDs.push_back(nodeid);
return;
}
- CNodeState *state = State(*it);
- if (state != nullptr && !state->m_is_inbound) ++num_outbound_hb_peers;
+ PeerRef peer_ref{GetPeerRef(*it)};
+ if (peer_ref && !peer_ref->m_is_inbound) ++num_outbound_hb_peers;
}
- if (nodestate->m_is_inbound) {
+ if (peer && peer->m_is_inbound) {
// If we're adding an inbound HB peer, make sure we're not removing
// our last outbound HB peer in the process.
if (lNodesAnnouncingHeaderAndIDs.size() >= 3 && num_outbound_hb_peers == 1) {
- CNodeState *remove_node = State(lNodesAnnouncingHeaderAndIDs.front());
- if (remove_node != nullptr && !remove_node->m_is_inbound) {
+ PeerRef remove_peer{GetPeerRef(lNodesAnnouncingHeaderAndIDs.front())};
+ if (remove_peer && !remove_peer->m_is_inbound) {
// Put the HB outbound peer in the second slot, so that it
// doesn't get removed.
std::swap(lNodesAnnouncingHeaderAndIDs.front(), *std::next(lNodesAnnouncingHeaderAndIDs.begin()));
@@ -1672,9 +1671,9 @@ void PeerManagerImpl::PushNodeVersion(CNode& pnode, const Peer& peer)
nonce, strSubVersion, nNodeStartingHeight, tx_relay);
if (fLogIPs) {
- LogPrint(BCLog::NET, "send version message: version %d, blocks=%d, them=%s, txrelay=%d, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, addr_you.ToStringAddrPort(), tx_relay, nodeid);
+ LogDebug(BCLog::NET, "send version message: version %d, blocks=%d, them=%s, txrelay=%d, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, addr_you.ToStringAddrPort(), tx_relay, nodeid);
} else {
- LogPrint(BCLog::NET, "send version message: version %d, blocks=%d, txrelay=%d, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, tx_relay, nodeid);
+ LogDebug(BCLog::NET, "send version message: version %d, blocks=%d, txrelay=%d, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, tx_relay, nodeid);
}
}
@@ -1718,7 +1717,7 @@ void PeerManagerImpl::InitializeNode(const CNode& node, ServiceFlags our_service
NodeId nodeid = node.GetId();
{
LOCK(cs_main); // For m_node_states
- m_node_states.emplace_hint(m_node_states.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(node.IsInboundConn()));
+ m_node_states.try_emplace(m_node_states.end(), nodeid);
}
{
LOCK(m_tx_download_mutex);
@@ -1729,7 +1728,7 @@ void PeerManagerImpl::InitializeNode(const CNode& node, ServiceFlags our_service
our_services = static_cast<ServiceFlags>(our_services | NODE_BLOOM);
}
- PeerRef peer = std::make_shared<Peer>(nodeid, our_services);
+ PeerRef peer = std::make_shared<Peer>(nodeid, our_services, node.IsInboundConn());
{
LOCK(m_peer_mutex);
m_peer_map.emplace_hint(m_peer_map.end(), nodeid, peer);
@@ -1826,7 +1825,7 @@ void PeerManagerImpl::FinalizeNode(const CNode& node)
LOCK(m_headers_presync_mutex);
m_headers_presync_stats.erase(nodeid);
}
- LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);
+ LogDebug(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);
}
bool PeerManagerImpl::HasAllDesirableServiceFlags(ServiceFlags services) const
@@ -1942,7 +1941,7 @@ void PeerManagerImpl::Misbehaving(Peer& peer, const std::string& message)
const std::string message_prefixed = message.empty() ? "" : (": " + message);
peer.m_should_discourage = true;
- LogPrint(BCLog::NET, "Misbehaving: peer=%d%s\n", peer.m_id, message_prefixed);
+ LogDebug(BCLog::NET, "Misbehaving: peer=%d%s\n", peer.m_id, message_prefixed);
}
void PeerManagerImpl::MaybePunishNodeForBlock(NodeId nodeid, const BlockValidationState& state,
@@ -1966,15 +1965,9 @@ void PeerManagerImpl::MaybePunishNodeForBlock(NodeId nodeid, const BlockValidati
break;
case BlockValidationResult::BLOCK_CACHED_INVALID:
{
- LOCK(cs_main);
- CNodeState *node_state = State(nodeid);
- if (node_state == nullptr) {
- break;
- }
-
// Discourage outbound (but not inbound) peers if on an invalid chain.
// Exempt HB compact block peers. Manual connections are always protected from discouragement.
- if (!via_compact_block && !node_state->m_is_inbound) {
+ if (peer && !via_compact_block && !peer->m_is_inbound) {
if (peer) Misbehaving(*peer, message);
return;
}
@@ -1994,7 +1987,7 @@ void PeerManagerImpl::MaybePunishNodeForBlock(NodeId nodeid, const BlockValidati
break;
}
if (message != "") {
- LogPrint(BCLog::NET, "peer=%d: %s\n", nodeid, message);
+ LogDebug(BCLog::NET, "peer=%d: %s\n", nodeid, message);
}
}
@@ -2065,7 +2058,7 @@ std::optional<std::string> PeerManagerImpl::FetchBlock(NodeId peer_id, const CBl
if (!success) return "Peer not fully connected";
- LogPrint(BCLog::NET, "Requesting block %s from peer=%d\n",
+ LogDebug(BCLog::NET, "Requesting block %s from peer=%d\n",
hash.ToString(), peer_id);
return std::nullopt;
}
@@ -2150,7 +2143,7 @@ void PeerManagerImpl::BlockConnected(
if (stalling_timeout != BLOCK_STALLING_TIMEOUT_DEFAULT) {
const auto new_timeout = std::max(std::chrono::duration_cast<std::chrono::seconds>(stalling_timeout * 0.85), BLOCK_STALLING_TIMEOUT_DEFAULT);
if (m_block_stalling_timeout.compare_exchange_strong(stalling_timeout, new_timeout)) {
- LogPrint(BCLog::NET, "Decreased stalling timeout to %d seconds\n", count_seconds(new_timeout));
+ LogDebug(BCLog::NET, "Decreased stalling timeout to %d seconds\n", count_seconds(new_timeout));
}
}
@@ -2231,7 +2224,7 @@ void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::sha
// but we don't think they have this one, go ahead and announce it
if (state.m_requested_hb_cmpctblocks && !PeerHasHeader(&state, pindex) && PeerHasHeader(&state, pindex->pprev)) {
- LogPrint(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", "PeerManager::NewPoWValidBlock",
+ LogDebug(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", "PeerManager::NewPoWValidBlock",
hashBlock.ToString(), pnode->GetId());
const CSerializedNetMsg& ser_cmpctblock{lazy_ser.get()};
@@ -2463,7 +2456,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
if (need_activate_chain) {
BlockValidationState state;
if (!m_chainman.ActiveChainstate().ActivateBestChain(state, a_recent_block)) {
- LogPrint(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
+ LogDebug(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
}
}
@@ -2478,7 +2471,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
return;
}
if (!BlockRequestAllowed(pindex)) {
- LogPrint(BCLog::NET, "%s: ignoring request from peer=%i for old block that isn't in the main chain\n", __func__, pfrom.GetId());
+ LogDebug(BCLog::NET, "%s: ignoring request from peer=%i for old block that isn't in the main chain\n", __func__, pfrom.GetId());
return;
}
// disconnect node in case we have reached the outbound limit for serving historical blocks
@@ -2486,7 +2479,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
(((m_chainman.m_best_header != nullptr) && (m_chainman.m_best_header->GetBlockTime() - pindex->GetBlockTime() > HISTORICAL_BLOCK_AGE)) || inv.IsMsgFilteredBlk()) &&
!pfrom.HasPermission(NetPermissionFlags::Download) // nodes with the download permission may exceed target
) {
- LogPrint(BCLog::NET, "historical block serving limit reached, disconnect peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "historical block serving limit reached, disconnect peer=%d\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -2495,7 +2488,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
if (!pfrom.HasPermission(NetPermissionFlags::NoBan) && (
(((peer.m_our_services & NODE_NETWORK_LIMITED) == NODE_NETWORK_LIMITED) && ((peer.m_our_services & NODE_NETWORK) != NODE_NETWORK) && (tip->nHeight - pindex->nHeight > (int)NODE_NETWORK_LIMITED_MIN_BLOCKS + 2 /* add two blocks buffer extension for possible races */) )
)) {
- LogPrint(BCLog::NET, "Ignore block request below NODE_NETWORK_LIMITED threshold, disconnect peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignore block request below NODE_NETWORK_LIMITED threshold, disconnect peer=%d\n", pfrom.GetId());
//disconnect node and prevent it from stalling (would otherwise wait for the missing block)
pfrom.fDisconnect = true;
return;
@@ -2518,7 +2511,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
std::vector<uint8_t> block_data;
if (!m_chainman.m_blockman.ReadRawBlockFromDisk(block_data, block_pos)) {
if (WITH_LOCK(m_chainman.GetMutex(), return m_chainman.m_blockman.IsBlockPruned(*pindex))) {
- LogPrint(BCLog::NET, "Block was pruned before it could be read, disconnect peer=%s\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Block was pruned before it could be read, disconnect peer=%s\n", pfrom.GetId());
} else {
LogError("Cannot load block from disk, disconnect peer=%d\n", pfrom.GetId());
}
@@ -2532,7 +2525,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
std::shared_ptr<CBlock> pblockRead = std::make_shared<CBlock>();
if (!m_chainman.m_blockman.ReadBlockFromDisk(*pblockRead, block_pos)) {
if (WITH_LOCK(m_chainman.GetMutex(), return m_chainman.m_blockman.IsBlockPruned(*pindex))) {
- LogPrint(BCLog::NET, "Block was pruned before it could be read, disconnect peer=%s\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Block was pruned before it could be read, disconnect peer=%s\n", pfrom.GetId());
} else {
LogError("Cannot load block from disk, disconnect peer=%d\n", pfrom.GetId());
}
@@ -2756,7 +2749,7 @@ void PeerManagerImpl::HandleUnconnectingHeaders(CNode& pfrom, Peer& peer,
// Try to fill in the missing headers.
const CBlockIndex* best_header{WITH_LOCK(cs_main, return m_chainman.m_best_header)};
if (MaybeSendGetHeaders(pfrom, GetLocator(best_header), peer)) {
- LogPrint(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d)\n",
+ LogDebug(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d)\n",
headers[0].GetHash().ToString(),
headers[0].hashPrevBlock.ToString(),
best_header->nHeight,
@@ -2784,7 +2777,7 @@ bool PeerManagerImpl::CheckHeadersAreContinuous(const std::vector<CBlockHeader>&
bool PeerManagerImpl::IsContinuationOfLowWorkHeadersSync(Peer& peer, CNode& pfrom, std::vector<CBlockHeader>& headers)
{
if (peer.m_headers_sync) {
- auto result = peer.m_headers_sync->ProcessNextHeaders(headers, headers.size() == MAX_HEADERS_RESULTS);
+ auto result = peer.m_headers_sync->ProcessNextHeaders(headers, headers.size() == m_opts.max_headers_result);
// If it is a valid continuation, we should treat the existing getheaders request as responded to.
if (result.success) peer.m_last_getheaders_timestamp = {};
if (result.request_more) {
@@ -2798,7 +2791,7 @@ bool PeerManagerImpl::IsContinuationOfLowWorkHeadersSync(Peer& peer, CNode& pfro
// because we just cleared the last getheaders timestamp.
bool sent_getheaders = MaybeSendGetHeaders(pfrom, locator, peer);
Assume(sent_getheaders);
- LogPrint(BCLog::NET, "more getheaders (from %s) to peer=%d\n",
+ LogDebug(BCLog::NET, "more getheaders (from %s) to peer=%d\n",
locator.vHave.front().ToString(), pfrom.GetId());
}
}
@@ -2878,7 +2871,7 @@ bool PeerManagerImpl::TryLowWorkHeadersSync(Peer& peer, CNode& pfrom, const CBlo
// Only try to sync with this peer if their headers message was full;
// otherwise they don't have more headers after this so no point in
// trying to sync their too-little-work chain.
- if (headers.size() == MAX_HEADERS_RESULTS) {
+ if (headers.size() == m_opts.max_headers_result) {
// Note: we could advance to the last header in this set that is
// known to us, rather than starting at the first header (which we
// may already have); however this is unlikely to matter much since
@@ -2897,7 +2890,7 @@ bool PeerManagerImpl::TryLowWorkHeadersSync(Peer& peer, CNode& pfrom, const CBlo
// handled inside of IsContinuationOfLowWorkHeadersSync.
(void)IsContinuationOfLowWorkHeadersSync(peer, pfrom, headers);
} else {
- LogPrint(BCLog::NET, "Ignoring low-work chain (height=%u) from peer=%d\n", chain_start_header->nHeight + headers.size(), pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring low-work chain (height=%u) from peer=%d\n", chain_start_header->nHeight + headers.size(), pfrom.GetId());
}
// The peer has not yet given us a chain that meets our work threshold,
@@ -2963,7 +2956,7 @@ void PeerManagerImpl::HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, c
// the main chain -- this shouldn't really happen. Bail out on the
// direct fetch and rely on parallel download instead.
if (!m_chainman.ActiveChain().Contains(pindexWalk)) {
- LogPrint(BCLog::NET, "Large reorg, won't direct fetch to %s (%d)\n",
+ LogDebug(BCLog::NET, "Large reorg, won't direct fetch to %s (%d)\n",
last_header.GetBlockHash().ToString(),
last_header.nHeight);
} else {
@@ -2977,11 +2970,11 @@ void PeerManagerImpl::HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, c
uint32_t nFetchFlags = GetFetchFlags(peer);
vGetData.emplace_back(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash());
BlockRequested(pfrom.GetId(), *pindex);
- LogPrint(BCLog::NET, "Requesting block %s from peer=%d\n",
+ LogDebug(BCLog::NET, "Requesting block %s from peer=%d\n",
pindex->GetBlockHash().ToString(), pfrom.GetId());
}
if (vGetData.size() > 1) {
- LogPrint(BCLog::NET, "Downloading blocks toward %s (%d) via headers direct fetch\n",
+ LogDebug(BCLog::NET, "Downloading blocks toward %s (%d) via headers direct fetch\n",
last_header.GetBlockHash().ToString(),
last_header.nHeight);
}
@@ -3049,7 +3042,7 @@ void PeerManagerImpl::UpdatePeerStateForReceivedHeaders(CNode& pfrom, Peer& peer
// See ChainSyncTimeoutState.
if (!pfrom.fDisconnect && pfrom.IsFullOutboundConn() && nodestate->pindexBestKnownBlock != nullptr) {
if (m_outbound_peers_with_protect_from_disconnect < MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT && nodestate->pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork && !nodestate->m_chain_sync.m_protect) {
- LogPrint(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom.GetId());
nodestate->m_chain_sync.m_protect = true;
++m_outbound_peers_with_protect_from_disconnect;
}
@@ -3190,15 +3183,15 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, Peer& peer,
assert(pindexLast);
// Consider fetching more headers if we are not using our headers-sync mechanism.
- if (nCount == MAX_HEADERS_RESULTS && !have_headers_sync) {
+ if (nCount == m_opts.max_headers_result && !have_headers_sync) {
// Headers message had its maximum size; the peer may have more headers.
if (MaybeSendGetHeaders(pfrom, GetLocator(pindexLast), peer)) {
- LogPrint(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
+ LogDebug(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
pindexLast->nHeight, pfrom.GetId(), peer.m_starting_height);
}
}
- UpdatePeerStateForReceivedHeaders(pfrom, peer, *pindexLast, received_new_header, nCount == MAX_HEADERS_RESULTS);
+ UpdatePeerStateForReceivedHeaders(pfrom, peer, *pindexLast, received_new_header, nCount == m_opts.max_headers_result);
// Consider immediately downloading blocks.
HeadersDirectFetchBlocks(pfrom, peer, *pindexLast);
@@ -3424,11 +3417,11 @@ bool PeerManagerImpl::ProcessOrphanTx(Peer& peer)
const Wtxid& orphan_wtxid = porphanTx->GetWitnessHash();
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
- LogPrint(BCLog::TXPACKAGES, " accepted orphan tx %s (wtxid=%s)\n", orphanHash.ToString(), orphan_wtxid.ToString());
+ LogDebug(BCLog::TXPACKAGES, " accepted orphan tx %s (wtxid=%s)\n", orphanHash.ToString(), orphan_wtxid.ToString());
ProcessValidTx(peer.m_id, porphanTx, result.m_replaced_transactions);
return true;
} else if (state.GetResult() != TxValidationResult::TX_MISSING_INPUTS) {
- LogPrint(BCLog::TXPACKAGES, " invalid orphan tx %s (wtxid=%s) from peer=%d. %s\n",
+ LogDebug(BCLog::TXPACKAGES, " invalid orphan tx %s (wtxid=%s) from peer=%d. %s\n",
orphanHash.ToString(),
orphan_wtxid.ToString(),
peer.m_id,
@@ -3457,7 +3450,7 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
(filter_type == BlockFilterType::BASIC &&
(peer.m_our_services & NODE_COMPACT_FILTERS));
if (!supported_filter_type) {
- LogPrint(BCLog::NET, "peer %d requested unsupported block filter type: %d\n",
+ LogDebug(BCLog::NET, "peer %d requested unsupported block filter type: %d\n",
node.GetId(), static_cast<uint8_t>(filter_type));
node.fDisconnect = true;
return false;
@@ -3469,7 +3462,7 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
// Check that the stop block exists and the peer would be allowed to fetch it.
if (!stop_index || !BlockRequestAllowed(stop_index)) {
- LogPrint(BCLog::NET, "peer %d requested invalid block hash: %s\n",
+ LogDebug(BCLog::NET, "peer %d requested invalid block hash: %s\n",
node.GetId(), stop_hash.ToString());
node.fDisconnect = true;
return false;
@@ -3478,14 +3471,14 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
uint32_t stop_height = stop_index->nHeight;
if (start_height > stop_height) {
- LogPrint(BCLog::NET, "peer %d sent invalid getcfilters/getcfheaders with "
+ LogDebug(BCLog::NET, "peer %d sent invalid getcfilters/getcfheaders with "
"start height %d and stop height %d\n",
node.GetId(), start_height, stop_height);
node.fDisconnect = true;
return false;
}
if (stop_height - start_height >= max_height_diff) {
- LogPrint(BCLog::NET, "peer %d requested too many cfilters/cfheaders: %d / %d\n",
+ LogDebug(BCLog::NET, "peer %d requested too many cfilters/cfheaders: %d / %d\n",
node.GetId(), stop_height - start_height + 1, max_height_diff);
node.fDisconnect = true;
return false;
@@ -3493,7 +3486,7 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
filter_index = GetBlockFilterIndex(filter_type);
if (!filter_index) {
- LogPrint(BCLog::NET, "Filter index for supported type %s not found\n", BlockFilterTypeName(filter_type));
+ LogDebug(BCLog::NET, "Filter index for supported type %s not found\n", BlockFilterTypeName(filter_type));
return false;
}
@@ -3519,7 +3512,7 @@ void PeerManagerImpl::ProcessGetCFilters(CNode& node, Peer& peer, DataStream& vR
std::vector<BlockFilter> filters;
if (!filter_index->LookupFilterRange(start_height, stop_index, filters)) {
- LogPrint(BCLog::NET, "Failed to find block filter in index: filter_type=%s, start_height=%d, stop_hash=%s\n",
+ LogDebug(BCLog::NET, "Failed to find block filter in index: filter_type=%s, start_height=%d, stop_hash=%s\n",
BlockFilterTypeName(filter_type), start_height, stop_hash.ToString());
return;
}
@@ -3551,7 +3544,7 @@ void PeerManagerImpl::ProcessGetCFHeaders(CNode& node, Peer& peer, DataStream& v
const CBlockIndex* const prev_block =
stop_index->GetAncestor(static_cast<int>(start_height - 1));
if (!filter_index->LookupFilterHeader(prev_block, prev_header)) {
- LogPrint(BCLog::NET, "Failed to find block filter header in index: filter_type=%s, block_hash=%s\n",
+ LogDebug(BCLog::NET, "Failed to find block filter header in index: filter_type=%s, block_hash=%s\n",
BlockFilterTypeName(filter_type), prev_block->GetBlockHash().ToString());
return;
}
@@ -3559,7 +3552,7 @@ void PeerManagerImpl::ProcessGetCFHeaders(CNode& node, Peer& peer, DataStream& v
std::vector<uint256> filter_hashes;
if (!filter_index->LookupFilterHashRange(start_height, stop_index, filter_hashes)) {
- LogPrint(BCLog::NET, "Failed to find block filter hashes in index: filter_type=%s, start_height=%d, stop_hash=%s\n",
+ LogDebug(BCLog::NET, "Failed to find block filter hashes in index: filter_type=%s, start_height=%d, stop_hash=%s\n",
BlockFilterTypeName(filter_type), start_height, stop_hash.ToString());
return;
}
@@ -3597,7 +3590,7 @@ void PeerManagerImpl::ProcessGetCFCheckPt(CNode& node, Peer& peer, DataStream& v
block_index = block_index->GetAncestor(height);
if (!filter_index->LookupFilterHeader(block_index, headers[i])) {
- LogPrint(BCLog::NET, "Failed to find block filter header in index: filter_type=%s, block_hash=%s\n",
+ LogDebug(BCLog::NET, "Failed to find block filter header in index: filter_type=%s, block_hash=%s\n",
BlockFilterTypeName(filter_type), block_index->GetBlockHash().ToString());
return;
}
@@ -3650,7 +3643,7 @@ void PeerManagerImpl::ProcessCompactBlockTxns(CNode& pfrom, Peer& peer, const Bl
}
if (!requested_block_from_this_peer) {
- LogPrint(BCLog::NET, "Peer %d sent us block transactions for block we weren't expecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Peer %d sent us block transactions for block we weren't expecting\n", pfrom.GetId());
return;
}
@@ -3668,7 +3661,7 @@ void PeerManagerImpl::ProcessCompactBlockTxns(CNode& pfrom, Peer& peer, const Bl
MakeAndPushMessage(pfrom, NetMsgType::GETDATA, invs);
} else {
RemoveBlockRequest(block_transactions.blockhash, pfrom.GetId());
- LogPrint(BCLog::NET, "Peer %d sent us a compact block but it failed to reconstruct, waiting on first download to complete\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Peer %d sent us a compact block but it failed to reconstruct, waiting on first download to complete\n", pfrom.GetId());
return;
}
} else {
@@ -3718,14 +3711,14 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
AssertLockHeld(g_msgproc_mutex);
- LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", SanitizeString(msg_type), vRecv.size(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received: %s (%u bytes) peer=%d\n", SanitizeString(msg_type), vRecv.size(), pfrom.GetId());
PeerRef peer = GetPeerRef(pfrom.GetId());
if (peer == nullptr) return;
if (msg_type == NetMsgType::VERSION) {
if (pfrom.nVersion != 0) {
- LogPrint(BCLog::NET, "redundant version message from peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "redundant version message from peer=%d\n", pfrom.GetId());
return;
}
@@ -3753,14 +3746,14 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (pfrom.ExpectServicesFromConn() && !HasAllDesirableServiceFlags(nServices))
{
- LogPrint(BCLog::NET, "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom.GetId(), nServices, GetDesirableServiceFlags(nServices));
+ LogDebug(BCLog::NET, "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom.GetId(), nServices, GetDesirableServiceFlags(nServices));
pfrom.fDisconnect = true;
return;
}
if (nVersion < MIN_PEER_PROTO_VERSION) {
// disconnect from peers older than this proto version
- LogPrint(BCLog::NET, "peer=%d using obsolete version %i; disconnecting\n", pfrom.GetId(), nVersion);
+ LogDebug(BCLog::NET, "peer=%d using obsolete version %i; disconnecting\n", pfrom.GetId(), nVersion);
pfrom.fDisconnect = true;
return;
}
@@ -3916,7 +3909,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
remoteAddr = ", peeraddr=" + pfrom.addr.ToStringAddrPort();
const auto mapped_as{m_connman.GetMappedAS(pfrom.addr)};
- LogPrint(BCLog::NET, "receive version message: %s: version %d, blocks=%d, us=%s, txrelay=%d, peer=%d%s%s\n",
+ LogDebug(BCLog::NET, "receive version message: %s: version %d, blocks=%d, us=%s, txrelay=%d, peer=%d%s%s\n",
cleanSubVer, pfrom.nVersion,
peer->m_starting_height, addrMe.ToStringAddrPort(), fRelay, pfrom.GetId(),
remoteAddr, (mapped_as ? strprintf(", mapped_as=%d", mapped_as) : ""));
@@ -3931,13 +3924,13 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// If the peer is old enough to have the old alert system, send it the final alert.
if (greatest_common_version <= 70012) {
- const auto finalAlert{ParseHex("60010000000000000000000000ffffff7f00000000ffffff7ffeffff7f01ffffff7f00000000ffffff7f00ffffff7f002f555247454e543a20416c657274206b657920636f6d70726f6d697365642c2075706772616465207265717569726564004630440220653febd6410f470f6bae11cad19c48413becb1ac2c17f908fd0fd53bdc3abd5202206d0e9c96fe88d4a0f01ed9dedae2b6f9e00da94cad0fecaae66ecf689bf71b50")};
- MakeAndPushMessage(pfrom, "alert", Span{finalAlert});
+ constexpr auto finalAlert{"60010000000000000000000000ffffff7f00000000ffffff7ffeffff7f01ffffff7f00000000ffffff7f00ffffff7f002f555247454e543a20416c657274206b657920636f6d70726f6d697365642c2075706772616465207265717569726564004630440220653febd6410f470f6bae11cad19c48413becb1ac2c17f908fd0fd53bdc3abd5202206d0e9c96fe88d4a0f01ed9dedae2b6f9e00da94cad0fecaae66ecf689bf71b50"_hex};
+ MakeAndPushMessage(pfrom, "alert", finalAlert);
}
// Feeler connections exist only to verify if address is online.
if (pfrom.IsFeelerConn()) {
- LogPrint(BCLog::NET, "feeler connection completed peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "feeler connection completed peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
}
return;
@@ -3945,13 +3938,13 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (pfrom.nVersion == 0) {
// Must have a version message before anything else
- LogPrint(BCLog::NET, "non-version message before version handshake. Message \"%s\" from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
+ LogDebug(BCLog::NET, "non-version message before version handshake. Message \"%s\" from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
return;
}
if (msg_type == NetMsgType::VERACK) {
if (pfrom.fSuccessfullyConnected) {
- LogPrint(BCLog::NET, "ignoring redundant verack message from peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "ignoring redundant verack message from peer=%d\n", pfrom.GetId());
return;
}
@@ -4031,7 +4024,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::WTXIDRELAY) {
if (pfrom.fSuccessfullyConnected) {
// Disconnect peers that send a wtxidrelay message after VERACK.
- LogPrint(BCLog::NET, "wtxidrelay received after verack from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "wtxidrelay received after verack from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -4040,10 +4033,10 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
peer->m_wtxid_relay = true;
m_wtxid_relay_peers++;
} else {
- LogPrint(BCLog::NET, "ignoring duplicate wtxidrelay from peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "ignoring duplicate wtxidrelay from peer=%d\n", pfrom.GetId());
}
} else {
- LogPrint(BCLog::NET, "ignoring wtxidrelay due to old common version=%d from peer=%d\n", pfrom.GetCommonVersion(), pfrom.GetId());
+ LogDebug(BCLog::NET, "ignoring wtxidrelay due to old common version=%d from peer=%d\n", pfrom.GetCommonVersion(), pfrom.GetId());
}
return;
}
@@ -4053,7 +4046,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::SENDADDRV2) {
if (pfrom.fSuccessfullyConnected) {
// Disconnect peers that send a SENDADDRV2 message after VERACK.
- LogPrint(BCLog::NET, "sendaddrv2 received after verack from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "sendaddrv2 received after verack from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -4118,7 +4111,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (!pfrom.fSuccessfullyConnected) {
- LogPrint(BCLog::NET, "Unsupported message \"%s\" prior to verack from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
+ LogDebug(BCLog::NET, "Unsupported message \"%s\" prior to verack from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
return;
}
@@ -4136,7 +4129,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
vRecv >> ser_params(vAddr);
if (!SetupAddressRelay(pfrom, *peer)) {
- LogPrint(BCLog::NET, "ignoring %s message from %s peer=%d\n", msg_type, pfrom.ConnectionTypeAsString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "ignoring %s message from %s peer=%d\n", msg_type, pfrom.ConnectionTypeAsString(), pfrom.GetId());
return;
}
@@ -4205,7 +4198,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
peer->m_addr_processed += num_proc;
peer->m_addr_rate_limited += num_rate_limit;
- LogPrint(BCLog::NET, "Received addr: %u addresses (%u processed, %u rate-limited) from peer=%d\n",
+ LogDebug(BCLog::NET, "Received addr: %u addresses (%u processed, %u rate-limited) from peer=%d\n",
vAddr.size(), num_proc, num_rate_limit, pfrom.GetId());
m_addrman.Add(vAddrOk, pfrom.addr, 2h);
@@ -4213,7 +4206,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// AddrFetch: Require multiple addresses to avoid disconnecting on self-announcements
if (pfrom.IsAddrFetchConn() && vAddr.size() > 1) {
- LogPrint(BCLog::NET, "addrfetch connection completed peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "addrfetch connection completed peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
}
return;
@@ -4249,7 +4242,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (inv.IsMsgBlk()) {
const bool fAlreadyHave = AlreadyHaveBlock(inv.hash);
- LogPrint(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
+ LogDebug(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
UpdateBlockAvailability(pfrom.GetId(), inv.hash);
if (!fAlreadyHave && !m_chainman.m_blockman.LoadingBlocks() && !IsBlockRequested(inv.hash)) {
@@ -4263,20 +4256,20 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
} else if (inv.IsGenTxMsg()) {
if (reject_tx_invs) {
- LogPrint(BCLog::NET, "transaction (%s) inv sent in violation of protocol, disconnecting peer=%d\n", inv.hash.ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "transaction (%s) inv sent in violation of protocol, disconnecting peer=%d\n", inv.hash.ToString(), pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
const GenTxid gtxid = ToGenTxid(inv);
const bool fAlreadyHave = AlreadyHaveTx(gtxid, /*include_reconsiderable=*/true);
- LogPrint(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
+ LogDebug(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
AddKnownTx(*peer, inv.hash);
if (!fAlreadyHave && !m_chainman.IsInitialBlockDownload()) {
AddTxAnnouncement(pfrom, gtxid, current_time);
}
} else {
- LogPrint(BCLog::NET, "Unknown inv type \"%s\" received from peer=%d\n", inv.ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "Unknown inv type \"%s\" received from peer=%d\n", inv.ToString(), pfrom.GetId());
}
}
@@ -4294,7 +4287,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
CNodeState& state{*Assert(State(pfrom.GetId()))};
if (state.fSyncStarted || (!peer->m_inv_triggered_getheaders_before_sync && *best_block != m_last_block_inv_triggering_headers_sync)) {
if (MaybeSendGetHeaders(pfrom, GetLocator(m_chainman.m_best_header), *peer)) {
- LogPrint(BCLog::NET, "getheaders (%d) %s to peer=%d\n",
+ LogDebug(BCLog::NET, "getheaders (%d) %s to peer=%d\n",
m_chainman.m_best_header->nHeight, best_block->ToString(),
pfrom.GetId());
}
@@ -4320,10 +4313,10 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
return;
}
- LogPrint(BCLog::NET, "received getdata (%u invsz) peer=%d\n", vInv.size(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received getdata (%u invsz) peer=%d\n", vInv.size(), pfrom.GetId());
if (vInv.size() > 0) {
- LogPrint(BCLog::NET, "received getdata for: %s peer=%d\n", vInv[0].ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received getdata for: %s peer=%d\n", vInv[0].ToString(), pfrom.GetId());
}
{
@@ -4341,7 +4334,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
vRecv >> locator >> hashStop;
if (locator.vHave.size() > MAX_LOCATOR_SZ) {
- LogPrint(BCLog::NET, "getblocks locator size %lld > %d, disconnect peer=%d\n", locator.vHave.size(), MAX_LOCATOR_SZ, pfrom.GetId());
+ LogDebug(BCLog::NET, "getblocks locator size %lld > %d, disconnect peer=%d\n", locator.vHave.size(), MAX_LOCATOR_SZ, pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -4361,7 +4354,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
BlockValidationState state;
if (!m_chainman.ActiveChainstate().ActivateBestChain(state, a_recent_block)) {
- LogPrint(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
+ LogDebug(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
}
}
@@ -4374,26 +4367,26 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (pindex)
pindex = m_chainman.ActiveChain().Next(pindex);
int nLimit = 500;
- LogPrint(BCLog::NET, "getblocks %d to %s limit %d from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), nLimit, pfrom.GetId());
+ LogDebug(BCLog::NET, "getblocks %d to %s limit %d from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), nLimit, pfrom.GetId());
for (; pindex; pindex = m_chainman.ActiveChain().Next(pindex))
{
if (pindex->GetBlockHash() == hashStop)
{
- LogPrint(BCLog::NET, " getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
+ LogDebug(BCLog::NET, " getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
break;
}
// If pruning, don't inv blocks unless we have on disk and are likely to still have
// for some reasonable time window (1 hour) that block relay might require.
const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / m_chainparams.GetConsensus().nPowTargetSpacing;
if (m_chainman.m_blockman.IsPruneMode() && (!(pindex->nStatus & BLOCK_HAVE_DATA) || pindex->nHeight <= m_chainman.ActiveChain().Tip()->nHeight - nPrunedBlocksLikelyToHave)) {
- LogPrint(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
+ LogDebug(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
break;
}
WITH_LOCK(peer->m_block_inv_mutex, peer->m_blocks_for_inv_relay.push_back(pindex->GetBlockHash()));
if (--nLimit <= 0) {
// When this block is requested, we'll send an inv that'll
// trigger the peer to getblocks the next batch of inventory.
- LogPrint(BCLog::NET, " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
+ LogDebug(BCLog::NET, " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
WITH_LOCK(peer->m_block_inv_mutex, {peer->m_continuation_block = pindex->GetBlockHash();});
break;
}
@@ -4423,7 +4416,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(req.blockhash);
if (!pindex || !(pindex->nStatus & BLOCK_HAVE_DATA)) {
- LogPrint(BCLog::NET, "Peer %d sent us a getblocktxn for a block we don't have\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Peer %d sent us a getblocktxn for a block we don't have\n", pfrom.GetId());
return;
}
@@ -4450,7 +4443,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// might maliciously send lots of getblocktxn requests to trigger
// expensive disk reads, because it will require the peer to
// actually receive all the data read from disk over the network.
- LogPrint(BCLog::NET, "Peer %d sent us a getblocktxn for a block > %i deep\n", pfrom.GetId(), MAX_BLOCKTXN_DEPTH);
+ LogDebug(BCLog::NET, "Peer %d sent us a getblocktxn for a block > %i deep\n", pfrom.GetId(), MAX_BLOCKTXN_DEPTH);
CInv inv{MSG_WITNESS_BLOCK, req.blockhash};
WITH_LOCK(peer->m_getdata_requests_mutex, peer->m_getdata_requests.push_back(inv));
// The message processing loop will go around again (without pausing) and we'll respond then
@@ -4463,13 +4456,13 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
vRecv >> locator >> hashStop;
if (locator.vHave.size() > MAX_LOCATOR_SZ) {
- LogPrint(BCLog::NET, "getheaders locator size %lld > %d, disconnect peer=%d\n", locator.vHave.size(), MAX_LOCATOR_SZ, pfrom.GetId());
+ LogDebug(BCLog::NET, "getheaders locator size %lld > %d, disconnect peer=%d\n", locator.vHave.size(), MAX_LOCATOR_SZ, pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Ignoring getheaders from peer=%d while importing/reindexing\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring getheaders from peer=%d while importing/reindexing\n", pfrom.GetId());
return;
}
@@ -4484,7 +4477,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// others.
if (m_chainman.ActiveTip() == nullptr ||
(m_chainman.ActiveTip()->nChainWork < m_chainman.MinimumChainWork() && !pfrom.HasPermission(NetPermissionFlags::Download))) {
- LogPrint(BCLog::NET, "Ignoring getheaders from peer=%d because active chain has too little work; sending empty response\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring getheaders from peer=%d because active chain has too little work; sending empty response\n", pfrom.GetId());
// Just respond with an empty headers message, to tell the peer to
// go away but not treat us as unresponsive.
MakeAndPushMessage(pfrom, NetMsgType::HEADERS, std::vector<CBlockHeader>());
@@ -4502,7 +4495,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (!BlockRequestAllowed(pindex)) {
- LogPrint(BCLog::NET, "%s: ignoring request from peer=%i for old block header that isn't in the main chain\n", __func__, pfrom.GetId());
+ LogDebug(BCLog::NET, "%s: ignoring request from peer=%i for old block header that isn't in the main chain\n", __func__, pfrom.GetId());
return;
}
}
@@ -4516,8 +4509,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// we must use CBlocks, as CBlockHeaders won't include the 0x00 nTx count at the end
std::vector<CBlock> vHeaders;
- int nLimit = MAX_HEADERS_RESULTS;
- LogPrint(BCLog::NET, "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom.GetId());
+ int nLimit = m_opts.max_headers_result;
+ LogDebug(BCLog::NET, "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom.GetId());
for (; pindex; pindex = m_chainman.ActiveChain().Next(pindex))
{
vHeaders.emplace_back(pindex->GetBlockHeader());
@@ -4543,7 +4536,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::TX) {
if (RejectIncomingTxs(pfrom)) {
- LogPrint(BCLog::NET, "transaction sent in violation of protocol peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "transaction sent in violation of protocol peer=%d\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -4599,7 +4592,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// When a transaction is already in m_lazy_recent_rejects_reconsiderable, we shouldn't submit
// it by itself again. However, look for a matching child in the orphanage, as it is
// possible that they succeed as a package.
- LogPrint(BCLog::TXPACKAGES, "found tx %s (wtxid=%s) in reconsiderable rejects, looking for child in orphanage\n",
+ LogDebug(BCLog::TXPACKAGES, "found tx %s (wtxid=%s) in reconsiderable rejects, looking for child in orphanage\n",
txid.ToString(), wtxid.ToString());
if (auto package_to_validate{Find1P1CPackage(ptx, pfrom.GetId())}) {
const auto package_result{ProcessNewPackage(m_chainman.ActiveChainstate(), m_mempool, package_to_validate->m_txns, /*test_accept=*/false, /*client_maxfeerate=*/std::nullopt)};
@@ -4693,7 +4686,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// DoS prevention: do not allow m_orphanage to grow unbounded (see CVE-2012-3789)
m_orphanage.LimitOrphans(m_opts.max_orphan_txs, m_rng);
} else {
- LogPrint(BCLog::MEMPOOL, "not keeping orphan with rejected parents %s (wtxid=%s)\n",
+ LogDebug(BCLog::MEMPOOL, "not keeping orphan with rejected parents %s (wtxid=%s)\n",
tx.GetHash().ToString(),
tx.GetWitnessHash().ToString());
// We will continue to reject this tx since it has rejected
@@ -4714,7 +4707,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// When a transaction fails for TX_RECONSIDERABLE, look for a matching child in the
// orphanage, as it is possible that they succeed as a package.
if (state.GetResult() == TxValidationResult::TX_RECONSIDERABLE) {
- LogPrint(BCLog::TXPACKAGES, "tx %s (wtxid=%s) failed but reconsiderable, looking for child in orphanage\n",
+ LogDebug(BCLog::TXPACKAGES, "tx %s (wtxid=%s) failed but reconsiderable, looking for child in orphanage\n",
txid.ToString(), wtxid.ToString());
if (auto package_to_validate{Find1P1CPackage(ptx, pfrom.GetId())}) {
const auto package_result{ProcessNewPackage(m_chainman.ActiveChainstate(), m_mempool, package_to_validate->m_txns, /*test_accept=*/false, /*client_maxfeerate=*/std::nullopt)};
@@ -4731,7 +4724,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
// Ignore cmpctblock received while importing
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Unexpected cmpctblock message received from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Unexpected cmpctblock message received from peer %d\n", pfrom.GetId());
return;
}
@@ -4751,9 +4744,9 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
MaybeSendGetHeaders(pfrom, GetLocator(m_chainman.m_best_header), *peer);
}
return;
- } else if (prev_block->nChainWork + CalculateClaimedHeadersWork({cmpctblock.header}) < GetAntiDoSWorkThreshold()) {
+ } else if (prev_block->nChainWork + CalculateClaimedHeadersWork({{cmpctblock.header}}) < GetAntiDoSWorkThreshold()) {
// If we get a low-work header in a compact block, we can ignore it.
- LogPrint(BCLog::NET, "Ignoring low-work compact block from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring low-work compact block from peer %d\n", pfrom.GetId());
return;
}
@@ -4764,7 +4757,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
const CBlockIndex *pindex = nullptr;
BlockValidationState state;
- if (!m_chainman.ProcessNewBlockHeaders({cmpctblock.header}, /*min_pow_checked=*/true, state, &pindex)) {
+ if (!m_chainman.ProcessNewBlockHeaders({{cmpctblock.header}}, /*min_pow_checked=*/true, state, &pindex)) {
if (state.IsInvalid()) {
MaybePunishNodeForBlock(pfrom.GetId(), state, /*via_compact_block=*/true, "invalid header via cmpctblock");
return;
@@ -4847,7 +4840,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
(*queuedBlockIt)->partialBlock.reset(new PartiallyDownloadedBlock(&m_mempool));
else {
// The block was already in flight using compact blocks from the same peer
- LogPrint(BCLog::NET, "Peer sent us compact block we were already syncing!\n");
+ LogDebug(BCLog::NET, "Peer sent us compact block we were already syncing!\n");
return;
}
}
@@ -4978,7 +4971,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
// Ignore blocktxn received while importing
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Unexpected blocktxn message received from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Unexpected blocktxn message received from peer %d\n", pfrom.GetId());
return;
}
@@ -4992,7 +4985,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
// Ignore headers received while importing
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Unexpected headers message received from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Unexpected headers message received from peer %d\n", pfrom.GetId());
return;
}
@@ -5000,7 +4993,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
unsigned int nCount = ReadCompactSize(vRecv);
- if (nCount > MAX_HEADERS_RESULTS) {
+ if (nCount > m_opts.max_headers_result) {
Misbehaving(*peer, strprintf("headers message size = %u", nCount));
return;
}
@@ -5033,14 +5026,14 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
// Ignore block received while importing
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Unexpected block message received from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Unexpected block message received from peer %d\n", pfrom.GetId());
return;
}
std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
vRecv >> TX_WITH_WITNESS(*pblock);
- LogPrint(BCLog::NET, "received block %s peer=%d\n", pblock->GetHash().ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received block %s peer=%d\n", pblock->GetHash().ToString(), pfrom.GetId());
const CBlockIndex* prev_block{WITH_LOCK(m_chainman.GetMutex(), return m_chainman.m_blockman.LookupBlockIndex(pblock->hashPrevBlock))};
@@ -5068,7 +5061,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
mapBlockSource.emplace(hash, std::make_pair(pfrom.GetId(), true));
// Check claimed work on this block against our anti-dos thresholds.
- if (prev_block && prev_block->nChainWork + CalculateClaimedHeadersWork({pblock->GetBlockHeader()}) >= GetAntiDoSWorkThreshold()) {
+ if (prev_block && prev_block->nChainWork + CalculateClaimedHeadersWork({{pblock->GetBlockHeader()}}) >= GetAntiDoSWorkThreshold()) {
min_pow_checked = true;
}
}
@@ -5083,7 +5076,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// Making nodes which are behind NAT and can only make outgoing connections ignore
// the getaddr message mitigates the attack.
if (!pfrom.IsInboundConn()) {
- LogPrint(BCLog::NET, "Ignoring \"getaddr\" from %s connection. peer=%d\n", pfrom.ConnectionTypeAsString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring \"getaddr\" from %s connection. peer=%d\n", pfrom.ConnectionTypeAsString(), pfrom.GetId());
return;
}
@@ -5094,7 +5087,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// Only send one GetAddr response per connection to reduce resource waste
// and discourage addr stamping of INV announcements.
if (peer->m_getaddr_recvd) {
- LogPrint(BCLog::NET, "Ignoring repeated \"getaddr\". peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring repeated \"getaddr\". peer=%d\n", pfrom.GetId());
return;
}
peer->m_getaddr_recvd = true;
@@ -5119,7 +5112,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
if (!pfrom.HasPermission(NetPermissionFlags::NoBan))
{
- LogPrint(BCLog::NET, "mempool request with bloom filters disabled, disconnect peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "mempool request with bloom filters disabled, disconnect peer=%d\n", pfrom.GetId());
pfrom.fDisconnect = true;
}
return;
@@ -5129,7 +5122,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
if (!pfrom.HasPermission(NetPermissionFlags::NoBan))
{
- LogPrint(BCLog::NET, "mempool request with bandwidth limit reached, disconnect peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "mempool request with bandwidth limit reached, disconnect peer=%d\n", pfrom.GetId());
pfrom.fDisconnect = true;
}
return;
@@ -5204,7 +5197,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (!(sProblem.empty())) {
- LogPrint(BCLog::NET, "pong peer=%d: %s, %x expected, %x received, %u bytes\n",
+ LogDebug(BCLog::NET, "pong peer=%d: %s, %x expected, %x received, %u bytes\n",
pfrom.GetId(),
sProblem,
peer->m_ping_nonce_sent,
@@ -5219,7 +5212,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::FILTERLOAD) {
if (!(peer->m_our_services & NODE_BLOOM)) {
- LogPrint(BCLog::NET, "filterload received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "filterload received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -5244,7 +5237,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::FILTERADD) {
if (!(peer->m_our_services & NODE_BLOOM)) {
- LogPrint(BCLog::NET, "filteradd received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "filteradd received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -5272,7 +5265,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::FILTERCLEAR) {
if (!(peer->m_our_services & NODE_BLOOM)) {
- LogPrint(BCLog::NET, "filterclear received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "filterclear received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -5296,7 +5289,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (auto tx_relay = peer->GetTxRelay(); tx_relay != nullptr) {
tx_relay->m_fee_filter_received = newFeeFilter;
}
- LogPrint(BCLog::NET, "received: feefilter of %s from peer=%d\n", CFeeRate(newFeeFilter).ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received: feefilter of %s from peer=%d\n", CFeeRate(newFeeFilter).ToString(), pfrom.GetId());
}
return;
}
@@ -5333,7 +5326,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
// Ignore unknown commands for extensibility
- LogPrint(BCLog::NET, "Unknown command \"%s\" from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
+ LogDebug(BCLog::NET, "Unknown command \"%s\" from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
return;
}
@@ -5363,14 +5356,14 @@ bool PeerManagerImpl::MaybeDiscourageAndDisconnect(CNode& pnode, Peer& peer)
if (pnode.addr.IsLocal()) {
// We disconnect local peers for bad behavior but don't discourage (since that would discourage
// all peers on the same local address)
- LogPrint(BCLog::NET, "Warning: disconnecting but not discouraging %s peer %d!\n",
+ LogDebug(BCLog::NET, "Warning: disconnecting but not discouraging %s peer %d!\n",
pnode.m_inbound_onion ? "inbound onion" : "local", peer.m_id);
pnode.fDisconnect = true;
return true;
}
// Normal case: Disconnect the peer and discourage all nodes sharing the address
- LogPrint(BCLog::NET, "Disconnecting and discouraging peer %d!\n", peer.m_id);
+ LogDebug(BCLog::NET, "Disconnecting and discouraging peer %d!\n", peer.m_id);
if (m_banman) m_banman->Discourage(pnode.addr);
m_connman.DisconnectNode(pnode.addr);
return true;
@@ -5449,9 +5442,9 @@ bool PeerManagerImpl::ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt
LOCK(m_tx_download_mutex);
if (m_orphanage.HaveTxToReconsider(peer->m_id)) fMoreWork = true;
} catch (const std::exception& e) {
- LogPrint(BCLog::NET, "%s(%s, %u bytes): Exception '%s' (%s) caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size, e.what(), typeid(e).name());
+ LogDebug(BCLog::NET, "%s(%s, %u bytes): Exception '%s' (%s) caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size, e.what(), typeid(e).name());
} catch (...) {
- LogPrint(BCLog::NET, "%s(%s, %u bytes): Unknown exception caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size);
+ LogDebug(BCLog::NET, "%s(%s, %u bytes): Unknown exception caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size);
}
return fMoreWork;
@@ -5504,7 +5497,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, Peer& peer, std::chrono::seco
MaybeSendGetHeaders(pto,
GetLocator(state.m_chain_sync.m_work_header->pprev),
peer);
- LogPrint(BCLog::NET, "sending getheaders to outbound peer=%d to verify chain work (current best known block:%s, benchmark blockhash: %s)\n", pto.GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>", state.m_chain_sync.m_work_header->GetBlockHash().ToString());
+ LogDebug(BCLog::NET, "sending getheaders to outbound peer=%d to verify chain work (current best known block:%s, benchmark blockhash: %s)\n", pto.GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>", state.m_chain_sync.m_work_header->GetBlockHash().ToString());
state.m_chain_sync.m_sent_getheaders = true;
// Bump the timeout to allow a response, which could clear the timeout
// (if the response shows the peer has synced), reset the timeout (if
@@ -5553,11 +5546,11 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
if (node_state == nullptr ||
(now - pnode->m_connected >= MINIMUM_CONNECT_TIME && node_state->vBlocksInFlight.empty())) {
pnode->fDisconnect = true;
- LogPrint(BCLog::NET, "disconnecting extra block-relay-only peer=%d (last block received at time %d)\n",
+ LogDebug(BCLog::NET, "disconnecting extra block-relay-only peer=%d (last block received at time %d)\n",
pnode->GetId(), count_seconds(pnode->m_last_block_time));
return true;
} else {
- LogPrint(BCLog::NET, "keeping block-relay-only peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
+ LogDebug(BCLog::NET, "keeping block-relay-only peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
pnode->GetId(), count_seconds(pnode->m_connected), node_state->vBlocksInFlight.size());
}
return false;
@@ -5604,11 +5597,11 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
// block from.
CNodeState &state = *State(pnode->GetId());
if (now - pnode->m_connected > MINIMUM_CONNECT_TIME && state.vBlocksInFlight.empty()) {
- LogPrint(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n", pnode->GetId(), oldest_block_announcement);
+ LogDebug(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n", pnode->GetId(), oldest_block_announcement);
pnode->fDisconnect = true;
return true;
} else {
- LogPrint(BCLog::NET, "keeping outbound peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
+ LogDebug(BCLog::NET, "keeping outbound peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
pnode->GetId(), count_seconds(pnode->m_connected), state.vBlocksInFlight.size());
return false;
}
@@ -5660,7 +5653,7 @@ void PeerManagerImpl::MaybeSendPing(CNode& node_to, Peer& peer, std::chrono::mic
{
// The ping timeout is using mocktime. To disable the check during
// testing, increase -peertimeout.
- LogPrint(BCLog::NET, "ping timeout: %fs peer=%d\n", 0.000001 * count_microseconds(now - peer.m_ping_start.load()), peer.m_id);
+ LogDebug(BCLog::NET, "ping timeout: %fs peer=%d\n", 0.000001 * count_microseconds(now - peer.m_ping_start.load()), peer.m_id);
node_to.fDisconnect = true;
return;
}
@@ -5894,7 +5887,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
const auto current_time{GetTime<std::chrono::microseconds>()};
if (pto->IsAddrFetchConn() && current_time - pto->m_connected > 10 * AVG_ADDRESS_BROADCAST_INTERVAL) {
- LogPrint(BCLog::NET, "addrfetch connection timeout; disconnecting peer=%d\n", pto->GetId());
+ LogDebug(BCLog::NET, "addrfetch connection timeout; disconnecting peer=%d\n", pto->GetId());
pto->fDisconnect = true;
return true;
}
@@ -5953,7 +5946,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
if (pindexStart->pprev)
pindexStart = pindexStart->pprev;
if (MaybeSendGetHeaders(*pto, GetLocator(pindexStart), *peer)) {
- LogPrint(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), peer->m_starting_height);
+ LogDebug(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), peer->m_starting_height);
state.fSyncStarted = true;
peer->m_headers_sync_timeout = current_time + HEADERS_DOWNLOAD_TIMEOUT_BASE +
@@ -6038,7 +6031,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
if (vHeaders.size() == 1 && state.m_requested_hb_cmpctblocks) {
// We only send up to 1 block as header-and-ids, as otherwise
// probably means we're doing an initial-ish-sync or they're slow
- LogPrint(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", __func__,
+ LogDebug(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", __func__,
vHeaders.front().GetHash().ToString(), pto->GetId());
std::optional<CSerializedNetMsg> cached_cmpctblock_msg;
@@ -6060,12 +6053,12 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
state.pindexBestHeaderSent = pBestIndex;
} else if (peer->m_prefers_headers) {
if (vHeaders.size() > 1) {
- LogPrint(BCLog::NET, "%s: %u headers, range (%s, %s), to peer=%d\n", __func__,
+ LogDebug(BCLog::NET, "%s: %u headers, range (%s, %s), to peer=%d\n", __func__,
vHeaders.size(),
vHeaders.front().GetHash().ToString(),
vHeaders.back().GetHash().ToString(), pto->GetId());
} else {
- LogPrint(BCLog::NET, "%s: sending header %s to peer=%d\n", __func__,
+ LogDebug(BCLog::NET, "%s: sending header %s to peer=%d\n", __func__,
vHeaders.front().GetHash().ToString(), pto->GetId());
}
MakeAndPushMessage(*pto, NetMsgType::HEADERS, TX_WITH_WITNESS(vHeaders));
@@ -6086,14 +6079,14 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// This should be very rare and could be optimized out.
// Just log for now.
if (m_chainman.ActiveChain()[pindex->nHeight] != pindex) {
- LogPrint(BCLog::NET, "Announcing block %s not on main chain (tip=%s)\n",
+ LogDebug(BCLog::NET, "Announcing block %s not on main chain (tip=%s)\n",
hashToAnnounce.ToString(), m_chainman.ActiveChain().Tip()->GetBlockHash().ToString());
}
// If the peer's chain has this block, don't inv it back.
if (!PeerHasHeader(&state, pindex)) {
peer->m_blocks_for_inv_relay.push_back(hashToAnnounce);
- LogPrint(BCLog::NET, "%s: sending inv peer=%d hash=%s\n", __func__,
+ LogDebug(BCLog::NET, "%s: sending inv peer=%d hash=%s\n", __func__,
pto->GetId(), hashToAnnounce.ToString());
}
}
@@ -6244,7 +6237,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// bandwidth is insufficient.
const auto new_timeout = std::min(2 * stalling_timeout, BLOCK_STALLING_TIMEOUT_MAX);
if (stalling_timeout != new_timeout && m_block_stalling_timeout.compare_exchange_strong(stalling_timeout, new_timeout)) {
- LogPrint(BCLog::NET, "Increased stalling timeout temporarily to %d seconds\n", count_seconds(new_timeout));
+ LogDebug(BCLog::NET, "Increased stalling timeout temporarily to %d seconds\n", count_seconds(new_timeout));
}
return true;
}
@@ -6327,13 +6320,13 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
uint32_t nFetchFlags = GetFetchFlags(*peer);
vGetData.emplace_back(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash());
BlockRequested(pto->GetId(), *pindex);
- LogPrint(BCLog::NET, "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(),
+ LogDebug(BCLog::NET, "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(),
pindex->nHeight, pto->GetId());
}
if (state.vBlocksInFlight.empty() && staller != -1) {
if (State(staller)->m_stalling_since == 0us) {
State(staller)->m_stalling_since = current_time;
- LogPrint(BCLog::NET, "Stall started peer=%d\n", staller);
+ LogDebug(BCLog::NET, "Stall started peer=%d\n", staller);
}
}
}
@@ -6346,14 +6339,14 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
std::vector<std::pair<NodeId, GenTxid>> expired;
auto requestable = m_txrequest.GetRequestable(pto->GetId(), current_time, &expired);
for (const auto& entry : expired) {
- LogPrint(BCLog::NET, "timeout of inflight %s %s from peer=%d\n", entry.second.IsWtxid() ? "wtx" : "tx",
+ LogDebug(BCLog::NET, "timeout of inflight %s %s from peer=%d\n", entry.second.IsWtxid() ? "wtx" : "tx",
entry.second.GetHash().ToString(), entry.first);
}
for (const GenTxid& gtxid : requestable) {
// Exclude m_lazy_recent_rejects_reconsiderable: we may be requesting a missing parent
// that was previously rejected for being too low feerate.
if (!AlreadyHaveTx(gtxid, /*include_reconsiderable=*/false)) {
- LogPrint(BCLog::NET, "Requesting %s %s peer=%d\n", gtxid.IsWtxid() ? "wtx" : "tx",
+ LogDebug(BCLog::NET, "Requesting %s %s peer=%d\n", gtxid.IsWtxid() ? "wtx" : "tx",
gtxid.GetHash().ToString(), pto->GetId());
vGetData.emplace_back(gtxid.IsWtxid() ? MSG_WTX : (MSG_TX | GetFetchFlags(*peer)), gtxid.GetHash());
if (vGetData.size() >= MAX_GETDATA_SZ) {
diff --git a/src/net_processing.h b/src/net_processing.h
index a413db98e8..5f45fb1442 100644
--- a/src/net_processing.h
+++ b/src/net_processing.h
@@ -31,6 +31,9 @@ static const bool DEFAULT_PEERBLOOMFILTERS = false;
static const bool DEFAULT_PEERBLOCKFILTERS = false;
/** Maximum number of outstanding CMPCTBLOCK requests for the same block. */
static const unsigned int MAX_CMPCTBLOCKS_INFLIGHT_PER_BLOCK = 3;
+/** Number of headers sent in one getheaders result. We rely on the assumption that if a peer sends
+ * less than this number, we reached its tip. Changing this value is a protocol upgrade. */
+static const unsigned int MAX_HEADERS_RESULTS = 2000;
struct CNodeStateStats {
int nSyncHeight = -1;
@@ -71,6 +74,8 @@ public:
//! Whether or not the internal RNG behaves deterministically (this is
//! a test-only option).
bool deterministic_rng{false};
+ //! Number of headers sent in one getheaders message result.
+ uint32_t max_headers_result{MAX_HEADERS_RESULTS};
};
static std::unique_ptr<PeerManager> make(CConnman& connman, AddrMan& addrman,
diff --git a/src/netaddress.cpp b/src/netaddress.cpp
index 0053464822..bd2353a712 100644
--- a/src/netaddress.cpp
+++ b/src/netaddress.cpp
@@ -245,14 +245,14 @@ bool CNetAddr::SetTor(const std::string& addr)
Span<const uint8_t> input_checksum{input->data() + ADDR_TORV3_SIZE, torv3::CHECKSUM_LEN};
Span<const uint8_t> input_version{input->data() + ADDR_TORV3_SIZE + torv3::CHECKSUM_LEN, sizeof(torv3::VERSION)};
- if (input_version != torv3::VERSION) {
+ if (!std::ranges::equal(input_version, torv3::VERSION)) {
return false;
}
uint8_t calculated_checksum[torv3::CHECKSUM_LEN];
torv3::Checksum(input_pubkey, calculated_checksum);
- if (input_checksum != calculated_checksum) {
+ if (!std::ranges::equal(input_checksum, calculated_checksum)) {
return false;
}
diff --git a/src/netbase.cpp b/src/netbase.cpp
index 7193b401bb..76a5f9834e 100644
--- a/src/netbase.cpp
+++ b/src/netbase.cpp
@@ -230,7 +230,7 @@ CService LookupNumeric(const std::string& name, uint16_t portDefault, DNSLookupF
bool IsUnixSocketPath(const std::string& name)
{
#ifdef HAVE_SOCKADDR_UN
- if (name.find(ADDR_PREFIX_UNIX) != 0) return false;
+ if (!name.starts_with(ADDR_PREFIX_UNIX)) return false;
// Split off "unix:" prefix
std::string str{name.substr(ADDR_PREFIX_UNIX.length())};
@@ -373,7 +373,7 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
{
try {
IntrRecvError recvr;
- LogPrint(BCLog::NET, "SOCKS5 connecting %s\n", strDest);
+ LogDebug(BCLog::NET, "SOCKS5 connecting %s\n", strDest);
if (strDest.size() > 255) {
LogError("Hostname too long\n");
return false;
@@ -412,7 +412,7 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
vAuth.push_back(auth->password.size());
vAuth.insert(vAuth.end(), auth->password.begin(), auth->password.end());
sock.SendComplete(vAuth, g_socks5_recv_timeout, g_socks5_interrupt);
- LogPrint(BCLog::PROXY, "SOCKS5 sending proxy authentication %s:%s\n", auth->username, auth->password);
+ LogDebug(BCLog::PROXY, "SOCKS5 sending proxy authentication %s:%s\n", auth->username, auth->password);
uint8_t pchRetA[2];
if (InterruptibleRecv(pchRetA, 2, g_socks5_recv_timeout, sock) != IntrRecvError::OK) {
LogError("Error reading proxy authentication response\n");
@@ -491,7 +491,7 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
LogError("Error reading from proxy\n");
return false;
}
- LogPrint(BCLog::NET, "SOCKS5 connected %s\n", strDest);
+ LogDebug(BCLog::NET, "SOCKS5 connected %s\n", strDest);
return true;
} catch (const std::runtime_error& e) {
LogError("Error during SOCKS5 proxy handshake: %s\n", e.what());
@@ -547,7 +547,7 @@ std::unique_ptr<Sock> CreateSockOS(int domain, int type, int protocol)
// Set the no-delay option (disable Nagle's algorithm) on the TCP socket.
const int on{1};
if (sock->SetSockOpt(IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == SOCKET_ERROR) {
- LogPrint(BCLog::NET, "Unable to set TCP_NODELAY on a newly created socket, continuing anyway\n");
+ LogDebug(BCLog::NET, "Unable to set TCP_NODELAY on a newly created socket, continuing anyway\n");
}
}
@@ -557,12 +557,13 @@ std::unique_ptr<Sock> CreateSockOS(int domain, int type, int protocol)
std::function<std::unique_ptr<Sock>(int, int, int)> CreateSock = CreateSockOS;
template<typename... Args>
-static void LogConnectFailure(bool manual_connection, const char* fmt, const Args&... args) {
+static void LogConnectFailure(bool manual_connection, util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args)
+{
std::string error_message = tfm::format(fmt, args...);
if (manual_connection) {
LogPrintf("%s\n", error_message);
} else {
- LogPrint(BCLog::NET, "%s\n", error_message);
+ LogDebug(BCLog::NET, "%s\n", error_message);
}
}
diff --git a/src/netbase.h b/src/netbase.h
index 8ef6c28996..bf4d7ececc 100644
--- a/src/netbase.h
+++ b/src/netbase.h
@@ -134,6 +134,13 @@ public:
return Contains(addr.GetNetwork());
}
+ [[nodiscard]] std::unordered_set<Network> All() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
+ {
+ AssertLockNotHeld(m_mutex);
+ LOCK(m_mutex);
+ return m_reachable;
+ }
+
private:
mutable Mutex m_mutex;
diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp
index 96cf69927c..b40ca0260b 100644
--- a/src/node/blockstorage.cpp
+++ b/src/node/blockstorage.cpp
@@ -367,7 +367,7 @@ void BlockManager::FindFilesToPrune(
}
}
- LogPrint(BCLog::PRUNE, "[%s] target=%dMiB actual=%dMiB diff=%dMiB min_height=%d max_prune_height=%d removed %d blk/rev pairs\n",
+ LogDebug(BCLog::PRUNE, "[%s] target=%dMiB actual=%dMiB diff=%dMiB min_height=%d max_prune_height=%d removed %d blk/rev pairs\n",
chain.GetRole(), target / 1024 / 1024, nCurrentUsage / 1024 / 1024,
(int64_t(target) - int64_t(nCurrentUsage)) / 1024 / 1024,
min_block_to_prune, last_block_can_prune, count);
@@ -812,7 +812,7 @@ void BlockManager::UnlinkPrunedFiles(const std::set<int>& setFilesToPrune) const
const bool removed_blockfile{fs::remove(m_block_file_seq.FileName(pos), ec)};
const bool removed_undofile{fs::remove(m_undo_file_seq.FileName(pos), ec)};
if (removed_blockfile || removed_undofile) {
- LogPrint(BCLog::BLOCKSTORAGE, "Prune: %s deleted blk/rev (%05u)\n", __func__, *it);
+ LogDebug(BCLog::BLOCKSTORAGE, "Prune: %s deleted blk/rev (%05u)\n", __func__, *it);
}
}
}
@@ -844,7 +844,7 @@ FlatFilePos BlockManager::FindNextBlockPos(unsigned int nAddSize, unsigned int n
assert(chain_type == BlockfileType::ASSUMED);
const auto new_cursor = BlockfileCursor{this->MaxBlockfileNum() + 1};
m_blockfile_cursors[chain_type] = new_cursor;
- LogPrint(BCLog::BLOCKSTORAGE, "[%s] initializing blockfile cursor to %s\n", chain_type, new_cursor);
+ LogDebug(BCLog::BLOCKSTORAGE, "[%s] initializing blockfile cursor to %s\n", chain_type, new_cursor);
}
const int last_blockfile = m_blockfile_cursors[chain_type]->file_num;
@@ -887,7 +887,7 @@ FlatFilePos BlockManager::FindNextBlockPos(unsigned int nAddSize, unsigned int n
pos.nPos = m_blockfile_info[nFile].nSize;
if (nFile != last_blockfile) {
- LogPrint(BCLog::BLOCKSTORAGE, "Leaving block file %i: %s (onto %i) (height %i)\n",
+ LogDebug(BCLog::BLOCKSTORAGE, "Leaving block file %i: %s (onto %i) (height %i)\n",
last_blockfile, m_blockfile_info[last_blockfile].ToString(), nFile, nHeight);
// Do not propagate the return code. The flush concerns a previous block
@@ -1210,7 +1210,7 @@ public:
}
};
-void ImportBlocks(ChainstateManager& chainman, std::vector<fs::path> vImportFiles)
+void ImportBlocks(ChainstateManager& chainman, std::span<const fs::path> import_paths)
{
ImportingNow imp{chainman.m_blockman.m_importing};
@@ -1245,7 +1245,7 @@ void ImportBlocks(ChainstateManager& chainman, std::vector<fs::path> vImportFile
}
// -loadblock=
- for (const fs::path& path : vImportFiles) {
+ for (const fs::path& path : import_paths) {
AutoFile file{fsbridge::fopen(path, "rb")};
if (!file.IsNull()) {
LogPrintf("Importing blocks file %s...\n", fs::PathToString(path));
diff --git a/src/node/blockstorage.h b/src/node/blockstorage.h
index 821bbf5109..03bc5f4600 100644
--- a/src/node/blockstorage.h
+++ b/src/node/blockstorage.h
@@ -29,6 +29,7 @@
#include <memory>
#include <optional>
#include <set>
+#include <span>
#include <string>
#include <unordered_map>
#include <utility>
@@ -429,7 +430,7 @@ public:
void CleanupBlockRevFiles() const;
};
-void ImportBlocks(ChainstateManager& chainman, std::vector<fs::path> vImportFiles);
+void ImportBlocks(ChainstateManager& chainman, std::span<const fs::path> import_paths);
} // namespace node
#endif // BITCOIN_NODE_BLOCKSTORAGE_H
diff --git a/src/node/caches.cpp b/src/node/caches.cpp
index 7403f7ddea..dc4d98f592 100644
--- a/src/node/caches.cpp
+++ b/src/node/caches.cpp
@@ -13,7 +13,6 @@ CacheSizes CalculateCacheSizes(const ArgsManager& args, size_t n_indexes)
{
int64_t nTotalCache = (args.GetIntArg("-dbcache", nDefaultDbCache) << 20);
nTotalCache = std::max(nTotalCache, nMinDbCache << 20); // total cache cannot be less than nMinDbCache
- nTotalCache = std::min(nTotalCache, nMaxDbCache << 20); // total cache cannot be greater than nMaxDbcache
CacheSizes sizes;
sizes.block_tree_db = std::min(nTotalCache / 8, nMaxBlockDBCache << 20);
nTotalCache -= sizes.block_tree_db;
diff --git a/src/node/chainstatemanager_args.cpp b/src/node/chainstatemanager_args.cpp
index 39b5f3ad3e..b86d0b2991 100644
--- a/src/node/chainstatemanager_args.cpp
+++ b/src/node/chainstatemanager_args.cpp
@@ -32,13 +32,20 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& args, ChainstateManage
if (auto value{args.GetBoolArg("-checkpoints")}) opts.checkpoints_enabled = *value;
if (auto value{args.GetArg("-minimumchainwork")}) {
- if (!IsHexNumber(*value)) {
- return util::Error{strprintf(Untranslated("Invalid non-hex (%s) minimum chain work value specified"), *value)};
+ if (auto min_work{uint256::FromUserHex(*value)}) {
+ opts.minimum_chain_work = UintToArith256(*min_work);
+ } else {
+ return util::Error{strprintf(Untranslated("Invalid minimum work specified (%s), must be up to %d hex digits"), *value, uint256::size() * 2)};
}
- opts.minimum_chain_work = UintToArith256(uint256S(*value));
}
- if (auto value{args.GetArg("-assumevalid")}) opts.assumed_valid_block = uint256S(*value);
+ if (auto value{args.GetArg("-assumevalid")}) {
+ if (auto block_hash{uint256::FromUserHex(*value)}) {
+ opts.assumed_valid_block = *block_hash;
+ } else {
+ return util::Error{strprintf(Untranslated("Invalid assumevalid block hash specified (%s), must be up to %d hex digits (or 0 to disable)"), *value, uint256::size() * 2)};
+ }
+ }
if (auto value{args.GetIntArg("-maxtipage")}) opts.max_tip_age = std::chrono::seconds{*value};
diff --git a/src/node/context.h b/src/node/context.h
index a664fad80b..398089ff3c 100644
--- a/src/node/context.h
+++ b/src/node/context.h
@@ -9,6 +9,7 @@
#include <cstdlib>
#include <functional>
#include <memory>
+#include <thread>
#include <vector>
class ArgsManager;
@@ -86,6 +87,7 @@ struct NodeContext {
std::atomic<int> exit_status{EXIT_SUCCESS};
//! Manages all the node warnings
std::unique_ptr<node::Warnings> warnings;
+ std::thread background_init_thread;
//! Declare default constructor and destructor that are not inline, so code
//! instantiating the NodeContext struct doesn't need to #include class
diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp
index 9fe08eb3dd..510541dfda 100644
--- a/src/node/interfaces.cpp
+++ b/src/node/interfaces.cpp
@@ -67,6 +67,7 @@
#include <boost/signals2/signal.hpp>
+using interfaces::BlockTemplate;
using interfaces::BlockTip;
using interfaces::Chain;
using interfaces::FoundBlock;
@@ -100,7 +101,7 @@ public:
void initParameterInteraction() override { InitParameterInteraction(args()); }
bilingual_str getWarnings() override { return Join(Assert(m_context->warnings)->GetMessages(), Untranslated("<hr />")); }
int getExitStatus() override { return Assert(m_context)->exit_status.load(); }
- uint32_t getLogCategories() override { return LogInstance().GetCategoryMask(); }
+ BCLog::CategoryMask getLogCategories() override { return LogInstance().GetCategoryMask(); }
bool baseInitialize() override
{
if (!AppInitBasicSetup(args(), Assert(context())->exit_status)) return false;
@@ -814,14 +815,32 @@ public:
});
return result;
}
- bool updateRwSetting(const std::string& name, const common::SettingsValue& value, bool write) override
+ bool updateRwSetting(const std::string& name,
+ const interfaces::SettingsUpdate& update_settings_func) override
{
+ std::optional<interfaces::SettingsAction> action;
args().LockSettings([&](common::Settings& settings) {
- if (value.isNull()) {
- settings.rw_settings.erase(name);
- } else {
- settings.rw_settings[name] = value;
- }
+ auto* ptr_value = common::FindKey(settings.rw_settings, name);
+ // Create value if it doesn't exist
+ auto& value = ptr_value ? *ptr_value : settings.rw_settings[name];
+ action = update_settings_func(value);
+ });
+ if (!action) return false;
+ // Now dump value to disk if requested
+ return *action == interfaces::SettingsAction::SKIP_WRITE || args().WriteSettingsFile();
+ }
+ bool overwriteRwSetting(const std::string& name, common::SettingsValue& value, bool write) override
+ {
+ if (value.isNull()) return deleteRwSettings(name, write);
+ return updateRwSetting(name, [&](common::SettingsValue& settings) {
+ settings = std::move(value);
+ return write ? interfaces::SettingsAction::WRITE : interfaces::SettingsAction::SKIP_WRITE;
+ });
+ }
+ bool deleteRwSettings(const std::string& name, bool write) override
+ {
+ args().LockSettings([&](common::Settings& settings) {
+ settings.rw_settings.erase(name);
});
return !write || args().WriteSettingsFile();
}
@@ -845,6 +864,52 @@ public:
NodeContext& m_node;
};
+class BlockTemplateImpl : public BlockTemplate
+{
+public:
+ explicit BlockTemplateImpl(std::unique_ptr<CBlockTemplate> block_template) : m_block_template(std::move(block_template))
+ {
+ assert(m_block_template);
+ }
+
+ CBlockHeader getBlockHeader() override
+ {
+ return m_block_template->block;
+ }
+
+ CBlock getBlock() override
+ {
+ return m_block_template->block;
+ }
+
+ std::vector<CAmount> getTxFees() override
+ {
+ return m_block_template->vTxFees;
+ }
+
+ std::vector<int64_t> getTxSigops() override
+ {
+ return m_block_template->vTxSigOpsCost;
+ }
+
+ CTransactionRef getCoinbaseTx() override
+ {
+ return m_block_template->block.vtx[0];
+ }
+
+ std::vector<unsigned char> getCoinbaseCommitment() override
+ {
+ return m_block_template->vchCoinbaseCommitment;
+ }
+
+ int getWitnessCommitmentIndex() override
+ {
+ return GetWitnessCommitmentIndex(m_block_template->block);
+ }
+
+ const std::unique_ptr<CBlockTemplate> m_block_template;
+};
+
class MinerImpl : public Mining
{
public:
@@ -891,11 +956,11 @@ public:
return TestBlockValidity(state, chainman().GetParams(), chainman().ActiveChainstate(), block, tip, /*fCheckPOW=*/false, check_merkle_root);
}
- std::unique_ptr<CBlockTemplate> createNewBlock(const CScript& script_pub_key, const BlockCreateOptions& options) override
+ std::unique_ptr<BlockTemplate> createNewBlock(const CScript& script_pub_key, const BlockCreateOptions& options) override
{
BlockAssembler::Options assemble_options{options};
ApplyArgsManOptions(*Assert(m_node.args), assemble_options);
- return BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(script_pub_key);
+ return std::make_unique<BlockTemplateImpl>(BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(script_pub_key));
}
NodeContext* context() override { return &m_node; }
diff --git a/src/node/miner.cpp b/src/node/miner.cpp
index fa2d979b86..181ae2ef05 100644
--- a/src/node/miner.cpp
+++ b/src/node/miner.cpp
@@ -33,6 +33,14 @@ int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParam
int64_t nOldTime = pblock->nTime;
int64_t nNewTime{std::max<int64_t>(pindexPrev->GetMedianTimePast() + 1, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now()))};
+ if (consensusParams.enforce_BIP94) {
+ // Height of block to be mined.
+ const int height{pindexPrev->nHeight + 1};
+ if (height % consensusParams.DifficultyAdjustmentInterval() == 0) {
+ nNewTime = std::max<int64_t>(nNewTime, pindexPrev->GetBlockTime() - MAX_TIMEWARP);
+ }
+ }
+
if (nOldTime < nNewTime) {
pblock->nTime = nNewTime;
}
@@ -105,10 +113,6 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
resetBlock();
pblocktemplate.reset(new CBlockTemplate());
-
- if (!pblocktemplate.get()) {
- return nullptr;
- }
CBlock* const pblock = &pblocktemplate->block; // pointer for convenience
// Add dummy coinbase tx as first transaction
@@ -171,7 +175,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
}
const auto time_2{SteadyClock::now()};
- LogPrint(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n",
+ LogDebug(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n",
Ticks<MillisecondsDouble>(time_1 - time_start), nPackagesSelected, nDescendantsUpdated,
Ticks<MillisecondsDouble>(time_2 - time_1),
Ticks<MillisecondsDouble>(time_2 - time_start));
diff --git a/src/policy/fees.cpp b/src/policy/fees.cpp
index 5f1d15c5f2..a17faa3b99 100644
--- a/src/policy/fees.cpp
+++ b/src/policy/fees.cpp
@@ -385,7 +385,7 @@ double TxConfirmStats::EstimateMedianVal(int confTarget, double sufficientTxVal,
failed_within_target_perc = 100 * failBucket.withinTarget / (failBucket.totalConfirmed + failBucket.inMempool + failBucket.leftMempool);
}
- LogPrint(BCLog::ESTIMATEFEE, "FeeEst: %d > %.0f%% decay %.5f: feerate: %g from (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out) Fail: (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out)\n",
+ LogDebug(BCLog::ESTIMATEFEE, "FeeEst: %d > %.0f%% decay %.5f: feerate: %g from (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out) Fail: (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out)\n",
confTarget, 100.0 * successBreakPoint, decay,
median, passBucket.start, passBucket.end,
passed_within_target_perc,
@@ -466,7 +466,7 @@ void TxConfirmStats::Read(AutoFile& filein, int nFileVersion, size_t numBuckets)
// to match the number of confirms and buckets
resizeInMemoryCounters(numBuckets);
- LogPrint(BCLog::ESTIMATEFEE, "Reading estimates: %u buckets counting confirms up to %u blocks\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Reading estimates: %u buckets counting confirms up to %u blocks\n",
numBuckets, maxConfirms);
}
@@ -485,7 +485,7 @@ void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHe
if (nBestSeenHeight == 0) // the BlockPolicyEstimator hasn't seen any blocks yet
blocksAgo = 0;
if (blocksAgo < 0) {
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error, blocks ago is negative for mempool tx\n");
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error, blocks ago is negative for mempool tx\n");
return; //This can't happen because we call this with our best seen height, no entries can have higher
}
@@ -493,7 +493,7 @@ void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHe
if (oldUnconfTxs[bucketindex] > 0) {
oldUnconfTxs[bucketindex]--;
} else {
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error, mempool tx removed from >25 blocks,bucketIndex=%u already\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error, mempool tx removed from >25 blocks,bucketIndex=%u already\n",
bucketindex);
}
}
@@ -502,7 +502,7 @@ void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHe
if (unconfTxs[blockIndex][bucketindex] > 0) {
unconfTxs[blockIndex][bucketindex]--;
} else {
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error, mempool tx removed from blockIndex=%u,bucketIndex=%u already\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error, mempool tx removed from blockIndex=%u,bucketIndex=%u already\n",
blockIndex, bucketindex);
}
}
@@ -595,7 +595,7 @@ void CBlockPolicyEstimator::processTransaction(const NewMempoolTransactionInfo&
const unsigned int txHeight = tx.info.txHeight;
const auto& hash = tx.info.m_tx->GetHash();
if (mapMemPoolTxs.count(hash)) {
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error mempool tx %s already being tracked\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error mempool tx %s already being tracked\n",
hash.ToString());
return;
}
@@ -649,7 +649,7 @@ bool CBlockPolicyEstimator::processBlockTx(unsigned int nBlockHeight, const Remo
if (blocksToConfirm <= 0) {
// This can't happen because we don't process transactions from a block with a height
// lower than our greatest seen height
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error Transaction had negative blocksToConfirm\n");
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error Transaction had negative blocksToConfirm\n");
return false;
}
@@ -699,11 +699,11 @@ void CBlockPolicyEstimator::processBlock(const std::vector<RemovedMempoolTransac
if (firstRecordedHeight == 0 && countedTxs > 0) {
firstRecordedHeight = nBestSeenHeight;
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy first recorded height %u\n", firstRecordedHeight);
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy first recorded height %u\n", firstRecordedHeight);
}
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy estimates updated by %u of %u block txs, since last block %u of %u tracked, mempool map size %u, max target %u from %s\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy estimates updated by %u of %u block txs, since last block %u of %u tracked, mempool map size %u, max target %u from %s\n",
countedTxs, txs_removed_for_block.size(), trackedTxs, trackedTxs + untrackedTxs, mapMemPoolTxs.size(),
MaxUsableEstimate(), HistoricalBlockSpan() > BlockSpan() ? "historical" : "current");
@@ -1055,7 +1055,7 @@ void CBlockPolicyEstimator::FlushUnconfirmed()
_removeTx(mi->first, false); // this calls erase() on mapMemPoolTxs
}
const auto endclear{SteadyClock::now()};
- LogPrint(BCLog::ESTIMATEFEE, "Recorded %u unconfirmed txs from mempool in %.3fs\n", num_entries, Ticks<SecondsDouble>(endclear - startclear));
+ LogDebug(BCLog::ESTIMATEFEE, "Recorded %u unconfirmed txs from mempool in %.3fs\n", num_entries, Ticks<SecondsDouble>(endclear - startclear));
}
std::chrono::hours CBlockPolicyEstimator::GetFeeEstimatorFileAge()
diff --git a/src/pow.cpp b/src/pow.cpp
index 50de8946be..6c8e7e5d98 100644
--- a/src/pow.cpp
+++ b/src/pow.cpp
@@ -134,8 +134,19 @@ bool PermittedDifficultyTransition(const Consensus::Params& params, int64_t heig
return true;
}
+// Bypasses the actual proof of work check during fuzz testing with a simplified validation checking whether
+// the most signficant bit of the last byte of the hash is set.
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params& params)
{
+#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
+ return (hash.data()[31] & 0x80) == 0;
+#else
+ return CheckProofOfWorkImpl(hash, nBits, params);
+#endif
+}
+
+bool CheckProofOfWorkImpl(uint256 hash, unsigned int nBits, const Consensus::Params& params)
+{
bool fNegative;
bool fOverflow;
arith_uint256 bnTarget;
diff --git a/src/pow.h b/src/pow.h
index ec03f318a4..2b28ade273 100644
--- a/src/pow.h
+++ b/src/pow.h
@@ -19,6 +19,7 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&);
+bool CheckProofOfWorkImpl(uint256 hash, unsigned int nBits, const Consensus::Params&);
/**
* Return false if the proof-of-work requirement specified by new_nbits at a
diff --git a/src/prevector.h b/src/prevector.h
index 6dcc305268..0c47137910 100644
--- a/src/prevector.h
+++ b/src/prevector.h
@@ -5,13 +5,13 @@
#ifndef BITCOIN_PREVECTOR_H
#define BITCOIN_PREVECTOR_H
-#include <assert.h>
-#include <cstdlib>
-#include <stdint.h>
-#include <string.h>
-
#include <algorithm>
+#include <cassert>
#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+#include <cstring>
+#include <iterator>
#include <type_traits>
#include <utility>
@@ -50,7 +50,6 @@ public:
T* ptr{};
public:
typedef Diff difference_type;
- typedef T value_type;
typedef T* pointer;
typedef T& reference;
using element_type = T;
@@ -102,7 +101,6 @@ public:
const T* ptr{};
public:
typedef Diff difference_type;
- typedef const T value_type;
typedef const T* pointer;
typedef const T& reference;
using element_type = const T;
@@ -212,7 +210,7 @@ private:
std::fill_n(dst, count, value);
}
- template<typename InputIterator>
+ template <std::input_iterator InputIterator>
void fill(T* dst, InputIterator first, InputIterator last) {
while (first != last) {
new(static_cast<void*>(dst)) T(*first);
@@ -231,7 +229,7 @@ public:
fill(item_ptr(0), n, val);
}
- template<typename InputIterator>
+ template <std::input_iterator InputIterator>
void assign(InputIterator first, InputIterator last) {
size_type n = last - first;
clear();
@@ -254,7 +252,7 @@ public:
fill(item_ptr(0), n, val);
}
- template<typename InputIterator>
+ template <std::input_iterator InputIterator>
prevector(InputIterator first, InputIterator last) {
size_type n = last - first;
change_capacity(n);
@@ -383,7 +381,7 @@ public:
fill(item_ptr(p), count, value);
}
- template<typename InputIterator>
+ template <std::input_iterator InputIterator>
void insert(iterator pos, InputIterator first, InputIterator last) {
size_type p = pos - begin();
difference_type count = last - first;
diff --git a/src/pubkey.cpp b/src/pubkey.cpp
index 13e3c2dbe0..0849d2a266 100644
--- a/src/pubkey.cpp
+++ b/src/pubkey.cpp
@@ -18,6 +18,8 @@
#include <algorithm>
#include <cassert>
+using namespace util::hex_literals;
+
namespace {
struct Secp256k1SelfTester
@@ -190,14 +192,7 @@ int ecdsa_signature_parse_der_lax(secp256k1_ecdsa_signature* sig, const unsigned
* For an example script for calculating H, refer to the unit tests in
* ./test/functional/test_framework/crypto/secp256k1.py
*/
-static const std::vector<unsigned char> NUMS_H_DATA{ParseHex("50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0")};
-const XOnlyPubKey XOnlyPubKey::NUMS_H{NUMS_H_DATA};
-
-XOnlyPubKey::XOnlyPubKey(Span<const unsigned char> bytes)
-{
- assert(bytes.size() == 32);
- std::copy(bytes.begin(), bytes.end(), m_keydata.begin());
-}
+constexpr XOnlyPubKey XOnlyPubKey::NUMS_H{"50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0"_hex_u8};
std::vector<CKeyID> XOnlyPubKey::GetKeyIDs() const
{
diff --git a/src/pubkey.h b/src/pubkey.h
index ae34ddd0af..b4666aad22 100644
--- a/src/pubkey.h
+++ b/src/pubkey.h
@@ -254,7 +254,7 @@ public:
bool IsNull() const { return m_keydata.IsNull(); }
/** Construct an x-only pubkey from exactly 32 bytes. */
- explicit XOnlyPubKey(Span<const unsigned char> bytes);
+ constexpr explicit XOnlyPubKey(std::span<const unsigned char> bytes) : m_keydata{bytes} {}
/** Construct an x-only pubkey from a normal pubkey. */
explicit XOnlyPubKey(const CPubKey& pubkey) : XOnlyPubKey(Span{pubkey}.subspan(1, 32)) {}
diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt
new file mode 100644
index 0000000000..297408a926
--- /dev/null
+++ b/src/qt/CMakeLists.txt
@@ -0,0 +1,331 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ enable_language(OBJCXX)
+ set(CMAKE_OBJCXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
+ set(CMAKE_OBJCXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
+ set(CMAKE_OBJCXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
+ set(CMAKE_OBJCXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
+ string(APPEND CMAKE_OBJCXX_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CXXFLAGS}")
+endif()
+
+get_target_property(qt_lib_type Qt5::Core TYPE)
+
+function(import_plugins target)
+ if(qt_lib_type STREQUAL "STATIC_LIBRARY")
+ set(plugins Qt5::QMinimalIntegrationPlugin)
+ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ list(APPEND plugins Qt5::QXcbIntegrationPlugin)
+ elseif(WIN32)
+ list(APPEND plugins Qt5::QWindowsIntegrationPlugin Qt5::QWindowsVistaStylePlugin)
+ elseif(APPLE)
+ list(APPEND plugins Qt5::QCocoaIntegrationPlugin Qt5::QMacStylePlugin)
+ endif()
+ qt5_import_plugins(${target}
+ INCLUDE ${plugins}
+ EXCLUDE_BY_TYPE imageformats iconengines
+ )
+ endif()
+endfunction()
+
+# For Qt-specific commands and variables, please consult:
+# - https://cmake.org/cmake/help/latest/manual/cmake-qt.7.html
+# - https://doc.qt.io/qt-5/cmake-manual.html
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+set(CMAKE_AUTOUIC_SEARCH_PATHS forms)
+
+# TODO: The file(GLOB ...) command should be replaced with an explicit
+# file list. Such a change must be synced with the corresponding change
+# to https://github.com/bitcoin-core/bitcoin-maintainer-tools/blob/main/update-translations.py
+file(GLOB ts_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} locale/*.ts)
+set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/locale)
+qt5_add_translation(qm_files ${ts_files})
+
+configure_file(bitcoin_locale.qrc bitcoin_locale.qrc USE_SOURCE_PERMISSIONS COPYONLY)
+
+# The bitcoinqt sources have to include headers in
+# order to parse them to collect translatable strings.
+add_library(bitcoinqt STATIC EXCLUDE_FROM_ALL
+ bantablemodel.cpp
+ bantablemodel.h
+ bitcoin.cpp
+ bitcoin.h
+ bitcoinaddressvalidator.cpp
+ bitcoinaddressvalidator.h
+ bitcoinamountfield.cpp
+ bitcoinamountfield.h
+ bitcoingui.cpp
+ bitcoingui.h
+ bitcoinunits.cpp
+ bitcoinunits.h
+ clientmodel.cpp
+ clientmodel.h
+ csvmodelwriter.cpp
+ csvmodelwriter.h
+ guiutil.cpp
+ guiutil.h
+ initexecutor.cpp
+ initexecutor.h
+ intro.cpp
+ intro.h
+ $<$<PLATFORM_ID:Darwin>:macdockiconhandler.h>
+ $<$<PLATFORM_ID:Darwin>:macdockiconhandler.mm>
+ $<$<PLATFORM_ID:Darwin>:macnotificationhandler.h>
+ $<$<PLATFORM_ID:Darwin>:macnotificationhandler.mm>
+ $<$<PLATFORM_ID:Darwin>:macos_appnap.h>
+ $<$<PLATFORM_ID:Darwin>:macos_appnap.mm>
+ modaloverlay.cpp
+ modaloverlay.h
+ networkstyle.cpp
+ networkstyle.h
+ notificator.cpp
+ notificator.h
+ optionsdialog.cpp
+ optionsdialog.h
+ optionsmodel.cpp
+ optionsmodel.h
+ peertablemodel.cpp
+ peertablemodel.h
+ peertablesortproxy.cpp
+ peertablesortproxy.h
+ platformstyle.cpp
+ platformstyle.h
+ qvalidatedlineedit.cpp
+ qvalidatedlineedit.h
+ qvaluecombobox.cpp
+ qvaluecombobox.h
+ rpcconsole.cpp
+ rpcconsole.h
+ splashscreen.cpp
+ splashscreen.h
+ trafficgraphwidget.cpp
+ trafficgraphwidget.h
+ utilitydialog.cpp
+ utilitydialog.h
+ $<$<PLATFORM_ID:Windows>:winshutdownmonitor.cpp>
+ $<$<PLATFORM_ID:Windows>:winshutdownmonitor.h>
+ bitcoin.qrc
+ ${CMAKE_CURRENT_BINARY_DIR}/bitcoin_locale.qrc
+)
+target_compile_definitions(bitcoinqt
+ PUBLIC
+ QT_NO_KEYWORDS
+ QT_USE_QSTRINGBUILDER
+)
+target_include_directories(bitcoinqt
+ PUBLIC
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
+)
+set_property(SOURCE macnotificationhandler.mm
+ # Ignore warnings "'NSUserNotificationCenter' is deprecated: first deprecated in macOS 11.0".
+ APPEND PROPERTY COMPILE_OPTIONS -Wno-deprecated-declarations
+)
+target_link_libraries(bitcoinqt
+ PUBLIC
+ Qt5::Widgets
+ PRIVATE
+ core_interface
+ bitcoin_cli
+ leveldb
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:NATPMP::NATPMP>
+ $<TARGET_NAME_IF_EXISTS:MiniUPnPc::MiniUPnPc>
+ $<TARGET_NAME_IF_EXISTS:PkgConfig::libqrencode>
+ $<$<PLATFORM_ID:Darwin>:-framework\ AppKit>
+ $<$<CXX_COMPILER_ID:MSVC>:shlwapi>
+)
+
+if(ENABLE_WALLET)
+ target_sources(bitcoinqt
+ PRIVATE
+ addressbookpage.cpp
+ addressbookpage.h
+ addresstablemodel.cpp
+ addresstablemodel.h
+ askpassphrasedialog.cpp
+ askpassphrasedialog.h
+ coincontroldialog.cpp
+ coincontroldialog.h
+ coincontroltreewidget.cpp
+ coincontroltreewidget.h
+ createwalletdialog.cpp
+ createwalletdialog.h
+ editaddressdialog.cpp
+ editaddressdialog.h
+ openuridialog.cpp
+ openuridialog.h
+ overviewpage.cpp
+ overviewpage.h
+ paymentserver.cpp
+ paymentserver.h
+ psbtoperationsdialog.cpp
+ psbtoperationsdialog.h
+ qrimagewidget.cpp
+ qrimagewidget.h
+ receivecoinsdialog.cpp
+ receivecoinsdialog.h
+ receiverequestdialog.cpp
+ receiverequestdialog.h
+ recentrequeststablemodel.cpp
+ recentrequeststablemodel.h
+ sendcoinsdialog.cpp
+ sendcoinsdialog.h
+ sendcoinsentry.cpp
+ sendcoinsentry.h
+ signverifymessagedialog.cpp
+ signverifymessagedialog.h
+ transactiondesc.cpp
+ transactiondesc.h
+ transactiondescdialog.cpp
+ transactiondescdialog.h
+ transactionfilterproxy.cpp
+ transactionfilterproxy.h
+ transactionoverviewwidget.cpp
+ transactionoverviewwidget.h
+ transactionrecord.cpp
+ transactionrecord.h
+ transactiontablemodel.cpp
+ transactiontablemodel.h
+ transactionview.cpp
+ transactionview.h
+ walletcontroller.cpp
+ walletcontroller.h
+ walletframe.cpp
+ walletframe.h
+ walletmodel.cpp
+ walletmodel.h
+ walletmodeltransaction.cpp
+ walletmodeltransaction.h
+ walletview.cpp
+ walletview.h
+ )
+ target_link_libraries(bitcoinqt
+ PRIVATE
+ bitcoin_wallet
+ Qt5::Network
+ )
+endif()
+
+if(WITH_DBUS)
+ target_link_libraries(bitcoinqt PRIVATE Qt5::DBus)
+endif()
+
+if(qt_lib_type STREQUAL "STATIC_LIBRARY")
+ # We want to define static plugins to link ourselves, thus preventing
+ # automatic linking against a "sane" set of default static plugins.
+ qt5_import_plugins(bitcoinqt
+ EXCLUDE_BY_TYPE bearer iconengines imageformats platforms styles
+ )
+endif()
+
+add_executable(bitcoin-qt
+ main.cpp
+ ../init/bitcoin-qt.cpp
+)
+
+add_windows_resources(bitcoin-qt res/bitcoin-qt-res.rc)
+
+target_link_libraries(bitcoin-qt
+ core_interface
+ bitcoinqt
+ bitcoin_node
+)
+
+import_plugins(bitcoin-qt)
+set(installable_targets bitcoin-qt)
+if(WIN32)
+ set_target_properties(bitcoin-qt PROPERTIES WIN32_EXECUTABLE TRUE)
+endif()
+
+if(WITH_MULTIPROCESS)
+ add_executable(bitcoin-gui
+ main.cpp
+ ../init/bitcoin-gui.cpp
+ )
+ target_link_libraries(bitcoin-gui
+ core_interface
+ bitcoinqt
+ bitcoin_node
+ bitcoin_ipc
+ )
+ import_plugins(bitcoin-gui)
+ list(APPEND installable_targets bitcoin-gui)
+ if(WIN32)
+ set_target_properties(bitcoin-gui PROPERTIES WIN32_EXECUTABLE TRUE)
+ endif()
+endif()
+
+install(TARGETS ${installable_targets}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ COMPONENT GUI
+)
+
+if(BUILD_GUI_TESTS)
+ add_subdirectory(test)
+endif()
+
+
+# Gets sources to be parsed to gather translatable strings.
+function(get_translatable_sources var)
+ set(result)
+ set(targets)
+ foreach(dir IN ITEMS ${ARGN})
+ get_directory_property(dir_targets DIRECTORY ${PROJECT_SOURCE_DIR}/${dir} BUILDSYSTEM_TARGETS)
+ list(APPEND targets ${dir_targets})
+ endforeach()
+ foreach(target IN LISTS targets)
+ get_target_property(target_sources ${target} SOURCES)
+ if(target_sources)
+ foreach(source IN LISTS target_sources)
+ # Get an expression from the generator expression, if any.
+ if(source MATCHES ":([^>]+)>$")
+ set(source ${CMAKE_MATCH_1})
+ endif()
+ cmake_path(GET source EXTENSION LAST_ONLY ext)
+ if(ext STREQUAL ".qrc")
+ continue()
+ endif()
+ if(NOT IS_ABSOLUTE source)
+ get_target_property(target_source_dir ${target} SOURCE_DIR)
+ cmake_path(APPEND target_source_dir ${source} OUTPUT_VARIABLE source)
+ endif()
+ list(APPEND result ${source})
+ endforeach()
+ endif()
+ endforeach()
+ set(${var} ${result} PARENT_SCOPE)
+endfunction()
+
+find_program(XGETTEXT_EXECUTABLE xgettext)
+find_program(SED_EXECUTABLE sed)
+if(NOT XGETTEXT_EXECUTABLE)
+ add_custom_target(translate
+ COMMAND ${CMAKE_COMMAND} -E echo "Error: GNU gettext-tools not found"
+ )
+elseif(NOT SED_EXECUTABLE)
+ add_custom_target(translate
+ COMMAND ${CMAKE_COMMAND} -E echo "Error: GNU sed not found"
+ )
+else()
+ set(translatable_sources_directories src src/qt src/util)
+ if(ENABLE_WALLET)
+ list(APPEND translatable_sources_directories src/wallet)
+ endif()
+ get_translatable_sources(translatable_sources ${translatable_sources_directories})
+ get_translatable_sources(qt_translatable_sources src/qt)
+ file(GLOB ui_files ${CMAKE_CURRENT_SOURCE_DIR}/forms/*.ui)
+ add_custom_target(translate
+ COMMAND ${CMAKE_COMMAND} -E env XGETTEXT=${XGETTEXT_EXECUTABLE} COPYRIGHT_HOLDERS=${COPYRIGHT_HOLDERS} ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/share/qt/extract_strings_qt.py ${translatable_sources}
+ COMMAND Qt5::lupdate -no-obsolete -I ${PROJECT_SOURCE_DIR}/src -locations relative ${CMAKE_CURRENT_SOURCE_DIR}/bitcoinstrings.cpp ${ui_files} ${qt_translatable_sources} -ts ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts
+ COMMAND Qt5::lconvert -drop-translations -o ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf -i ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts
+ COMMAND ${SED_EXECUTABLE} -i.old -e "s|source-language=\"en\" target-language=\"en\"|source-language=\"en\"|" -e "/<target xml:space=\"preserve\"><\\/target>/d" ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf
+ COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf.old
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src
+ VERBATIM
+ )
+endif()
diff --git a/src/qt/Makefile b/src/qt/Makefile
deleted file mode 100644
index 3bd6199059..0000000000
--- a/src/qt/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-.PHONY: FORCE
-all: FORCE
- $(MAKE) -C .. bitcoin_qt test_bitcoin_qt
-clean: FORCE
- $(MAKE) -C .. bitcoin_qt_clean test_bitcoin_qt_clean
-check: FORCE
- $(MAKE) -C .. test_bitcoin_qt_check
-bitcoin-qt bitcoin-qt.exe: FORCE
- $(MAKE) -C .. bitcoin_qt
-apk: FORCE
- $(MAKE) -C .. bitcoin_qt_apk
diff --git a/src/qt/README.md b/src/qt/README.md
index 20c712c98d..1c6f963ccf 100644
--- a/src/qt/README.md
+++ b/src/qt/README.md
@@ -4,14 +4,14 @@ The current precise version for Qt 5 is specified in [qt.mk](/depends/packages/q
## Compile and run
-See build instructions: [Unix](/doc/build-unix.md), [macOS](/doc/build-osx.md), [Windows](/doc/build-windows.md), [FreeBSD](/doc/build-freebsd.md), [NetBSD](/doc/build-netbsd.md), [OpenBSD](/doc/build-openbsd.md)
+See build instructions: [Unix](/doc/build-unix.md), [macOS](/doc/build-osx.md), [Windows](/doc/build-windows-msvc.md), [FreeBSD](/doc/build-freebsd.md), [NetBSD](/doc/build-netbsd.md), [OpenBSD](/doc/build-openbsd.md)
When following your systems build instructions, make sure to install the `Qt` dependencies.
To run:
```sh
-./src/qt/bitcoin-qt
+./build/src/qt/bitcoin-qt
```
## Files and Directories
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 690c2b6f5a..ec415f0bac 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -60,21 +60,6 @@
#include <QTranslator>
#include <QWindow>
-#if defined(QT_STATIC)
-#include <QtPlugin>
-#if defined(QT_QPA_PLATFORM_XCB)
-Q_IMPORT_PLUGIN(QXcbIntegrationPlugin);
-#elif defined(QT_QPA_PLATFORM_WINDOWS)
-Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
-Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin);
-#elif defined(QT_QPA_PLATFORM_COCOA)
-Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin);
-Q_IMPORT_PLUGIN(QMacStylePlugin);
-#elif defined(QT_QPA_PLATFORM_ANDROID)
-Q_IMPORT_PLUGIN(QAndroidPlatformIntegrationPlugin)
-#endif
-#endif
-
// Declare meta types used for QMetaObject::invokeMethod
Q_DECLARE_METATYPE(bool*)
Q_DECLARE_METATYPE(CAmount)
@@ -212,7 +197,7 @@ void DebugMessageHandler(QtMsgType type, const QMessageLogContext& context, cons
{
Q_UNUSED(context);
if (type == QtDebugMsg) {
- LogPrint(BCLog::QT, "GUI: %s\n", msg.toStdString());
+ LogDebug(BCLog::QT, "GUI: %s\n", msg.toStdString());
} else {
LogPrintf("GUI: %s\n", msg.toStdString());
}
@@ -540,7 +525,7 @@ int GuiMain(int argc, char* argv[])
/// 2. Parse command-line options. We do this after qt in order to show an error if there are problems parsing these
// Command-line options take precedence:
- SetupServerArgs(gArgs);
+ SetupServerArgs(gArgs, init->canListenIpc());
SetupUIArgs(gArgs);
std::string error;
if (!gArgs.ParseParameters(argc, argv, error)) {
diff --git a/src/qt/bitcoin_locale.qrc b/src/qt/bitcoin_locale.qrc
index 8883134b83..e1f2697391 100644
--- a/src/qt/bitcoin_locale.qrc
+++ b/src/qt/bitcoin_locale.qrc
@@ -1,6 +1,5 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/translations">
- <file alias="af">locale/bitcoin_af.qm</file>
<file alias="am">locale/bitcoin_am.qm</file>
<file alias="ar">locale/bitcoin_ar.qm</file>
<file alias="az">locale/bitcoin_az.qm</file>
@@ -104,6 +103,7 @@
<file alias="szl">locale/bitcoin_szl.qm</file>
<file alias="ta">locale/bitcoin_ta.qm</file>
<file alias="te">locale/bitcoin_te.qm</file>
+ <file alias="th">locale/bitcoin_th.qm</file>
<file alias="tk">locale/bitcoin_tk.qm</file>
<file alias="tl">locale/bitcoin_tl.qm</file>
<file alias="tr">locale/bitcoin_tr.qm</file>
diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui
index 99fb238772..1ce23c72bb 100644
--- a/src/qt/forms/optionsdialog.ui
+++ b/src/qt/forms/optionsdialog.ui
@@ -105,7 +105,7 @@
<item>
<widget class="QLabel" name="databaseCacheLabel">
<property name="toolTip">
- <string extracomment="Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.">Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</string>
+ <string extracomment="Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.">Maximum database cache size. Make sure you have enough RAM. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</string>
</property>
<property name="text">
<string>Size of &amp;database cache</string>
diff --git a/src/qt/locale/bitcoin_af.ts b/src/qt/locale/bitcoin_af.ts
deleted file mode 100644
index cc4eefbe31..0000000000
--- a/src/qt/locale/bitcoin_af.ts
+++ /dev/null
@@ -1,315 +0,0 @@
-<TS version="2.1" language="af">
-<context>
- <name>AddressBookPage</name>
- <message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Regsklik om adres of etiket te verander</translation>
- </message>
- <message>
- <source>Create a new address</source>
- <translation type="unfinished">Skep ’n nuwe adres</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
-Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">
-Hierdie is die adresse waar u Bitcoins sal ontvang. Ons beveel aan dat u 'n nuwe adres kies vir elke transaksie</translation>
- </message>
- <message>
- <source>Sending addresses - %1</source>
- <translation type="unfinished">Stuur adresse -%1</translation>
- </message>
- <message>
- <source>Receiving addresses - %1</source>
- <translation type="unfinished">Ontvangs van adresse - %1</translation>
- </message>
- </context>
-<context>
- <name>AskPassphraseDialog</name>
- <message>
- <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">Die wagwoordfrase wat vir die beursie-dekripsie ingevoer is, is verkeerd. Dit bevat 'n nulkarakter (dws - 'n nulgreep). As die wagwoordfrase gestel is met 'n weergawe van hierdie sagteware voor 25.0, probeer asseblief weer met slegs die karakters tot - maar nie ingesluit nie - die eerste nulkarakter. As dit suksesvol is, stel asseblief 'n nuwe wagwoordfrase in om hierdie probleem in die toekoms te vermy.</translation>
- </message>
- <message>
- <source>Passphrase change failed</source>
- <translation type="unfinished">Wagfraseverandering het misluk</translation>
- </message>
- <message>
- <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">Die ou wagwoordfrase wat vir die beursie-dekripsie ingevoer is, is verkeerd. Dit bevat 'n nulkarakter (dws - 'n nulgreep). As die wagwoordfrase gestel is met 'n weergawe van hierdie sagteware voor 25.0, probeer asseblief weer met slegs die karakters tot - maar nie ingesluit nie - die eerste nulkarakter.</translation>
- </message>
- </context>
-<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">Instellingslêer %1 kan korrup of ongeldig wees.</translation>
- </message>
- </context>
-<context>
- <name>QObject</name>
- <message numerus="yes">
- <source>%n second(s)</source>
- <translation type="unfinished">
- <numerusform>%n second(s)</numerusform>
- <numerusform>%n second(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n minute(s)</source>
- <translation type="unfinished">
- <numerusform>%n minute(s)</numerusform>
- <numerusform>%n minute(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation type="unfinished">
- <numerusform>%n hour(s)</numerusform>
- <numerusform>%n hour(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation type="unfinished">
- <numerusform>%n day(s)</numerusform>
- <numerusform>%n day(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation type="unfinished">
- <numerusform>%n week(s)</numerusform>
- <numerusform>%n week(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation type="unfinished">
- <numerusform>%n year(s)</numerusform>
- <numerusform>%n year(s)</numerusform>
- </translation>
- </message>
- </context>
-<context>
- <name>BitcoinGUI</name>
- <message numerus="yes">
- <source>Processed %n block(s) of transaction history.</source>
- <translation type="unfinished">
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
- </translation>
- </message>
- <message>
- <source>Restore Wallet…</source>
- <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">Stel beursie terug …</translation>
- </message>
- <message>
- <source>Restore a wallet from a backup file</source>
- <extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">Herstel 'n beursie vanaf 'n rugsteunlêer</translation>
- </message>
- <message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Migreer Wallet</translation>
- </message>
- <message>
- <source>Migrate a wallet</source>
- <translation type="unfinished">Migreer Wallet</translation>
- </message>
- <message>
- <source>Load Wallet Backup</source>
- <extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Laai Wallet-rugsteun</translation>
- </message>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">Herstel beursie</translation>
- </message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network.</source>
- <extracomment>A substring of the tooltip.</extracomment>
- <translation type="unfinished">
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
- </translation>
- </message>
- <message>
- <source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Voor-sinkroniseringsopskrifte (%1%)...</translation>
- </message>
- <message>
- <source>Error creating wallet</source>
- <translation type="unfinished">Kon nie beursie skep nie</translation>
- </message>
- <message>
- <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Kan nie nuwe beursie skep nie, die sagteware is saamgestel sonder sqlite-ondersteuning (vereis vir beskrywer-beursies)</translation>
- </message>
- </context>
-<context>
- <name>CreateWalletActivity</name>
- <message>
- <source>Too many external signers found</source>
- <translation type="unfinished">Te veel eksterne ondertekenaars gevind</translation>
- </message>
-</context>
-<context>
- <name>MigrateWalletActivity</name>
- <message>
- <source>Migrate wallet</source>
- <translation type="unfinished">Migreer beursie</translation>
- </message>
- <message>
- <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Is jy seker jy wil die beursie migreer &lt;i&gt;%1&lt;/i&gt;?</translation>
- </message>
- <message>
- <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
-If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
-If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
-
-The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
- <translation type="unfinished">Om die beursie te migreer, sal hierdie beursie na een of meer beskrywer-beursies omskakel. 'n Nuwe beursie-rugsteun sal gemaak moet word.
-As hierdie beursie enige oplosbare maar nie gekykte skrifte bevat nie, sal 'n ander en nuwe beursie geskep word wat daardie skrifte bevat.
-As hierdie beursie enige oplosbare maar nie gekykte skrifte bevat nie, sal 'n ander en nuwe beursie geskep word wat daardie skrifte bevat.
-
-Die migrasieproses sal 'n rugsteun van die beursie skep voordat dit migreer. Hierdie rugsteunlêer sal 'n naam kry &lt;wallet name&gt;-&lt;timestamp&gt;. legacy.bak en kan gevind word in die gids vir hierdie beursie. In die geval van 'n verkeerde migrasie, kan die rugsteun met die "Herstel Wallet"-funksie herstel word.</translation>
- </message>
- <message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Migreer Wallet</translation>
- </message>
- <message>
- <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <translation type="unfinished">Migreer Wallet &lt;b&gt;%1&lt;/b&gt;...</translation>
- </message>
- <message>
- <source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">Die beursie'%1' is suksesvol gemigreer.</translation>
- </message>
- <message>
- <source>Migration failed</source>
- <translation type="unfinished">Migrasie het misluk</translation>
- </message>
- <message>
- <source>Migration Successful</source>
- <translation type="unfinished">Migrasie suksesvol</translation>
- </message>
-</context>
-<context>
- <name>RestoreWalletActivity</name>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">Herstel beursie</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">Herstel beursie &lt;b&gt;%1&lt;/b&gt;...</translation>
- </message>
- <message>
- <source>Restore wallet failed</source>
- <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Herstel beursie het misluk</translation>
- </message>
- <message>
- <source>Restore wallet warning</source>
- <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">Herstel beursie waarskuwing</translation>
- </message>
- <message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">Herstel beursieboodskap</translation>
- </message>
-</context>
-<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>You are one step away from creating your new wallet!</source>
- <translation type="unfinished">Jy is een stap weg van die skep van jou nuwe beursie!</translation>
- </message>
- <message>
- <source>Please provide a name and, if desired, enable any advanced options</source>
- <translation type="unfinished">Verskaf asseblief 'n naam en, indien verlang, aktiveer enige gevorderde opsies</translation>
- </message>
- </context>
-<context>
- <name>Intro</name>
- <message numerus="yes">
- <source>%n GB of space available</source>
- <translation type="unfinished">
- <numerusform>%n GB of space available</numerusform>
- <numerusform>%n GB of space available</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>(of %n GB needed)</source>
- <translation type="unfinished">
- <numerusform>(of %n GB needed)</numerusform>
- <numerusform>(of %n GB needed)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>(%n GB needed for full chain)</source>
- <translation type="unfinished">
- <numerusform>(%n GB needed for full chain)</numerusform>
- <numerusform>(%n GB needed for full chain)</numerusform>
- </translation>
- </message>
- <message>
- <source>Choose data directory</source>
- <translation type="unfinished">Kies datagids</translation>
- </message>
- <message numerus="yes">
- <source>(sufficient to restore backups %n day(s) old)</source>
- <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
- <translation type="unfinished">
- <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
- <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
- </translation>
- </message>
- <message>
- <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">Wanneer jy OK klik, %1 sal begin om die volledige af te laai en te verwerk %4 blok ketting (%2GB) begin met die vroegste transaksies in %3 wanneer %4 aanvanklik van stapel gestuur.</translation>
- </message>
- </context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Onbekend. Voor-sinkronisering opskrifte (%1, %2%)...</translation>
- </message>
-</context>
-<context>
- <name>OptionsDialog</name>
- <message>
- <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">Volle pad na 'n%1 versoenbare skrip (bv. C:\Downloads\hwi.exe of /Users/you/Downloads/hwi.py). Pasop: wanware kan jou munte steel!</translation>
- </message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation type="unfinished">
- <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
- <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
- </translation>
- </message>
- </context>
-<context>
- <name>TransactionDesc</name>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation type="unfinished">
- <numerusform>matures in %n more block(s)</numerusform>
- <numerusform>matures in %n more block(s)</numerusform>
- </translation>
- </message>
- </context>
-</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_am.ts b/src/qt/locale/bitcoin_am.ts
index 502acb9879..c02049b984 100644
--- a/src/qt/locale/bitcoin_am.ts
+++ b/src/qt/locale/bitcoin_am.ts
@@ -176,6 +176,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ቦርሳዎ áˆáˆµáŒ¢áˆ­ ተደርጓáˆ</translation>
</message>
<message>
+ <source>Back</source>
+ <translation type="unfinished">ተመለስ</translation>
+ </message>
+ <message>
<source>Wallet to be encrypted</source>
<translation type="unfinished">ለመመስጠር የተዘጋጀ ዋሌት</translation>
</message>
@@ -254,6 +258,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ስህተትᥠ%1</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">የተከተተ "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">áŠá‰£áˆª የስርዓት ቅርጸ-á‰áˆáŠ "%1</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">ብáŒâ€¦</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">መጠን</translation>
</message>
@@ -299,7 +315,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">መደበኛ ዋሌት</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -359,6 +379,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;ተቀበáˆ</translation>
</message>
<message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;የይለá ቃሠቀይር…</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">በእርሶ የተያዙ መሆኑን ለማረጋገጥ በBitcoin አድራሻዎችዎ መáˆá‹•áŠ­á‰¶á‰½áŠ• á‹­áˆáˆ­áˆ™</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation type="unfinished">&amp;á‹á‹­áˆ</translation>
</message>
@@ -402,8 +430,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ዋሌት á‹áŒ‹</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">መደበኛ ዋሌት</translation>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">ዋሌትዎን á‹«á‹›á‹áˆ©</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">ዋሌትዎን á‹«á‹›á‹áˆ©</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -423,6 +455,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">ዋሌትዎን ለáጠር ተሳስተዋሠ</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">አዲስ ዋሌት መáጠር አáˆá‰°á‰»áˆˆáˆá£ ሶáትዌሩ የተቀናበረዠያለ ስኩላይት ድጋá áŠá‹ (ለገላጭ ዋሌቶች ያስáˆáˆáŒ‹áˆ)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">ስህተትᥠ%1</translation>
</message>
@@ -485,12 +525,51 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>OpenWalletActivity</name>
+ <name>MigrateWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">መደበኛ ዋሌት</translation>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">ዋሌት á‹«á‹›á‹áˆ©</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">ዋሌትን ማዛወር ይህንን ዋሌት አንድ ወይሠከዚያ በላይ ወደሆአገላጭ ዋሌቶች ይቀይረዋáˆá¢áŠ á‹²áˆµ ዋሌት ማዘጋጀት ያስáˆáˆáŒ‹áˆ á¢á‹­áˆ… ዋሌት áˆáŠ•áˆ á‹“á‹­áŠá‰µ የመመáˆáŠ¨á‰µ ብቻ ስክሪá•á‰¶á‰½áŠ• የያዘ ከሆáŠá£áŠ¥áŠá‹šá‹«áŠ• የመመáˆáŠ¨á‰µ ብቻ ስክሪá•á‰¶á‰½áŠ• የያዘ አዲስ ዋሌት á‹­áˆáŒ áˆ«áˆá¢á‹­áˆ… ዋሌት ሊáˆá‰± የሚችሉ áŠáŒˆáˆ­ áŒáŠ• የመመáˆáŠ¨á‰µ ብቻ á‹«áˆáˆ†áŠ‘ ስክሪá•á‰¶á‰½áŠ• የያዘ ከሆአᣠእáŠá‹šáˆ…ን የያዘ አዲስ እና áˆá‹© የሆአዋሌት á‹­áˆáŒ áˆ«áˆ á¢á‹¨áˆ›á‹›á‹ˆáˆ­ ሂደቱ ማዘዋወር ከመáˆáŒ¸áˆ™ በáŠá‰µ የáŠá‹šáˆ…ን ዋሌቶች መጠባበቂያ ቅጂ á‹­á‹­á‹›áˆá¢á‹­áˆ… መጠባበቂያ ቅጂ 1-2 legacy.bak ተብሎ ተሰይሞ በዋሌቱ ማá‹áŒ« á‹áˆµáŒ¥ ይገኛáˆá¢á‹¨á‰°áˆ³áˆ³á‰° á‹á‹á‹áˆ­ በሚከሰትበት ጊዜየመጠባበቂያ ቅጂዠበ ዋሌት መመለሻ መተáŒá‰ áˆªá‹« á‹áˆµáŒ¥ ይከማቻáˆá¢</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">ዋሌትዎን á‹«á‹›á‹áˆ©</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">ዋሌት ማዘዋወር &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">ዋሌት '%1' በትክክሠተዛá‹áˆ¯áˆ </translation>
</message>
<message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">የመመáˆáŠ¨á‰µ ብቻ ስክሪá•á‰¶á‰½'%1'.ወደ ተሰኘዠዋሌት ተዛá‹áˆ¨á‹‹áˆ </translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">ሊáˆá‰± የሚችሉ áŠáŒˆáˆ­ áŒáŠ• የማይታዩ ስክሪá•á‰¶á‰½ ወደ አዲስ ዋሌት ተዛá‹áˆ¨á‹‹áˆ '%1'á¢</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">á‹á‹á‹áˆ© አáˆá‰°áˆ³áŠ«áˆ </translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">á‹á‹á‹áˆ­ ተሳክቷሠ</translation>
+ </message>
+</context>
+<context>
+ <name>OpenWalletActivity</name>
+ <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">ዋሌት ክáˆá‰µ</translation>
@@ -506,6 +585,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">አዲሱን ዋሌትዎን ለመáጠር አንድ እርáˆáŒƒ ይቀርዎታáˆ</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">እባክዎ ስሠያስገቡ እና ከተáˆáˆˆáŒˆ ማንኛá‹áŠ•áˆ የላበአማራጮችን ያንá‰</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">ዋሌት ስáˆ</translation>
</message>
@@ -594,6 +681,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>OptionsDialog</name>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">በአጠቃላይ እይታ ትር á‹áˆµáŒ¥ ያለ áŠá‹°áˆ</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">ስህተት</translation>
</message>
@@ -606,6 +697,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">%1 ወደ %2 á‹­áˆáŠ«áˆ</translation>
+ </message>
+ </context>
+<context>
<name>PeerTableModel</name>
<message>
<source>Address</source>
@@ -614,6 +712,56 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">የአካባቢ አድራሻዎች</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">የእርስዎ Bitcoin ኖድ ከሌሎች ኖዶች ጋር ለመገናኘት በአáˆáŠ‘ ጊዜ እየተጠቀመበት ያለዠየአá‹á‰³áˆ¨ መረብ አድራሻá¢</translation>
+ </message>
+ <message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">የአቻዎችን á‹áˆ­á‹áˆ­ ደብቅ</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">የማጓጓዣ ንብርብር ስሪትᡠ%1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">መጓጓዣ</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">የክáለ ጊዜ መለያ</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">የBIP324 ክáለ ጊዜ መለያ ሕብረá‰áˆáŠ በሄክስá¢</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">ማወቅᡠእኩያ v1 ወይሠv2 ሊሆን ይችላáˆá¢</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1á¡ á‹«áˆá‰°áˆ˜áˆ°áŒ áˆ¨á£ áŒáˆáŒ½ የጽሑá ትራንስá–ርት á•áˆ®á‰¶áŠ®áˆ</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2á¡ BIP324 የተመሰጠረ የትራንስá–ርት á•áˆ®á‰¶áŠ®áˆ</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">የኖድ መስኮት - [%1]</translation>
+ </message>
+ </context>
+<context>
<name>ReceiveRequestDialog</name>
<message>
<source>Amount:</source>
@@ -665,6 +813,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Copy fee</source>
<translation type="unfinished">ክáያዠቅዳ</translation>
</message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 ከዋሌት %2'</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -678,6 +830,17 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">ወደ እáŠáˆ­áˆ± የተላኩ ቢትኮይን መቀበሠእንደሚችሉ ለማረጋገጥ ከርስዎ (P2PKH) አድራሻዎች ጋር መáˆá‹•áŠ­á‰¶á‰½áŠ•/ስáˆáˆáŠá‰¶á‰½áŠ• መáˆáˆ¨áˆ ይችላሉᢠየማስገር ጥቃቶች እርስዎን ማንáŠá‰µá‹ŽáŠ• በእáŠáˆ± ላይ እንዲáˆáˆ­áˆ™ ሊያታáˆáˆ‰á‹Žá‰µ ስለሚችሉ áŒáˆáŒ½ á‹«áˆáˆ†áŠ ወይሠበዘáˆá‰€á‹° ላለመáˆáˆ¨áˆ ይጠንቀá‰á¢ የተስማሙባቸá‹áŠ• ሙሉ á‹áˆ­á‹áˆ­ መáŒáˆˆáŒ«á‹Žá‰½ ብቻ á‹­áˆáˆ­áˆ™á¢</translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">የገባዠአድራሻ የቅርስ (P2PKH) á‰áˆáን አያመለክትáˆá¢ ለሴáŒá‹Šá‰µ እና ሌሎች P2PKH ላáˆáˆ†áŠ‘ የአድራሻ አይáŠá‰¶á‰½ የመáˆá‹•áŠ­á‰µ መáˆáˆ¨áˆ በዚህ የ%1 ስሪት á‹áˆµáŒ¥ አይደገááˆá¢ እባክዎ አድራሻá‹áŠ• ያረጋáŒáŒ¡ እና እንደገና ይሞክሩá¢</translation>
+ </message>
+ </context>
+<context>
<name>TransactionDesc</name>
<message>
<source>Date</source>
@@ -691,6 +854,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (ማረጋገጫዠአáˆá‰°áˆ¨áŒ‹áŒˆáŒ áˆ)</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">መጠን</translation>
</message>
@@ -748,10 +915,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>WalletModel</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">መደበኛ ዋሌት</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">ከክáá‹«-áŠáƒ PSBT ወደ ቅንጥብ ሰሌዳ ተቀድቷáˆá¢</translation>
</message>
-</context>
+ <message>
+ <source>Signer error</source>
+ <translation type="unfinished">የáˆáˆ«áˆš ስህተት</translation>
+ </message>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_ar.ts b/src/qt/locale/bitcoin_ar.ts
index e703352aa5..86fef05136 100644
--- a/src/qt/locale/bitcoin_ar.ts
+++ b/src/qt/locale/bitcoin_ar.ts
@@ -6,191 +6,13 @@
<translation type="unfinished">أدخل عنوانا أو مذكرة للبحث</translation>
</message>
<message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">صدّر البيانات ÙÙŠ التبويب الحالي الى ملÙ</translation>
- </message>
- <message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;تصدير</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">اختر العنوان الذي ترغب باستلام بتكوين اليه</translation>
+ <translation type="unfinished">و إستخرج</translation>
</message>
</context>
<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation type="unfinished">المذكرة</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">العنوان</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">( لا وجود لمذكرة)</translation>
- </message>
-</context>
-<context>
- <name>AskPassphraseDialog</name>
- <message>
- <source>Passphrase Dialog</source>
- <translation type="unfinished">‫حوار عبارة المرور‬</translation>
- </message>
- <message>
- <source>Enter passphrase</source>
- <translation type="unfinished">‫ادخل عبارة المرور‬</translation>
- </message>
- <message>
- <source>New passphrase</source>
- <translation type="unfinished">‫أنشئ عبارة مرور‬</translation>
- </message>
- <message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">‫أعد عبارة المرور‬</translation>
- </message>
- <message>
- <source>Show passphrase</source>
- <translation type="unfinished">‫عرض عبارة المرور‬</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation type="unfinished">تشÙير المحÙظة</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">‫هذه العملية تتطلب عبارة المرور Ù„ÙÙƒ تشÙير المحÙظة.‬</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation type="unfinished">Ùتح Ù‚ÙÙ„ المحÙظة</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation type="unfinished">‫تغيير عبارة المرور‬</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation type="unfinished">تأكيد تشÙير المحÙظة</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">تحذير: إذا قمت بتشÙير المحÙظة وأضعت الكلمة السرية؛ &lt;b&gt;ستÙقد كل البتكوين&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">هل أنت متأكد من رغبتك ÙÙŠ تشÙير المحÙظة؟</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation type="unfinished">المحÙظة مشÙرة</translation>
- </message>
- <message>
- <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">أدخل عبارة المرور للمحÙظة. &lt;br/&gt;الرجاء استخدام عبارة مرور تتكون من &lt;b&gt;عشر خانات عشوائية أو أكثر&lt;/b&gt;ØŒ أو &lt;b&gt;ثمان كلمات أو أكثر&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">أدخل ‫عبارة المرور‬ السابقة و‫عبارة المرور‬ الجديدة للمحÙظة</translation>
- </message>
- <message>
- <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">تذكر أن تشÙير محÙظتك قد لا يحميك بشكل كامل من البرمجيات الخبيثة التي تصيب جهازك.</translation>
- </message>
- <message>
- <source>Wallet to be encrypted</source>
- <translation type="unfinished">‫المحÙظة سيتم تشÙيرها‬</translation>
- </message>
- <message>
- <source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">سو٠تشÙر محÙظتك.</translation>
- </message>
- <message>
- <source>Your wallet is now encrypted. </source>
- <translation type="unfinished">محÙظتك الان مشÙرة.</translation>
- </message>
- <message>
- <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">مهم!!!: يجب استبدال أي نسخة احتياطية سابقة بمل٠المحÙظة المشÙر الجديد. لأسباب أمنية، لن تستطيع استخدام النسخ الاحتياطية السابقة الغير مشÙرة عندما تبدأ ÙÙŠ استخدام المحÙظة المشÙرة الجديدة.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation type="unfinished">Ùشل تشÙير المحÙظة</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">Ùشل تشÙير المحÙظة بسبب خطأ داخلي. لم يتم تشÙير محÙظتك.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation type="unfinished">عبارتي مرور غير متطابقتين.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation type="unfinished">Ùشل Ùتح المحÙظة</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">‫عبارة المرور التي تم إدخالها Ù„ÙÙƒ تشÙير المحÙظة غير صحيحة.‬</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">‫لقد تم تغيير عبارة المرور بنجاح.‬</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">‫تحذير: Ù…Ùتاح الحرو٠الكبيرة Ù…Ùعل!‬</translation>
- </message>
-</context>
-<context>
- <name>BanTableModel</name>
- <message>
- <source>IP/Netmask</source>
- <translation type="unfinished">‫بروتوكول الانترنت/قناع الشبكة‬</translation>
- </message>
- <message>
- <source>Banned Until</source>
- <translation type="unfinished">محظور حتى</translation>
- </message>
-</context>
-<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">مل٠الاعدادات %1 قد يكون تال٠او غير صالح</translation>
- </message>
- <message>
- <source>Runaway exception</source>
- <translation type="unfinished">‫‫Runaway exception‬</translation>
- </message>
- <message>
- <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">حدث خطأ Ùادح. لم يعد بإمكان %1 المتابعة بأمان وسيتم الإنهاء.</translation>
- </message>
- <message>
- <source>Internal error</source>
- <translation type="unfinished">خطأ داخلي</translation>
- </message>
- <message>
- <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <translation type="unfinished">حدث خطأ داخلي. سيحاول %1 المتابعة بأمان. هذا خطأ غير متوقع يمكن الإبلاغ عنه كما هو موضح أدناه.</translation>
- </message>
-</context>
-<context>
<name>QObject</name>
<message>
- <source>Do you want to reset settings to default values, or to abort without making changes?</source>
- <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">‫هل تريد اعادة ضبط الاعدادات للقيم الاÙتراضية؟ أو الالغاء دون اجراء تغييرات؟‬</translation>
- </message>
- <message>
- <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
- <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
- <translation type="unfinished">‫حدث خطأ Ùادح. تأكد أن أذونات مل٠الاعدادات تسمح بالكتابة، جرب الاستمرار بتÙعيل خيار -دون اعدادات.‬</translation>
- </message>
- <message>
<source>Error: %1</source>
<translation type="unfinished">خطأ: %1</translation>
</message>
@@ -199,10 +21,6 @@
<translation type="unfinished">‫%1 لم يغلق بامان بعد…‬</translation>
</message>
<message>
- <source>unknown</source>
- <translation type="unfinished">غير معروÙ</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">‫القيمة‬</translation>
</message>
@@ -363,6 +181,10 @@
<source>%1 GB</source>
<translation type="unfinished">%1 ‫جيجابايت‬</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">‫محÙظة اÙتراضية‬</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -448,10 +270,6 @@
<translation type="unfinished">&amp;استقبل</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">&amp; خيارات</translation>
- </message>
- <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp; تشÙير المحÙظة</translation>
</message>
@@ -564,7 +382,7 @@
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">خل٠%1</translation>
+ <translation type="unfinished">‫متأخر‬ %1</translation>
</message>
<message>
<source>Catching up…</source>
@@ -572,11 +390,11 @@
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">تم توليد الكتلة المستقبلة الأخيرة منذ %1.</translation>
+ <translation type="unfinished">‫آخر طابق مستلم تم بناءه قبل %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">المعاملات بعد ذلك لن تكون مريئة بعد.</translation>
+ <translation type="unfinished">‫المعاملات بعد هذه لن تكون ظاهرة Ùورا.‬</translation>
</message>
<message>
<source>Error</source>
@@ -592,35 +410,39 @@
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">محدث</translation>
+ <translation type="unfinished">‫حديث‬</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">تحميل معاملة بتكوين الموقعة جزئيًا</translation>
+ <translation type="unfinished">‫تحميل معاملة بتكوين موقعة جزئيًا (PSBT)‬</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">‫تحميل معاملة بتكوين موقعة جزئيا (‫PSBT) من &amp;الحاÙظة…‬</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">تحميل معاملة بتكوين الموقعة جزئيًا من الحاÙظة</translation>
+ <translation type="unfinished">‫تحميل معاملة بتكوين موقعة جزئيًا ‫(‫PSBT) من الحاÙظة‬</translation>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">ناÙذة Node </translation>
+ <translation type="unfinished">‫ناÙذة النود‬</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">اÙتح وحدة التحكم ÙÙŠ تصحيح أخطاء node والتشخيص</translation>
+ <translation type="unfinished">‫اÙتح وحدة التحكم ÙÙŠ تصحيح الأخطاء والتشخيص للنود‬</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;عناوين الإرسال</translation>
+ <translation type="unfinished">‫&amp;عناوين الإرسال‬</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;عناوين الإستقبال</translation>
+ <translation type="unfinished">‫&amp;عناوين الإستلام‬</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">اÙتح عملة بيتكوين: URI</translation>
+ <translation type="unfinished">‫اÙتح رابط بتكوين: URI‬</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -628,7 +450,7 @@
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">اÙتح المحÙظة</translation>
+ <translation type="unfinished">‫اÙتح محÙظة‬</translation>
</message>
<message>
<source>Close wallet</source>
@@ -646,7 +468,7 @@
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">إغلاق جميع المحاÙظ ...</translation>
+ <translation type="unfinished">‫إغلاق جميع المحاÙظ‬</translation>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
@@ -661,10 +483,6 @@
<translation type="unfinished">‫إخÙاء القيم ÙÙŠ علامة التبويب: نظرة عامة‬</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">‫محÙظة اÙتراضية‬</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">‫لا يوجد محÙظة متاحة‬</translation>
</message>
@@ -679,18 +497,13 @@
<translation type="unfinished">‫تحميل النسخة الاحتياطية لمحÙظة‬</translation>
</message>
<message>
- <source>Restore Wallet</source>
- <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">استعادة المحÙظة</translation>
- </message>
- <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">إسم المحÙظة</translation>
</message>
<message>
<source>&amp;Window</source>
- <translation type="unfinished">‫&amp;ناÙذة‬</translation>
+ <translation type="unfinished">&amp;ناÙذة</translation>
</message>
<message>
<source>Zoom</source>
@@ -753,108 +566,13 @@
<translation type="unfinished">خطأ: %1</translation>
</message>
<message>
- <source>Warning: %1</source>
- <translation type="unfinished">تحذير: %1</translation>
- </message>
- <message>
- <source>Date: %1
-</source>
- <translation type="unfinished">التاريخ %1
-</translation>
- </message>
- <message>
- <source>Amount: %1
-</source>
- <translation type="unfinished">القيمة %1
-</translation>
- </message>
- <message>
- <source>Wallet: %1
-</source>
- <translation type="unfinished">المحÙظة: %1
-</translation>
- </message>
- <message>
- <source>Type: %1
-</source>
- <translation type="unfinished">النوع %1
-</translation>
- </message>
- <message>
- <source>Label: %1
-</source>
- <translation type="unfinished">‫المذكرة‬: %1
-</translation>
- </message>
- <message>
- <source>Address: %1
-</source>
- <translation type="unfinished">العنوان %1
-</translation>
- </message>
- <message>
- <source>Sent transaction</source>
- <translation type="unfinished">‫العمليات المرسلة‬</translation>
- </message>
- <message>
- <source>Incoming transaction</source>
- <translation type="unfinished">‫العمليات الواردة‬</translation>
- </message>
- <message>
- <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">توليد المÙاتيح الهرمية الحتمية HD &lt;b&gt;Ù…Ùعل&lt;/b&gt;</translation>
- </message>
- <message>
- <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">توليد المÙاتيح الهرمية الحتمية HD &lt;b&gt;معطل&lt;/b&gt;</translation>
- </message>
- <message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
<translation type="unfinished">المÙتاح الخاص &lt;b&gt;معطل&lt;/b&gt;</translation>
</message>
- <message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">المحÙظة &lt;b&gt;مشÙرة&lt;/b&gt; Ùˆ &lt;b&gt;Ù…Ùتوحة&lt;/b&gt; حاليا</translation>
- </message>
- <message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">المحÙظة &lt;b&gt;مشÙرة&lt;/b&gt; Ùˆ &lt;b&gt;مقÙلة&lt;/b&gt; حاليا</translation>
- </message>
- <message>
- <source>Original message:</source>
- <translation type="unfinished">الرسالة الأصلية:</translation>
- </message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- <message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">‫وحدة عرض القيمة. انقر لتغيير وحدة العرض.‬</translation>
- </message>
-</context>
+ </context>
<context>
<name>CoinControlDialog</name>
<message>
- <source>Coin Selection</source>
- <translation type="unfinished">اختيار وحدات البتكوين</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">الكمية:</translation>
- </message>
- <message>
- <source>Bytes:</source>
- <translation type="unfinished">بايت:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">القيمة:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">الرسوم:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">بعد الرسوم:</translation>
</message>
@@ -952,19 +670,19 @@
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished">‫يمكن يزيد أو ينقص %1 ساتوشي لكل مدخل.‬</translation>
+ <translation type="unfinished">يمكن أن يختل٠+/- %1 من ساتوشي(s) لكل إدخال.</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ <translation type="unfinished">(بدون وسم)</translation>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">تغيير من %1 (%2)</translation>
+ <translation type="unfinished">تغير من %1 (%2)</translation>
</message>
<message>
<source>(change)</source>
- <translation type="unfinished">‫(غيّر)‬</translation>
+ <translation type="unfinished">(تغير)</translation>
</message>
</context>
<context>
@@ -977,11 +695,11 @@
<message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
- <translation type="unfinished">جار انشاء المحÙظة &lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">جاري انشاء المحÙظة &lt;b&gt;%1&lt;/b&gt;... </translation>
</message>
<message>
<source>Create wallet failed</source>
- <translation type="unfinished">‫تعذر إنشاء المحÙظة‬</translation>
+ <translation type="unfinished">Ùشل إنشاء المحÙظة</translation>
</message>
<message>
<source>Create wallet warning</source>
@@ -991,227 +709,16 @@
<source>Can't list signers</source>
<translation type="unfinished">لا يمكن سرد الموقعين</translation>
</message>
- <message>
- <source>Too many external signers found</source>
- <translation type="unfinished">‫تم العثور على موقّعين خارجيين ÙƒÙثر (Too Many)‬</translation>
- </message>
-</context>
-<context>
- <name>OpenWalletActivity</name>
- <message>
- <source>Open wallet failed</source>
- <translation type="unfinished">Ùشل Ùتح محÙظة</translation>
- </message>
- <message>
- <source>Open wallet warning</source>
- <translation type="unfinished">تحذير محÙظة Ù…Ùتوحة</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">‫محÙظة اÙتراضية‬</translation>
- </message>
- <message>
- <source>Open Wallet</source>
- <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">اÙتح المحÙظة</translation>
- </message>
- <message>
- <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">جاري Ùتح المحÙظة&lt;b&gt;%1&lt;/b&gt;...</translation>
- </message>
-</context>
-<context>
- <name>RestoreWalletActivity</name>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">استعادة المحÙظة</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">استعادة المحÙظة &lt;b&gt;%1&lt;/b&gt;...</translation>
- </message>
- <message>
- <source>Restore wallet failed</source>
- <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">‫تعذر استعادة المحÙظة‬</translation>
- </message>
- <message>
- <source>Restore wallet warning</source>
- <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">‫تحذير استعادة المحÙظة‬</translation>
- </message>
- <message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">‫رسالة استعادة محÙظة‬</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletController</name>
<message>
- <source>Close wallet</source>
- <translation type="unfinished">اغلق المحÙظة</translation>
- </message>
- <message>
- <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <translation type="unfinished">اغلاق المحÙظة Ù„Ùترة طويلة قد يؤدي الى الاضطرار الى اعادة مزامنة السلسلة بأكملها اذا تم تمكين التلقيم.</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">إغلاق جميع المحاÙظ ...</translation>
- </message>
- <message>
- <source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">هل أنت متأكد من رغبتك ÙÙŠ اغلاق جميع المحاÙظ؟</translation>
- </message>
-</context>
-<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>Create Wallet</source>
- <translation type="unfinished">إنشاء محÙظة</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <translation type="unfinished">إسم المحÙظة</translation>
- </message>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">محÙظة</translation>
- </message>
- <message>
- <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">Ø´Ùر المحÙظة. المحÙظة سيتم تشÙيرها بإستخدام كلمة مرور من إختيارك.</translation>
- </message>
- <message>
- <source>Encrypt Wallet</source>
- <translation type="unfinished">تشÙير محÙظة</translation>
- </message>
- <message>
- <source>Advanced Options</source>
- <translation type="unfinished">خيارات متقدمة</translation>
- </message>
- <message>
- <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">تعطيل المÙاتيح الخاصة لهذه المحÙظة. لن تحتوي المحاÙظ ذات المÙاتيح الخاصة المعطلة على Ù…Ùاتيح خاصة ولا يمكن أن تحتوي على Ù…Ùتاح HD أو Ù…Ùاتيح خاصة مستوردة. هذا مثالي لمحاÙظ مشاهدة Ùقط Ùقط.</translation>
- </message>
- <message>
- <source>Disable Private Keys</source>
- <translation type="unfinished">إيقا٠المÙاتيح الخاصة</translation>
- </message>
- <message>
- <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">اصنع محÙظة Ùارغة. لا تحتوي المحاÙظ الÙارغة ÙÙŠ البداية على Ù…Ùاتيح خاصة أو نصوص. يمكن استيراد المÙاتيح والعناوين الخاصة، أو يمكن تعيين مصدر HD ÙÙŠ وقت لاحق.</translation>
- </message>
- <message>
- <source>Make Blank Wallet</source>
- <translation type="unfinished">أنشئ محÙظة Ùارغة</translation>
- </message>
- <message>
- <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
- <translation type="unfinished">استخدم جهاز توقيع خارجي مثل محÙظة الأجهزة. قم بتكوين البرنامج النصي للموقÙّع الخارجي ÙÙŠ تÙضيلات المحÙظة أولاً.</translation>
- </message>
- <message>
- <source>External signer</source>
- <translation type="unfinished">الموقّع الخارجي</translation>
- </message>
- <message>
- <source>Create</source>
- <translation type="unfinished">إنشاء</translation>
- </message>
- <message>
- <source>Compiled without external signing support (required for external signing)</source>
- <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">مجمعة بدون دعم توقيع خارجي (مطلوب للتوقيع الخارجي)</translation>
+ <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">هل أنت متأكد من رغبتك ÙÙŠ إغلاق المحÙظة &lt;i&gt;%1&lt;/i&gt;ØŸ </translation>
</message>
-</context>
-<context>
- <name>EditAddressDialog</name>
- <message>
- <source>Edit Address</source>
- <translation type="unfinished">تعديل العنوان</translation>
- </message>
- <message>
- <source>&amp;Label</source>
- <translation type="unfinished">&amp;وصÙ</translation>
- </message>
- <message>
- <source>The label associated with this address list entry</source>
- <translation type="unfinished">الملصق المرتبط بقائمة العناوين المدخلة</translation>
- </message>
- <message>
- <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">العنوان المرتبط بقائمة العناوين المدخلة. Ùˆ التي يمكن تعديلها Ùقط بواسطة ارسال العناوين</translation>
- </message>
- <message>
- <source>&amp;Address</source>
- <translation type="unfinished">&amp;العنوان</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">عنوان إرسال جديد</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation type="unfinished">تعديل عنوان الأستلام</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation type="unfinished">تعديل عنوان الارسال</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">العنوان المدخل "%1" ليس عنوان بيت كوين صحيح.</translation>
- </message>
- <message>
- <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">العنوان "%1" موجود بالÙعل كعنوان إستقبال تحت مسمى "%2" ولذلك لا يمكن إضاÙته كعنوان إرسال.</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book with label "%2".</source>
- <translation type="unfinished">العنوان المدخل "%1" موجود بالÙعل ÙÙŠ سجل العناوين تحت مسمى " "%2".</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished"> يمكن Ùتح المحÙظة.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation type="unfinished">Ùشل توليد Ù…Ùتاح جديد.</translation>
- </message>
-</context>
-<context>
- <name>FreespaceChecker</name>
- <message>
- <source>A new data directory will be created.</source>
- <translation type="unfinished">سيتم انشاء دليل بيانات جديد.</translation>
- </message>
- <message>
- <source>name</source>
- <translation type="unfinished">الإسم</translation>
- </message>
- <message>
- <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation type="unfinished">الدليل موجوج بالÙعل. أض٠%1 اذا نويت إنشاء دليل جديد هنا.</translation>
- </message>
- <message>
- <source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">المسار موجود بالÙعل، وهو ليس دليلاً.</translation>
- </message>
- <message>
- <source>Cannot create data directory here.</source>
- <translation type="unfinished">لا يمكن انشاء دليل بيانات هنا .</translation>
- </message>
-</context>
+ </context>
<context>
<name>Intro</name>
- <message>
- <source>Bitcoin</source>
- <translation type="unfinished">بتكوين</translation>
- </message>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
@@ -1220,7 +727,7 @@
<numerusform>%n GB of space available</numerusform>
<numerusform>%n GB of space available</numerusform>
<numerusform>%n GB of space available</numerusform>
- <numerusform>‫‫%n جيجابايت من المساحة متوÙرة</numerusform>
+ <numerusform>%n GB of space available</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1231,7 +738,7 @@
<numerusform>(of %n GB needed)</numerusform>
<numerusform>(of %n GB needed)</numerusform>
<numerusform>(of %n GB needed)</numerusform>
- <numerusform>‫(مطلوب %n جيجابايت)‬</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1242,17 +749,9 @@
<numerusform>(%n GB needed for full chain)</numerusform>
<numerusform>(%n GB needed for full chain)</numerusform>
<numerusform>(%n GB needed for full chain)</numerusform>
- <numerusform>‫( مطلوب %n جيجابايت لكامل المتتالية)‬</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
</translation>
</message>
- <message>
- <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">سيتم تخزين %1 جيجابايت على الأقل من البيانات ÙÙŠ هذا الدليل، وستنمو مع الوقت.</translation>
- </message>
- <message>
- <source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">سيتم تخزين %1 جيجابايت تقريباً من البيانات ÙÙŠ هذا الدليل.</translation>
- </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
@@ -1265,211 +764,10 @@
<numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
</translation>
</message>
- <message>
- <source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">سيقوم %1 بتنزيل نسخة من سلسلة كتل بتكوين وتخزينها.</translation>
- </message>
- <message>
- <source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished">سو٠يتم تخزين المحÙظة ÙÙŠ هذا الدليل.</translation>
- </message>
- <message>
- <source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">خطأ: لا يمكن تكوين دليل بيانات مخصص ل %1</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">خطأ</translation>
- </message>
- <message>
- <source>Welcome</source>
- <translation type="unfinished">أهلا</translation>
- </message>
- <message>
- <source>Welcome to %1.</source>
- <translation type="unfinished"> اهلا بكم ÙÙŠ %1</translation>
- </message>
- <message>
- <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">بما انه هذه اول مرة لانطلاق هذا البرنامج, Ùيمكنك ان تختار اين سيخزن %1 بياناته</translation>
- </message>
- <message>
- <source>Limit block chain storage to</source>
- <translation type="unfinished">تقييد تخزين سلسلة الكتل إلى</translation>
- </message>
- <message>
- <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">تتطلب العودة إلى هذا الإعداد إعادة تنزيل سلسلة الكتل بالكامل. من الأسرع تنزيل السلسلة الكاملة أولاً وتقليمها لاحقًا. تعطيل بعض الميزات المتقدمة.</translation>
- </message>
- <message>
- <source> GB</source>
- <translation type="unfinished">غيغابايت</translation>
- </message>
- <message>
- <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">تÙعد هذه المزامنة الأولية أمرًا شاقًا للغاية، وقد تعرض جهاز الكمبيوتر الخاص بك للمشاكل الذي لم يلاحظها أحد سابقًا. ÙÙŠ كل مرة تقوم Ùيها بتشغيل %1ØŒ سيتابع التحميل من حيث تم التوقÙ.</translation>
- </message>
- <message>
- <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">‫عندما تنقر مواÙÙ‚. %1 سنبدأ التحميل ومعالجة كامل %4 الطوابق المتتالية (%2 GB) بدأً من أوائل العمليات ÙÙŠ %3 عندما %4 تم الاطلاق لأول مرة.‬</translation>
- </message>
- <message>
- <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">إذا كنت قد اخترت تقييد تخزين سلسلة الكتل (التجريد)ØŒ Ùيجب تحميل البيانات القديمة ومعالجتها، ولكن سيتم حذÙها بعد ذلك للحÙاظ على انخÙاض استخدام القرص.</translation>
- </message>
- <message>
- <source>Use the default data directory</source>
- <translation type="unfinished">استخدام دليل البانات الاÙتراضي</translation>
- </message>
- <message>
- <source>Use a custom data directory:</source>
- <translation type="unfinished">استخدام دليل بيانات مخصص:</translation>
- </message>
-</context>
-<context>
- <name>HelpMessageDialog</name>
- <message>
- <source>version</source>
- <translation type="unfinished">النسخة</translation>
- </message>
- <message>
- <source>About %1</source>
- <translation type="unfinished">حوالي %1</translation>
- </message>
- <message>
- <source>Command-line options</source>
- <translation type="unfinished">خيارات سطر الأوامر</translation>
- </message>
-</context>
-<context>
- <name>ShutdownWindow</name>
- <message>
- <source>%1 is shutting down…</source>
- <translation type="unfinished">%1 يتم الإغلاق ...</translation>
- </message>
- <message>
- <source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">لا توق٠عمل الكمبيوتر حتى تختÙÙŠ هذه الناÙذة</translation>
- </message>
-</context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">نمودج</translation>
- </message>
- <message>
- <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">قد لا تكون المعاملات الأخيرة مرئية بعد، وبالتالي قد يكون رصيد محÙظتك غير صحيح. ستكون هذه المعلومات صحيحة بمجرد الانتهاء من محÙظتك مع شبكة البيتكوين، كما هو Ù…Ùصل أدناه.</translation>
- </message>
- <message>
- <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">لن تقبل الشبكة محاولة إنÙاق البتكوين المتأثرة بالمعاملات التي لم يتم عرضها بعد.</translation>
- </message>
- <message>
- <source>Number of blocks left</source>
- <translation type="unfinished">عدد الكتل الÙاضلة</translation>
- </message>
- <message>
- <source>Unknown…</source>
- <translation type="unfinished">غير معروÙ</translation>
- </message>
- <message>
- <source>calculating…</source>
- <translation type="unfinished">جاري الحساب</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">اخر وقت الكتلة</translation>
- </message>
- <message>
- <source>Progress</source>
- <translation type="unfinished">تقدم</translation>
- </message>
- <message>
- <source>Progress increase per hour</source>
- <translation type="unfinished">تقدم يزيد بلساعة</translation>
- </message>
- <message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">الوقت المتبقي للمزامنة</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">إخÙاء</translation>
- </message>
- <message>
- <source>Esc</source>
- <translation type="unfinished">خروج</translation>
- </message>
- <message>
- <source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">مجهول. مزامنة الرؤوس (%1،%2٪) ...</translation>
- </message>
- <message>
- <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">‫غير معروÙ. ما قبل مزامنة الرؤوس (%1, %2%)…‬</translation>
- </message>
-</context>
-<context>
- <name>OpenURIDialog</name>
- <message>
- <source>Open bitcoin URI</source>
- <translation type="unfinished">‫اÙتح رابط بتكوين (URI)‬</translation>
- </message>
- <message>
- <source>URI:</source>
- <translation type="unfinished">العنوان:</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">‫ألصق العنوان من الحاÙظة‬</translation>
- </message>
-</context>
+ </context>
<context>
<name>OptionsDialog</name>
<message>
- <source>Options</source>
- <translation type="unfinished">خيارات</translation>
- </message>
- <message>
- <source>&amp;Main</source>
- <translation type="unfinished">‫&amp;الرئيسية‬</translation>
- </message>
- <message>
- <source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">‫تشغيل البرنامج تلقائيا %1 بعد تسجيل الدخول إلى النظام.‬</translation>
- </message>
- <message>
- <source>&amp;Start %1 on system login</source>
- <translation type="unfinished">تشغيل %1 عند الدخول إلى النظام</translation>
- </message>
- <message>
- <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">‫يؤدي تمكين خيار اختصار النود إلى تقليل مساحة التخزين المطلوبة بشكل كبير. يتم المصادقة على جميع الطوابق رغم تÙعيل هذا الخيار،. إلغاء هذا الاعداد يتطلب اعادة تحميل الطوابق المتتالية من جديد بشكل كامل.‬</translation>
- </message>
- <message>
- <source>Size of &amp;database cache</source>
- <translation type="unfinished">‫حجم ذاكرة التخزين المؤقت ل&amp;قاعدة البيانات‬</translation>
- </message>
- <message>
- <source>Number of script &amp;verification threads</source>
- <translation type="unfinished">عدد مؤشرات التحقق من البرنامج النصي</translation>
- </message>
- <message>
- <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
- <translation type="unfinished">‫عنوان IP للوكيل (مثل IPv4: 127.0.0.1 / IPv6: ::1)‬</translation>
- </message>
- <message>
- <source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
- <translation type="unfinished">إظهار ما إذا كان وكيل SOCKS5 الاÙتراضي الموÙر تم استخدامه للوصول إلى الأقران عبر نوع الشبكة هذا.</translation>
- </message>
- <message>
- <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
- <translation type="unfinished">‫التصغير بدلاً من الخروج من التطبيق عند إغلاق الناÙذة. عند تÙعيل هذا الخيار، سيتم إغلاق التطبيق Ùقط بعد النقر على خروج من القائمة المنسدلة.‬</translation>
- </message>
- <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">‫التÙضيلات المعينة عن طريق سطر الأوامر لها أولوية أكبر وتتجاوز التÙضيلات المختارة هنا:‬</translation>
</message>
@@ -2071,867 +1369,47 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;احÙظ الصورة...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;نسخ الصورة</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">‫العنوان الناتج طويل جدًا، حاول أن تقلص النص للمذكرة / الرسالة.‬</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">‫خطأ ÙÙŠ ترميز العنوان إلى رمز الاستجابة السريع QR.‬</translation>
- </message>
- <message>
- <source>QR code support not available.</source>
- <translation type="unfinished">‫دعم رمز الاستجابة السريع QR غير متوÙر.‬</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">Ø­Ùظ رمز الاستجابة السريع QR</translation>
- </message>
- <message>
- <source>PNG Image</source>
- <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
- <translation type="unfinished">صورة PNG</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>N/A</source>
- <translation type="unfinished">غير معروÙ</translation>
- </message>
- <message>
- <source>Client version</source>
- <translation type="unfinished">‫اصدار العميل‬</translation>
- </message>
- <message>
- <source>&amp;Information</source>
- <translation type="unfinished">‫&amp;المعلومات‬</translation>
- </message>
- <message>
- <source>General</source>
- <translation type="unfinished">عام</translation>
- </message>
- <message>
- <source>Datadir</source>
- <translation type="unfinished">‫مجلد البيانات‬</translation>
- </message>
- <message>
- <source>To specify a non-default location of the data directory use the '%1' option.</source>
- <translation type="unfinished">‫لتحديد مكان غير-Ø¥Ùتراضي لمجلد البيانات استخدم خيار الـ'%1'.‬</translation>
- </message>
- <message>
- <source>Blocksdir</source>
- <translation type="unfinished">‫مجلد الطوابق‬</translation>
- </message>
- <message>
- <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">‫لتحديد مكان غير-Ø¥Ùتراضي لمجلد البيانات استخدم خيار الـ'"%1'.‬</translation>
- </message>
- <message>
- <source>Startup time</source>
- <translation type="unfinished">وقت البدء</translation>
- </message>
- <message>
- <source>Network</source>
- <translation type="unfinished">الشبكة</translation>
- </message>
- <message>
- <source>Name</source>
- <translation type="unfinished">الاسم</translation>
- </message>
- <message>
- <source>Number of connections</source>
- <translation type="unfinished">عدد الاتصالات</translation>
- </message>
- <message>
- <source>Block chain</source>
- <translation type="unfinished">سلسلة الكتل</translation>
- </message>
- <message>
- <source>Memory Pool</source>
- <translation type="unfinished">تجمع الذاكرة</translation>
- </message>
- <message>
- <source>Current number of transactions</source>
- <translation type="unfinished">عدد العمليات الحالي</translation>
- </message>
- <message>
- <source>Memory usage</source>
- <translation type="unfinished">استخدام الذاكرة</translation>
- </message>
- <message>
- <source>Wallet: </source>
- <translation type="unfinished">محÙظة:</translation>
- </message>
- <message>
- <source>(none)</source>
- <translation type="unfinished">‫(لا شيء)‬</translation>
- </message>
- <message>
- <source>&amp;Reset</source>
- <translation type="unfinished">‫&amp;إعادة تعيين‬</translation>
- </message>
- <message>
- <source>Received</source>
- <translation type="unfinished">‫مستلم‬</translation>
- </message>
- <message>
<source>Sent</source>
<translation type="unfinished">تم الإرسال</translation>
</message>
<message>
- <source>&amp;Peers</source>
- <translation type="unfinished">‫&amp;أقران‬</translation>
- </message>
- <message>
- <source>Banned peers</source>
- <translation type="unfinished">‫الأقران المحظورون‬</translation>
- </message>
- <message>
- <source>Select a peer to view detailed information.</source>
- <translation type="unfinished">‫اختر قرينا لعرض معلومات Ù…Ùصلة.‬</translation>
- </message>
- <message>
- <source>Version</source>
- <translation type="unfinished">الإصدار</translation>
- </message>
- <message>
- <source>Starting Block</source>
- <translation type="unfinished">‫طابق البداية‬</translation>
- </message>
- <message>
- <source>Synced Headers</source>
- <translation type="unfinished">‫رؤوس مزامنة‬</translation>
- </message>
- <message>
- <source>Synced Blocks</source>
- <translation type="unfinished">‫طوابق مزامنة‬</translation>
- </message>
- <message>
- <source>Last Transaction</source>
- <translation type="unfinished">‫آخر عملية‬</translation>
- </message>
- <message>
- <source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">‫النظام التÙصيلي المستقل المستخدم لتنويع اختيار الأقران.‬</translation>
- </message>
- <message>
- <source>Mapped AS</source>
- <translation type="unfinished">‫‫Mapped AS‬</translation>
- </message>
- <message>
- <source>Whether we relay addresses to this peer.</source>
- <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">‫توصيل العناوين لهذا القرين أم لا.‬</translation>
- </message>
- <message>
- <source>Address Relay</source>
- <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">‫توصيل العنوان‬</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
- <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">‫مجموع العناوين المستلمة والمعالجة من هذا القرين (تستثنى العناوين المسقطة بسبب التقييد الحدي)‬</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
- <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">‫مجموع العناوين المستلمة والمسقطة من هذا القرين (غير معالجة) بسبب التقييد الحدي.‬</translation>
- </message>
- <message>
- <source>Addresses Processed</source>
- <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">‫العناوين المعالجة‬</translation>
- </message>
- <message>
- <source>Addresses Rate-Limited</source>
- <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">‫عناوين مقيدة حديا‬</translation>
- </message>
- <message>
- <source>User Agent</source>
- <translation type="unfinished">وكيل المستخدم</translation>
- </message>
- <message>
<source>Node window</source>
- <translation type="unfinished">ناÙذة Node </translation>
- </message>
- <message>
- <source>Current block height</source>
- <translation type="unfinished">‫ارتÙاع الطابق الحالي‬</translation>
- </message>
- <message>
- <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation type="unfinished">‫اÙتح %1 مل٠سجل المعالجة والتصحيح من مجلد البيانات الحالي. قد يستغرق عدة ثواني للسجلات الكبيرة.‬</translation>
- </message>
- <message>
- <source>Decrease font size</source>
- <translation type="unfinished">تصغير حجم الخط</translation>
- </message>
- <message>
- <source>Increase font size</source>
- <translation type="unfinished">تكبير حجم الخط</translation>
- </message>
- <message>
- <source>Permissions</source>
- <translation type="unfinished">اذونات</translation>
- </message>
- <message>
- <source>The direction and type of peer connection: %1</source>
- <translation type="unfinished">اتجاه ونوع اتصال الأقران : %1</translation>
- </message>
- <message>
- <source>Direction/Type</source>
- <translation type="unfinished">الاتجاه / النوع</translation>
- </message>
- <message>
- <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">‫بروتوكول الشبكة الذي يتصل به هذا القرين من خلال: IPv4 أو IPv6 أو Onion أو I2P أو CJDNS.‬</translation>
- </message>
- <message>
- <source>Services</source>
- <translation type="unfinished">خدمات</translation>
- </message>
- <message>
- <source>High Bandwidth</source>
- <translation type="unfinished">‫نطاق بيانات عالي‬</translation>
- </message>
- <message>
- <source>Connection Time</source>
- <translation type="unfinished">مدة الاتصال</translation>
- </message>
- <message>
- <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
- <translation type="unfinished">‫الوقت المنقضي منذ استلام طابق جديد مجتاز لاختبارات الصلاحية الأولية من هذا القرين.‬</translation>
- </message>
- <message>
- <source>Last Block</source>
- <translation type="unfinished">‫الطابق الأخير‬</translation>
- </message>
- <message>
- <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
- <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">‫الوقت المنقضي منذ استلام عملية مقبولة ÙÙŠ تجمع الذاكرة من هذا النظير.‬</translation>
- </message>
- <message>
- <source>Last Send</source>
- <translation type="unfinished">‫آخر ارسال‬</translation>
- </message>
- <message>
- <source>Last Receive</source>
- <translation type="unfinished">‫آخر إستلام‬</translation>
- </message>
- <message>
- <source>Ping Time</source>
- <translation type="unfinished">وقت الرنين</translation>
- </message>
- <message>
- <source>The duration of a currently outstanding ping.</source>
- <translation type="unfinished">مدة الرنين المعلقة حالياً.</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">انتظار الرنين</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">أقل رنين</translation>
- </message>
- <message>
- <source>Time Offset</source>
- <translation type="unfinished">إزاحة الوقت</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">اخر وقت الكتلة</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished">‫&amp;Ùتح‬</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">‫&amp;سطر الأوامر‬</translation>
- </message>
- <message>
- <source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;حركة الشبكة</translation>
- </message>
- <message>
- <source>Totals</source>
- <translation type="unfinished">المجاميع</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">‫مل٠سجل تصحيح الأخطاء‬</translation>
- </message>
- <message>
- <source>Clear console</source>
- <translation type="unfinished">‫مسح الأوامر‬</translation>
- </message>
- <message>
- <source>In:</source>
- <translation type="unfinished">داخل:</translation>
- </message>
- <message>
- <source>Out:</source>
- <translation type="unfinished">خارج:</translation>
- </message>
- <message>
- <source>Inbound: initiated by peer</source>
- <extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">‫الواردة: بدأها القرين‬</translation>
- </message>
- <message>
- <source>Outbound Full Relay: default</source>
- <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">‫الموصل الكامل الصادر: اÙتراضي‬</translation>
- </message>
- <message>
- <source>Outbound Block Relay: does not relay transactions or addresses</source>
- <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">‫موصل الطابق الصادر: لا يقوم بتوصيل العمليات أو العناوين‬</translation>
- </message>
- <message>
- <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
- <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">‫دليل الصادر: مضا٠باستخدام نداء الاجراء البعيد RPC %1 أو %2/%3 خيارات الاعداد‬</translation>
- </message>
- <message>
- <source>Outbound Feeler: short-lived, for testing addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">‫أداة التÙقد الصادر: قصير الأجل ØŒ لاختبار العناوين‬</translation>
- </message>
- <message>
- <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">إحضار العنوان الصادر: قصير الأجل ، لطلب العناوين</translation>
- </message>
- <message>
- <source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">‫اخترنا القرين لتوصيل نطاق البيانات العالي‬</translation>
- </message>
- <message>
- <source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">‫القرين اختارنا لتوصيل بيانات ذات نطاق عالي‬</translation>
- </message>
- <message>
- <source>no high bandwidth relay selected</source>
- <translation type="unfinished">‫لم يتم تحديد موصل للبيانات عالية النطاق‬</translation>
- </message>
- <message>
- <source>Ctrl++</source>
- <extracomment>Main shortcut to increase the RPC console font size.</extracomment>
- <translation type="unfinished">Ctrl ++</translation>
- </message>
- <message>
- <source>Ctrl+-</source>
- <extracomment>Main shortcut to decrease the RPC console font size.</extracomment>
- <translation type="unfinished">Ctrl + -</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <extracomment>Context menu action to copy the address of a peer.</extracomment>
- <translation type="unfinished">‫&amp;انسخ العنوان‬</translation>
- </message>
- <message>
- <source>&amp;Disconnect</source>
- <translation type="unfinished">&amp;قطع الاتصال</translation>
- </message>
- <message>
- <source>1 &amp;hour</source>
- <translation type="unfinished">1 &amp;ساعة</translation>
- </message>
- <message>
- <source>1 d&amp;ay</source>
- <translation type="unfinished">ي&amp;وم 1</translation>
- </message>
- <message>
- <source>1 &amp;week</source>
- <translation type="unfinished">1 &amp; اسبوع</translation>
- </message>
- <message>
- <source>1 &amp;year</source>
- <translation type="unfinished">1 &amp; سنة</translation>
- </message>
- <message>
- <source>&amp;Unban</source>
- <translation type="unfinished">&amp;رÙع الحظر</translation>
- </message>
- <message>
- <source>Network activity disabled</source>
- <translation type="unfinished">تم تعطيل نشاط الشبكة</translation>
- </message>
- <message>
- <source>Executing command without any wallet</source>
- <translation type="unfinished">‫تنÙيذ الأوامر بدون أي محÙظة‬</translation>
- </message>
- <message>
- <source>Executing command using "%1" wallet</source>
- <translation type="unfinished">‫تنÙيذ الأوامر باستخدام "%1" من المحÙظة‬</translation>
- </message>
- <message>
- <source>Executing…</source>
- <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
- <translation type="unfinished">جار التنÙيذ...</translation>
- </message>
- <message>
- <source>(peer: %1)</source>
- <translation type="unfinished">(قرين: %1)</translation>
- </message>
- <message>
- <source>via %1</source>
- <translation type="unfinished">خلال %1</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation type="unfinished">نعم</translation>
- </message>
- <message>
- <source>No</source>
- <translation type="unfinished">لا</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">الى</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">من</translation>
- </message>
- <message>
- <source>Ban for</source>
- <translation type="unfinished">حظر ل</translation>
- </message>
- <message>
- <source>Never</source>
- <translation type="unfinished">مطلقا</translation>
- </message>
- <message>
- <source>Unknown</source>
- <translation type="unfinished">غير معروÙ</translation>
- </message>
-</context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>&amp;Amount:</source>
- <translation type="unfinished">&amp;القيمة</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;مذكرة :</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">&amp;رسالة:</translation>
- </message>
- <message>
- <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">‫رسالة اختيارية لإرÙاقها بطلب الدÙع، والتي سيتم عرضها عند Ùتح الطلب. ملاحظة: لن يتم إرسال الرسالة مع العملية عبر شبكة البتكوين.‬</translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address.</source>
- <translation type="unfinished">تسمية اختيارية لربطها بعنوان المستلم الجديد.</translation>
- </message>
- <message>
- <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">استخدم هذا النموذج لطلب الدÙعات. جميع الحقول &lt;b&gt;اختيارية&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
- <translation type="unfinished">مبلغ اختياري للطلب. اترك هذا Ùارغًا أو صÙراً لعدم طلب مبلغ محدد.</translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">‫مذكرة اختيارية للربط مع عنوان الاستلام (يستعمل من قبلك لتعري٠Ùاتورة). هو أيضا مرÙÙ‚ بطلب الدÙع.‬</translation>
- </message>
- <message>
- <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
- <translation type="unfinished">رسالة اختيارية مرÙقة بطلب الدÙع ومن الممكن أن تعرض للمرسل.</translation>
- </message>
- <message>
- <source>&amp;Create new receiving address</source>
- <translation type="unfinished">&amp;إنشاء عناوين استلام جديدة</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">‫مسح كل الحقول من النموذج.‬</translation>
- </message>
- <message>
- <source>Clear</source>
- <translation type="unfinished">مسح</translation>
- </message>
- <message>
- <source>Requested payments history</source>
- <translation type="unfinished">سجل طلبات الدÙع</translation>
- </message>
- <message>
- <source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">إظهار الطلب المحدد (يقوم بنÙس نتيجة النقر المزدوج على أي إدخال)</translation>
- </message>
- <message>
- <source>Show</source>
- <translation type="unfinished">عرض</translation>
- </message>
- <message>
- <source>Remove the selected entries from the list</source>
- <translation type="unfinished">قم بإزالة الإدخالات المحددة من القائمة</translation>
- </message>
- <message>
- <source>Remove</source>
- <translation type="unfinished">ازل</translation>
- </message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">‫نسخ &amp;الرابط (URI)‬</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">‫&amp;انسخ العنوان‬</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">‫نسخ &amp;مذكرة‬</translation>
- </message>
- <message>
- <source>Copy &amp;message</source>
- <translation type="unfinished">‫نسخ &amp;رسالة‬</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">‫نسخ &amp;القيمة‬</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished"> يمكن Ùتح المحÙظة.</translation>
+ <translation type="unfinished">‫ناÙذة النود‬</translation>
</message>
- <message>
- <source>Could not generate new %1 address</source>
- <translation type="unfinished">تعذر توليد عنوان %1 جديد.</translation>
- </message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Request payment to …</source>
- <translation type="unfinished"> طلب الدÙع لـ ...</translation>
- </message>
- <message>
- <source>Address:</source>
- <translation type="unfinished">العنوان:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">القيمة:</translation>
- </message>
- <message>
- <source>Label:</source>
- <translation type="unfinished">مذكرة:</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">‫رسالة:‬</translation>
- </message>
- <message>
<source>Wallet:</source>
<translation type="unfinished">المحÙظة:</translation>
</message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">‫نسخ &amp;الرابط (URI)‬</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">نسخ &amp;العنوان</translation>
- </message>
- <message>
- <source>&amp;Verify</source>
- <translation type="unfinished">&amp;تحقق</translation>
- </message>
- <message>
- <source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">تحقق من العنوان على شاشة المحÙظة الخارجية</translation>
- </message>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;احÙظ الصورة...</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation type="unfinished">معلومات الدÙع</translation>
- </message>
- <message>
- <source>Request payment to %1</source>
- <translation type="unfinished">طلب الدÙعة إلى %1</translation>
- </message>
-</context>
+ </context>
<context>
<name>RecentRequestsTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">التاريخ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">المذكرة</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">رسالة </translation>
- </message>
- <message>
<source>(no label)</source>
- <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ <translation type="unfinished">(بدون وسم)</translation>
</message>
- <message>
- <source>(no message)</source>
- <translation type="unfinished">( لا رسائل )</translation>
- </message>
- <message>
- <source>(no amount requested)</source>
- <translation type="unfinished">(لا يوجد قيمة مطلوبة)</translation>
- </message>
- <message>
- <source>Requested</source>
- <translation type="unfinished">تم الطلب</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation type="unfinished">‫إرسال وحدات البتكوين‬</translation>
- </message>
- <message>
- <source>Coin Control Features</source>
- <translation type="unfinished">‫ميزات التحكم بوحدات البتكوين‬</translation>
- </message>
- <message>
- <source>automatically selected</source>
- <translation type="unfinished">اختيار تلقائيا</translation>
- </message>
- <message>
- <source>Insufficient funds!</source>
- <translation type="unfinished">الرصيد غير كاÙÙŠ!</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">الكمية:</translation>
- </message>
- <message>
- <source>Bytes:</source>
- <translation type="unfinished">بايت:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">القيمة:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">الرسوم:</translation>
- </message>
- <message>
- <source>After Fee:</source>
- <translation type="unfinished">بعد الرسوم:</translation>
- </message>
- <message>
- <source>Change:</source>
- <translation type="unfinished">تعديل:</translation>
- </message>
- <message>
- <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
- <translation type="unfinished">‫إذا تم تنشيط هذا، ولكن عنوان الÙكة Ùارغ أو غير صالح، Ùسيتم إرسال الÙكة إلى عنوان مولّد حديثًا.‬</translation>
- </message>
- <message>
- <source>Custom change address</source>
- <translation type="unfinished">تغيير عنوان الÙكة</translation>
- </message>
- <message>
- <source>Transaction Fee:</source>
- <translation type="unfinished">رسوم المعاملة:</translation>
- </message>
- <message>
- <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">‫يمكن أن يؤدي استخدام الرسوم الاحتياطية إلى إرسال معاملة تستغرق عدة ساعات أو أيام (أو أبدًا) للتأكيد. ضع ÙÙŠ اعتبارك اختيار الرسوم يدويًا أو انتظر حتى تتحقق من صحة المتتالية الكاملة.‬</translation>
- </message>
- <message>
- <source>Warning: Fee estimation is currently not possible.</source>
- <translation type="unfinished">تحذير: تقدير الرسوم غير ممكن ÙÙŠ الوقت الحالي.</translation>
- </message>
- <message>
- <source>per kilobyte</source>
- <translation type="unfinished">لكل كيلوبايت</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">إخÙاء</translation>
- </message>
- <message>
- <source>Recommended:</source>
- <translation type="unfinished">موصى به:</translation>
- </message>
- <message>
- <source>Custom:</source>
- <translation type="unfinished">تخصيص:</translation>
- </message>
- <message>
- <source>Send to multiple recipients at once</source>
- <translation type="unfinished">إرسال إلى عدة مستلمين ÙÙŠ وقت واحد</translation>
- </message>
- <message>
- <source>Add &amp;Recipient</source>
- <translation type="unfinished">أضاÙØ© &amp;مستلم</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">‫مسح كل الحقول من النموذج.‬</translation>
- </message>
- <message>
- <source>Inputs…</source>
- <translation type="unfinished">المدخلات...</translation>
- </message>
- <message>
- <source>Choose…</source>
- <translation type="unfinished">اختيار...</translation>
- </message>
- <message>
- <source>Hide transaction fee settings</source>
- <translation type="unfinished">اخÙاء اعدادات رسوم المعاملة</translation>
- </message>
- <message>
- <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
-
-Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">‫حدد الرسوم المخصصة لكل كيلوبايت (١٠٠٠ بايت) من حجم العملية الاÙتراضي.
-
-ملاحظة: بما أن الرسوم تحتسب لكل بايت، معدل الرسوم Ù„ “ ١٠٠ ساتوشي لكل كيلوبايت اÙتراضي†لعملية بحجم ٥٠٠ بايت اÙتراضي (نص٠كيلوبايت اÙتراضي) ستكون ٥٠ ساتوشي Ùقط.‬</translation>
- </message>
- <message>
- <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation type="unfinished">‫قد ÙŠÙرض المعدنون والأنواد الموصلة حدا أدنى للرسوم عندما يكون عدد العمليات قليل نسبة لسعة الطوابق. يمكنك دÙع الحد الأدنى ولكن كن على دراية بأن العملية قد لا تنÙØ° ÙÙŠ حالة أن الطلب على عمليات البتكوين Ùاق قدرة الشبكة على المعالجة.‬</translation>
- </message>
- <message>
- <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">‫الرسوم القليلة جدا قد تؤدي الى عملية لا تتأكد أبدا (اقرأ التلميح).‬</translation>
- </message>
- <message>
- <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">‫(الرسوم الذكية غير مهيأة بعد. عادة يتطلب عدة طوابق…)‬</translation>
- </message>
- <message>
- <source>Confirmation time target:</source>
- <translation type="unfinished">هد٠وقت التأكيد:</translation>
- </message>
- <message>
- <source>Enable Replace-By-Fee</source>
- <translation type="unfinished">تÙعيل الإستبدال بواسطة الرسوم</translation>
- </message>
- <message>
- <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">‫يمكنك زيادة رسوم المعاملة بعد إرسالها عند تÙعيل الاستبدال بواسطة الرسوم (BIP-125). نوصي بوضع رسوم أعلى اذا لم يتم التÙعيل لتÙادي مخاطر تأخير العملية.‬</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">مسح الكل</translation>
- </message>
- <message>
- <source>Balance:</source>
- <translation type="unfinished">الرصيد:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation type="unfinished">تأكيد الإرسال</translation>
- </message>
- <message>
- <source>S&amp;end</source>
- <translation type="unfinished">‫ا&amp;رسال‬</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">نسخ الكمية </translation>
</message>
<message>
- <source>Copy amount</source>
- <translation type="unfinished">‫نسخ القيمة‬</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation type="unfinished">نسخ الرسوم</translation>
- </message>
- <message>
<source>Copy after fee</source>
<translation type="unfinished">نسخ بعد الرسوم</translation>
</message>
<message>
- <source>Copy bytes</source>
- <translation type="unfinished">نسخ البايتات </translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">‫نسخ الÙكة‬</translation>
</message>
<message>
- <source>%1 (%2 blocks)</source>
- <translation type="unfinished">%1 (%2 طوابق)</translation>
- </message>
- <message>
- <source>Sign on device</source>
- <extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">‫جهاز التوقيع‬</translation>
- </message>
- <message>
- <source>Connect your hardware wallet first.</source>
- <translation type="unfinished">‫قم بتوصيل المحÙظة الخارجية أولا.‬</translation>
- </message>
- <message>
- <source>Set external signer script path in Options -&gt; Wallet</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">‫أعد المسار البرمجي للموقع الخارجي من خيارات -&gt; محÙظة‬</translation>
- </message>
- <message>
- <source>Cr&amp;eate Unsigned</source>
- <translation type="unfinished">‫إن&amp;شاء من غير توقيع‬</translation>
- </message>
- <message>
- <source>%1 to '%2'</source>
- <translation type="unfinished">%1 الى "%2"</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation type="unfinished">%1 الى %2</translation>
- </message>
- <message>
- <source>To review recipient list click "Show Details…"</source>
- <translation type="unfinished">‫لمراجعة قائمة المستلمين انقر على “عرض التÙاصيل…â€â€¬</translation>
- </message>
- <message>
- <source>Sign failed</source>
- <translation type="unfinished">‫Ùشل التوقيع‬</translation>
- </message>
- <message>
- <source>External signer not found</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">‫لم يتم العثور على موقّع خارجي‬</translation>
- </message>
- <message>
- <source>External signer failure</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">‫Ùشل الموقّع الخارجي‬</translation>
- </message>
- <message>
- <source>Save Transaction Data</source>
- <translation type="unfinished">Ø­Ùظ بيانات العملية</translation>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">‫أنشئ معاملة بتكوين موقعة جزئيا (PSBT) للاستعمال مع محÙظة %1 غير متصلة بالشبكة مثلا، أو محÙظة خارجية متواÙقة مع الـ(PSBT).‬</translation>
</message>
<message>
<source>Partially Signed Transaction (Binary)</source>
@@ -2939,90 +1417,9 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">معاملة موقعة جزئيًا (ثنائي)</translation>
</message>
<message>
- <source>PSBT saved</source>
- <extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">تم Ø­Ùظ PSBT</translation>
- </message>
- <message>
- <source>External balance:</source>
- <translation type="unfinished">رصيد خارجي </translation>
- </message>
- <message>
<source>or</source>
<translation type="unfinished">أو</translation>
</message>
- <message>
- <source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">‫يمكنك زيادة الرسوم لاحقًا (الاستبدال بواسطة الرسوم، BIP-125 Ù…Ùعل).‬</translation>
- </message>
- <message>
- <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
- <translation type="unfinished">‫رجاء، راجع معاملتك. هذا ينشئ معاملة بتكوين موقعة جزئيا (PSBT) ويمكنك Ø­Ùظها أو نسخها Ùˆ التوقيع مع محÙظة %1 غير متصلة بالشبكة، أو محÙظة خارجية متواÙقة مع الـPSBT.‬</translation>
- </message>
- <message>
- <source>Do you want to create this transaction?</source>
- <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
- <translation type="unfinished">‫هل تريد انشاء هذه المعاملة؟‬</translation>
- </message>
- <message>
- <source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">‫رجاء، راجع معاملتك.تستطيع انشاء وارسال هذه العملية أو انشاء معاملة بتكوين موقعة جزئيا (PSBT) ويمكنك Ø­Ùظها أو نسخها Ùˆ التوقيع مع محÙظة %1 غير متصلة بالشبكة، أو محÙظة خارجية متواÙقة مع الـPSBT.‬</translation>
- </message>
- <message>
- <source>Please, review your transaction.</source>
- <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">رجاء، راجع معاملتك.</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">رسوم العملية</translation>
- </message>
- <message>
- <source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">‫الاستبدال بواسطة الرسوم، BIP-125 غير Ù…Ùعلة.‬</translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">القيمة الإجمالية</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation type="unfinished">‫تأكيد ارسال وحدات البتكوين‬</translation>
- </message>
- <message>
- <source>Watch-only balance:</source>
- <translation type="unfinished">‫رصيد المراقبة:‬</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">‫عنوان المستلم غير صالح. يرجى مراجعة العنوان.‬</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">‫القيمة المدÙوعة يجب ان تكون اكبر من 0.‬</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation type="unfinished">القيمة تتجاوز رصيدك.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">المجموع يتجاوز رصيدك عندما يتم اضاÙØ© %1 رسوم العملية</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">‫تم العثور على عنوان مكرر: من الأÙضل استخدام العناوين مرة واحدة Ùقط.‬</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation type="unfinished">‫تعذر إنشاء المعاملة!‬</translation>
- </message>
- <message>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">تعتبر الرسوم الأعلى من %1 رسوماً باهظة.</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -3031,333 +1428,16 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
<numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
<numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
- <numerusform>‫الوقت التقديري للنÙاذ خلال %n طوابق.‬</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
<message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">تحذير: عنوان بتكوين غير صالح</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation type="unfinished">تحذير: عنوان الÙكة غير معروÙ</translation>
- </message>
- <message>
- <source>Confirm custom change address</source>
- <translation type="unfinished">تأكيد تغيير العنوان الÙكة</translation>
- </message>
- <message>
- <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
- <translation type="unfinished">‫العنوان الذي قمت بتحديده للÙكة ليس جزءا من هذه المحÙظة. بعض أو جميع الأموال ÙÙŠ محÙظتك قد يتم إرسالها لهذا العنوان. هل أنت متأكد؟‬</translation>
- </message>
- <message>
<source>(no label)</source>
- <translation type="unfinished">( لا وجود لمذكرة)</translation>
- </message>
-</context>
-<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>A&amp;mount:</source>
- <translation type="unfinished">&amp;القيمة</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">ادÙع &amp;الى :</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;مذكرة :</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">‫اختر عنوانا تم استخدامه سابقا‬</translation>
- </message>
- <message>
- <source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">‫عنوان البتكوين لارسال الدÙعة له‬</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">‫ألصق العنوان من الحاÙظة‬</translation>
- </message>
- <message>
- <source>Remove this entry</source>
- <translation type="unfinished">‫ازل هذا المدخل‬</translation>
- </message>
- <message>
- <source>The amount to send in the selected unit</source>
- <translation type="unfinished">‫القيمة للإرسال ÙÙŠ الوحدة المحددة‬</translation>
- </message>
- <message>
- <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
- <translation type="unfinished">‫سيتم خصم الرسوم من المبلغ الذي يتم إرساله. لذا سو٠يتلقى المستلم قيمة أقل من البتكوين المدخل ÙÙŠ حقل القيمة. ÙÙŠ حالة تحديد عدة مستلمين، يتم تقسيم الرسوم بالتساوي.‬</translation>
- </message>
- <message>
- <source>S&amp;ubtract fee from amount</source>
- <translation type="unfinished">‫ط&amp;رح الرسوم من القيمة‬</translation>
- </message>
- <message>
- <source>Use available balance</source>
- <translation type="unfinished">استخدام الرصيد المتاح</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">‫رسالة:‬</translation>
- </message>
- <message>
- <source>Enter a label for this address to add it to the list of used addresses</source>
- <translation type="unfinished">‫أدخل مذكرة لهذا العنوان لإضاÙته إلى قائمة العناوين المستخدمة‬</translation>
- </message>
- <message>
- <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">‫الرسالة يتم إرÙاقها مع البتكوين: الرابط سيتم تخزينه مع العملية لك للرجوع إليه. ملاحظة: لن يتم إرسال هذه الرسالة عبر شبكة البتكوين.‬</translation>
- </message>
-</context>
-<context>
- <name>SendConfirmationDialog</name>
- <message>
- <source>Send</source>
- <translation type="unfinished">إرسال</translation>
- </message>
- <message>
- <source>Create Unsigned</source>
- <translation type="unfinished">إنشاء غير موقع</translation>
- </message>
-</context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">التواقيع - التوقيع / تحقق من الرسالة</translation>
- </message>
- <message>
- <source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;توقيع الرسالة</translation>
- </message>
- <message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">‫تستطيع توقيع رسائل/اتÙاقيات من عناوينك لإثبات أنه بإمكانك استلام بتكوين مرسل لهذه العناوين. كن حذرا من توقيع أي شيء غامض أو عشوائي، هجمات التصيد قد تحاول خداعك وانتحال هويتك. وقع البيانات الواضحة بالكامل والتي تواÙÙ‚ عليها Ùقط.‬</translation>
- </message>
- <message>
- <source>The Bitcoin address to sign the message with</source>
- <translation type="unfinished">عنوان البتكوين لتوقيع الرسالة منه</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">‫اختر عنوانا تم استخدامه سابقا‬</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">‫ألصق العنوان من الحاÙظة‬</translation>
- </message>
- <message>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished">ادخل الرسالة التي تريد توقيعها هنا</translation>
- </message>
- <message>
- <source>Signature</source>
- <translation type="unfinished">التوقيع</translation>
- </message>
- <message>
- <source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">نسخ التوقيع الحالي إلى حاÙظة النظام</translation>
- </message>
- <message>
- <source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">‫وقع الرسالة لتثبت انك تملك عنوان البتكوين هذا‬</translation>
- </message>
- <message>
- <source>Sign &amp;Message</source>
- <translation type="unfinished">توقيع &amp;الرسالة</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">‫إعادة تعيين كاÙØ© حقول توقيع الرسالة‬</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">مسح الكل</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">‫&amp;تحقق من الرسالة‬</translation>
- </message>
- <message>
- <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
- <translation type="unfinished">أدخل عنوان المتلقي، راسل (تأكد من نسخ Ùواصل الأسطر، الÙراغات، الخ.. تماما) والتوقيع أسÙله لتأكيد الرسالة. كن حذرا من عدم قراءة داخل التوقيع أكثر مما هو موقع بالرسالة Ù†Ùسها، لتجنب خداعك بهجوم man-in-the-middle. لاحظ أنه هذا لاثبات أن الجهة الموقعة تستقبل مع العنوان Ùقط، لا تستطيع اثبات الارسال لأي معاملة.</translation>
- </message>
- <message>
- <source>The Bitcoin address the message was signed with</source>
- <translation type="unfinished">عنوان البتكوين الذي تم توقيع الرسالة منه</translation>
- </message>
- <message>
- <source>The signed message to verify</source>
- <translation type="unfinished">الرسالة الموقعة للتحقق.</translation>
- </message>
- <message>
- <source>The signature given when the message was signed</source>
- <translation type="unfinished">‫التوقيع المعطى عند توقيع الرسالة‬</translation>
- </message>
- <message>
- <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">‫تحقق من الرسالة للتأكد أنه تم توقيعها من عنوان البتكوين المحدد‬</translation>
- </message>
- <message>
- <source>Verify &amp;Message</source>
- <translation type="unfinished">تحقق من &amp;الرسالة</translation>
- </message>
- <message>
- <source>Reset all verify message fields</source>
- <translation type="unfinished">إعادة تعيين جميع حقول التحقق من الرسالة</translation>
- </message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">‫انقر "توقيع الرسالة" لانشاء التوقيع‬</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation type="unfinished">العنوان المدخل غير صالح</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation type="unfinished">الرجاء التأكد من العنوان والمحاولة مرة اخرى.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">العنوان المدخل لا يشير الى Ù…Ùتاح.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation type="unfinished">تم الغاء عملية Ùتح المحÙظة.</translation>
- </message>
- <message>
- <source>No error</source>
- <translation type="unfinished">لا يوجد خطأ</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation type="unfinished">‫المÙتاح الخاص للعنوان المدخل غير متاح.‬</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation type="unfinished">Ùشل توقيع الرسالة.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation type="unfinished">الرسالة موقعة.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation type="unfinished">لا يمكن ÙÙƒ تشÙير التوقيع.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">Ùضلا تاكد من التوقيع وحاول مرة اخرى</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation type="unfinished">لم يتطابق التوقيع مع ملخص الرسالة.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation type="unfinished">Ùشلت عملية التأكد من الرسالة.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">تم تأكيد الرسالة.</translation>
- </message>
-</context>
-<context>
- <name>SplashScreen</name>
- <message>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">‫(انقر q للاغلاق والمواصلة لاحقا)‬</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">‫انقر q للاغلاق‬</translation>
- </message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
- <message>
- <source>kB/s</source>
- <translation type="unfinished">كيلوبايت/ثانية</translation>
+ <translation type="unfinished">(بدون وسم)</translation>
</message>
</context>
<context>
<name>TransactionDesc</name>
- <message>
- <source>conflicted with a transaction with %1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
- <translation type="unfinished">‫تعارضت مع عملية أخرى تم تأكيدها %1</translation>
- </message>
- <message>
- <source>0/unconfirmed, in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">‫0/غير مؤكدة، ÙÙŠ تجمع الذاكرة‬</translation>
- </message>
- <message>
- <source>0/unconfirmed, not in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">‫0/غير مؤكدة، ليست ÙÙŠ تجمع الذاكرة‬</translation>
- </message>
- <message>
- <source>abandoned</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
- <translation type="unfinished">مهجور</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
- <translation type="unfinished">غير مؤكدة/%1</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
- <translation type="unfinished">تأكيد %1</translation>
- </message>
- <message>
- <source>Status</source>
- <translation type="unfinished">الحالة.</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">التاريخ</translation>
- </message>
- <message>
- <source>Source</source>
- <translation type="unfinished">المصدر</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation type="unfinished">‫مÙصدر‬</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">من</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">غير معروÙ</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">الى</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">عنوانه</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">‫مراقبة Ùقط‬</translation>
- </message>
- <message>
- <source>label</source>
- <translation type="unfinished">‫مذكرة‬</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -3370,348 +1450,35 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</translation>
</message>
<message>
- <source>not accepted</source>
- <translation type="unfinished">غير مقبولة</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">رسوم العملية</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation type="unfinished">‫صاÙÙŠ القيمة‬</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">رسالة </translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">تعليق</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation type="unfinished">‫رقم العملية‬</translation>
- </message>
- <message>
- <source>Transaction total size</source>
- <translation type="unfinished">الحجم الكلي ‫للعملية‬</translation>
- </message>
- <message>
- <source>Transaction virtual size</source>
- <translation type="unfinished">حجم المعاملة الاÙتراضي</translation>
- </message>
- <message>
- <source>Output index</source>
- <translation type="unfinished">مؤشر المخرجات</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation type="unfinished">تاجر</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation type="unfinished">معلومات التصحيح</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation type="unfinished">‫عملية‬</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation type="unfinished">المدخلات</translation>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">النقود المولدة يجب أن تنضج %1 من الكتل قبل أن يكون بالإمكان إنÙاقهم. عندما تولد أنت هذه الكتلة، تكون قد بثت الى الشبكة ليتم اضاÙتها لسلسلة الكتل. اذا Ùشلت ÙÙŠ الدخول الى السلسلة، حالتها سو٠تتغير الى "غير مقبولة" ولن تكون قابلة للإنÙاق. هذا قد يحدث أحيانا اذا قامت عقدة أخرى بتوليد كتلة خلال ثوان معدودة من قيامك بنÙس العملية.</translation>
</message>
<message>
<source>Amount</source>
<translation type="unfinished">‫القيمة‬</translation>
</message>
- <message>
- <source>true</source>
- <translation type="unfinished">صحيح</translation>
- </message>
- <message>
- <source>false</source>
- <translation type="unfinished">خاطئ</translation>
- </message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
- <message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">يبين هذا الجزء وصÙا Ù…Ùصلا لهده المعاملة</translation>
- </message>
- <message>
- <source>Details for %1</source>
- <translation type="unfinished">تÙاصيل عن %1</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">التاريخ</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">النوع</translation>
</message>
<message>
- <source>Label</source>
- <translation type="unfinished">المذكرة</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation type="unfinished">غير مؤكد</translation>
- </message>
- <message>
- <source>Abandoned</source>
- <translation type="unfinished">مهجور</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation type="unfinished">قيد التأكيد (%1 من %2 تأكيد موصى به)</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">‫ناÙØ° (%1 تأكيدات)‬</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation type="unfinished">يتعارض</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">غير ناضجة (تأكيدات %1 ØŒ ستكون متوÙرة بعد %2)</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation type="unfinished">ولّدت ولكن لم تقبل</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">‫استلم Ùي‬</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation type="unfinished">‫استلم من</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">أرسل إلى</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">‫معدّن‬</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">‫مراقبة Ùقط‬</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation type="unfinished">غير متوÙر</translation>
- </message>
- <message>
<source>(no label)</source>
- <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ <translation type="unfinished">(بدون وسم)</translation>
</message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">حالة التحويل. مرر Ùوق هذا الحقل لعرض عدد التأكيدات.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation type="unfinished">‫التاريخ والوقت الذي تم Ùيه استلام العملية.‬</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation type="unfinished">‫نوع العملية.‬</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">‫إذا كان عنوان المراقبة له علاقة بهذه العملية أم لا.‬</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation type="unfinished">‫سبب تنÙيذ العملية للمستخدم.‬</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation type="unfinished">‫القيمة المضاÙØ© أو المزالة من الرصيد.‬</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionView</name>
<message>
- <source>All</source>
- <translation type="unfinished">الكل</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">اليوم</translation>
- </message>
- <message>
- <source>This week</source>
- <translation type="unfinished">هذا الاسبوع</translation>
- </message>
- <message>
- <source>This month</source>
- <translation type="unfinished">هذا الشهر</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation type="unfinished">الشهر الماضي</translation>
- </message>
- <message>
- <source>This year</source>
- <translation type="unfinished">هذا العام</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">‫استلم Ùي‬</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">أرسل إلى</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">‫معدّن‬</translation>
- </message>
- <message>
- <source>Other</source>
- <translation type="unfinished">أخرى</translation>
- </message>
- <message>
- <source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">‫أدخل العنوان أو معر٠المعاملة أو المذكرة للبحث‬</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation type="unfinished">الحد الأدنى</translation>
- </message>
- <message>
- <source>Range…</source>
- <translation type="unfinished">نطاق...</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">‫&amp;انسخ العنوان‬</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">‫نسخ &amp;مذكرة‬</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">‫نسخ &amp;القيمة‬</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID</source>
- <translation type="unfinished">‫نسخ &amp;معر٠العملية‬</translation>
- </message>
- <message>
- <source>Copy &amp;raw transaction</source>
- <translation type="unfinished">‫نسخ &amp;النص الأصلي للعملية‬</translation>
- </message>
- <message>
- <source>Copy full transaction &amp;details</source>
- <translation type="unfinished">‫نسخ كامل &amp;تÙاصيل العملية‬</translation>
- </message>
- <message>
- <source>&amp;Show transaction details</source>
- <translation type="unfinished">‫&amp; اظهر تÙاصيل العملية‬</translation>
- </message>
- <message>
- <source>Increase transaction &amp;fee</source>
- <translation type="unfinished">‫زيادة العملية و الرسوم‬</translation>
- </message>
- <message>
- <source>A&amp;bandon transaction</source>
- <translation type="unfinished">‫ال&amp;تخلي عن العملية</translation>
- </message>
- <message>
- <source>&amp;Edit address label</source>
- <translation type="unfinished">و تحرير تسمية العنوان </translation>
- </message>
- <message>
- <source>Show in %1</source>
- <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
- <translation type="unfinished">‫عرض ÙÙŠ %1</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation type="unfinished">‫تصدير سجل العمليات التاريخي‬</translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">مل٠القيم المÙصولة بÙاصلة</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">‫ناÙذ‬</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation type="unfinished">‫مراقبة Ùقط‬</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">التاريخ</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">النوع</translation>
</message>
- <message>
- <source>Label</source>
- <translation type="unfinished">المذكرة</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">العنوان</translation>
- </message>
- <message>
- <source>ID</source>
- <translation type="unfinished">‫المعرÙ‬</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation type="unfinished">Ùشل التصدير</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation type="unfinished">‫حدث خطأ أثناء محاولة Ø­Ùظ سجل العملية التاريخي ÙÙŠ %1.‬</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation type="unfinished">نجح التصدير</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">‫تم Ø­Ùظ سجل العملية التاريخي بنجاح ÙÙŠ %1.‬</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation type="unfinished">المدى:</translation>
- </message>
- <message>
- <source>to</source>
- <translation type="unfinished">إلى</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletFrame</name>
<message>
- <source>No wallet has been loaded.
-Go to File &gt; Open Wallet to load a wallet.
-- OR -</source>
- <translation type="unfinished">لم يتم تحميل أي محاÙظ.
-اذهب الى مل٠&gt; Ùتح محÙظة لتحميل محÙظة.
-- أو -</translation>
- </message>
- <message>
<source>Create a new wallet</source>
<translation type="unfinished">إنشاء محÙظة جديدة</translation>
</message>
@@ -3719,100 +1486,12 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Error</source>
<translation type="unfinished">خطأ</translation>
</message>
- <message>
- <source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">‫تعذر قراءة وتحليل ترميز PSBT من الحاÙظة (base64 غير صالح)‬</translation>
- </message>
- <message>
- <source>Load Transaction Data</source>
- <translation type="unfinished">‫تحميل بيانات العملية‬</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">معاملة موقعة جزئيا (psbt.*)</translation>
- </message>
- <message>
- <source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">مل٠PSBT يجب أن يكون أصغر من 100 ميجابايت</translation>
- </message>
- <message>
- <source>Unable to decode PSBT</source>
- <translation type="unfinished">‫غير قادر على قراءة وتحليل ترميز PSBT‬</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">‫إرسال وحدات البتكوين‬</translation>
- </message>
- <message>
- <source>Fee bump error</source>
- <translation type="unfinished">خطأ ÙÙŠ زيادة الرسوم</translation>
- </message>
- <message>
- <source>Increasing transaction fee failed</source>
- <translation type="unfinished">Ùشل ÙÙŠ زيادة رسوم العملية</translation>
- </message>
- <message>
- <source>Do you want to increase the fee?</source>
- <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
- <translation type="unfinished">هل تريد زيادة الرسوم؟</translation>
- </message>
- <message>
- <source>Current fee:</source>
- <translation type="unfinished">‫الرسوم الان:‬</translation>
- </message>
- <message>
- <source>Increase:</source>
- <translation type="unfinished">زيادة:</translation>
- </message>
- <message>
- <source>New fee:</source>
- <translation type="unfinished">‫رسم جديد:‬</translation>
- </message>
- <message>
- <source>Confirm fee bump</source>
- <translation type="unfinished">تأكيد زيادة الرسوم</translation>
- </message>
- <message>
- <source>Can't draft transaction.</source>
- <translation type="unfinished">لا يمكن صياغة المعاملة</translation>
- </message>
- <message>
- <source>PSBT copied</source>
- <translation type="unfinished">تم نسخ PSBT</translation>
- </message>
- <message>
- <source>Can't sign transaction.</source>
- <translation type="unfinished">لا يمكن توقيع المعاملة.</translation>
- </message>
- <message>
- <source>Could not commit transaction</source>
- <translation type="unfinished">لا يمكن تنÙيذ المعاملة</translation>
- </message>
- <message>
- <source>Can't display address</source>
- <translation type="unfinished">لا يمكن عرض العنوان </translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">‫محÙظة اÙتراضية‬</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;تصدير</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">صدّر البيانات ÙÙŠ التبويب الحالي الى ملÙ</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation type="unfinished">‫انسخ المحÙظة احتياطيا‬</translation>
+ <translation type="unfinished">و إستخرج</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -3820,22 +1499,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">بيانات المحÙظة</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation type="unfinished">‫تعذر النسخ الاحتياطي‬</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation type="unfinished">لقد حدث خطأ أثناء محاولة Ø­Ùظ بيانات المحÙظة الى %1.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation type="unfinished">‫نجح النسخ الاحتياطي‬</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">تم Ø­Ùظ بيانات المحÙظة بنجاح إلى %1.</translation>
- </message>
- <message>
<source>Cancel</source>
<translation type="unfinished">إلغاء</translation>
</message>
@@ -3843,456 +1506,12 @@ Go to File &gt; Open Wallet to load a wallet.
<context>
<name>bitcoin-core</name>
<message>
- <source>The %s developers</source>
- <translation type="unfinished">%s المبرمجون</translation>
- </message>
- <message>
- <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">‫‫%s مشكل. حاول استخدام أداة محÙظة البتكوين للاصلاح أو استعادة نسخة احتياطية.‬</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%sÙشل ÙÙŠ التحقق من صحة حالة اللقطة -assumeutxo. يشير هذا إلى وجود مشكلة ÙÙŠ الأجهزة، أو خطأ ÙÙŠ البرنامج، أو تعديل سيء ÙÙŠ البرنامج يسمح بتحميل لقطة غير صالحة. ونتيجة لذلك، سيتم إيقا٠تشغيل العقدة والتوق٠عن استخدام أي حالة تم إنشاؤها ÙÙŠ اللقطة، مما يؤدي إلى إعادة ضبط ارتÙاع السلسلة من%dإلى %d. ÙÙŠ عملية إعادة التشغيل التالية، ستستأن٠العقدة المزامنة من %dدون استخدام أي بيانات لقطة. الرجاء الإبلاغ عن هذه الحادثة إلى %sØŒ بما ÙÙŠ ذلك كيÙية حصولك على اللقطة. سيتم ترك حالة سلسلة اللقطة غير الصالحة على القرص ÙÙŠ حال كان ذلك Ù…Ùيدًا ÙÙŠ تشخيص المشكلة التي تسببت ÙÙŠ هذا الخطأ.</translation>
- </message>
- <message>
- <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">‫لا يمكن استرجاع إصدار المحÙظة من %i الى %i. لم يتغير إصدار المحÙظة.‬</translation>
- </message>
- <message>
- <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">‫لا يمكن اقÙال المجلد %s. من المحتمل أن %s يعمل بالÙعل.‬</translation>
- </message>
- <message>
- <source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
- <translation type="unfinished">موزع بموجب ترخيص برامج MIT ، راجع المل٠المصاحب %s أو %s</translation>
- </message>
- <message>
- <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">‫خطأ ÙÙŠ قراءة %s بيانات العملية قد تكون Ù…Ùقودة أو غير صحيحة. اعادة Ùحص المحÙظة.‬</translation>
- </message>
- <message>
- <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
- <translation type="unfinished">المل٠%s موجود مسبقا , اذا كنت متأكدا من المتابعة يرجى ابعاده للاستمرار.</translation>
- </message>
- <message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">رجاء تأكد من أن التاريخ والوقت ÙÙŠ حاسوبك صحيحان! اذا كانت ساعتك خاطئة، %s لن يعمل بصورة صحيحة.</translation>
- </message>
- <message>
- <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
- <translation type="unfinished">يرجى المساهمة إذا وجدت %s Ù…Ùيداً. تÙضل بزيارة %s لمزيد من المعلومات حول البرنامج.</translation>
- </message>
- <message>
- <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
- <translation type="unfinished">‫الاختصار أقل من الحد الأدنى %d ميجابايت. من Ùضلك ارÙع الحد.‬</translation>
- </message>
- <message>
- <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
- <translation type="unfinished">‫الاختصار: اخر مزامنة للمحÙظة كانت قبل البيانات المختصرة. تحتاج الى - اعادة Ùهرسة (قم بتنزيل الطوابق المتتالية بأكملها مرة أخرى ÙÙŠ حال تم اختصار النود)‬</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
- <translation type="unfinished">SQLiteDatabase: اصدار مخطط لمحÙظة sqlite غير معرو٠%d. Ùقط اصدار %d مدعوم.</translation>
- </message>
- <message>
- <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
- <translation type="unfinished">‫قاعدة بيانات الطوابق تحتوي على طابق مستقبلي كما يبدو. قد يكون هذا بسبب أن التاريخ والوقت ÙÙŠ جهازك لم يضبطا بشكل صحيح. قم بإعادة بناء قاعدة بيانات الطوابق ÙÙŠ حال كنت متأكدا من أن التاريخ والوقت قد تم ضبطهما بشكل صحيح‬</translation>
- </message>
- <message>
- <source>The transaction amount is too small to send after the fee has been deducted</source>
- <translation type="unfinished">قيمة المعاملة صغيرة جدًا ولا يمكن إرسالها بعد خصم الرسوم</translation>
- </message>
- <message>
- <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <translation type="unfinished">‫هذه بناء برمجي تجريبي - استخدمه على مسؤوليتك الخاصة - لا تستخدمه للتعدين أو التجارة‬</translation>
- </message>
- <message>
- <source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
- <translation type="unfinished">‫هذا هو الحد الاعلى للرسوم التي تدÙعها (بالاضاÙØ© للرسوم العادية) لتÙادي الدÙع الجزئي واعطاء أولوية لاختيار الوحدات.‬</translation>
- </message>
- <message>
- <source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
- <translation type="unfinished">هذه رسوم المعاملة يمكنك التخلص منها إذا كان المبلغ أصغر من الغبار عند هذا المستوى</translation>
- </message>
- <message>
- <source>This is the transaction fee you may pay when fee estimates are not available.</source>
- <translation type="unfinished">هذه هي رسوم المعاملة التي قد تدÙعها عندما تكون عملية حساب الرسوم غير متوÙرة.</translation>
- </message>
- <message>
- <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">‫صيغة مل٠المحÙظة غير معروÙØ© “%sâ€. الرجاء تقديم اما “bdb†أو “sqliteâ€.‬</translation>
- </message>
- <message>
- <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">‫تم انشاء المحÙظة بنجاح. سيتم الغاء العمل بنوعية المحاÙظ القديمة ولن يتم دعم انشاءها أو Ùتحها مستقبلا.‬</translation>
- </message>
- <message>
- <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <translation type="unfinished">‫تحذير: تم اكتشا٠مÙاتيح خاصة ÙÙŠ المحÙظة {%s} رغم أن خيار التعامل مع المÙاتيح الخاصة معطل‬} مع Ù…Ùاتيح خاصة موقÙØ©. </translation>
- </message>
- <message>
- <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation type="unfinished">‫تحذير: لا يبدو أننا نتÙÙ‚ تمامًا مع أقراننا! قد تحتاج إلى الترقية ØŒ أو قد تحتاج الأنواد الأخرى إلى الترقية.‬</translation>
- </message>
- <message>
- <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
- <translation type="unfinished">‫تحتاج إلى إعادة إنشاء قاعدة البيانات باستخدام -reindex للعودة إلى الوضعية النود الكامل. هذا سو٠يعيد تحميل الطوابق المتتالية بأكملها‬</translation>
- </message>
- <message>
- <source>%s is set very high!</source>
- <translation type="unfinished">ضبط %s مرتÙع جدا!‬</translation>
- </message>
- <message>
- <source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">‫-الحد الأقصى لتجمع الذاكرة %d ميجابايت‬ على الأقل</translation>
- </message>
- <message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">‫حدث خطأ داخلي شديد، راجع مل٠تصحيح الأخطاء للتÙاصيل‬</translation>
- </message>
- <message>
- <source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">لا يمكن الحل - %s العنوان: '%s'</translation>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">أكثر من عنوان مربوط بالonion مقدم. استخدام %s من أجل خدمة تور (Tor) المنشأة تلقائيا.</translation>
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">‫لايمكن الكتابة ÙÙŠ المجلد '%s'Ø› تحقق من الصلاحيات.‬</translation>
- </message>
- <message>
- <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">‫Ùشل ÙÙŠ إعادة تسمية مل٠invalid peers.dat. يرجى نقله أو حذÙÙ‡ وحاول مرة أخرى.‬</translation>
- </message>
- <message>
- <source>Config setting for %s only applied on %s network when in [%s] section.</source>
- <translation type="unfinished">يتم تطبيق إعداد التكوين لـ%s Ùقط على شبكة %s ÙÙŠ قسم [%s].</translation>
- </message>
- <message>
- <source>Copyright (C) %i-%i</source>
- <translation type="unfinished">حقوق الطبع والنشر (C) %i-%i</translation>
- </message>
- <message>
- <source>Corrupted block database detected</source>
- <translation type="unfinished">‫تم الكش٠عن قاعدة بيانات طوابق تالÙة‬</translation>
- </message>
- <message>
- <source>Could not find asmap file %s</source>
- <translation type="unfinished">تعذر العثور على مل٠asmap %s</translation>
- </message>
- <message>
- <source>Could not parse asmap file %s</source>
- <translation type="unfinished">تعذر تحليل مل٠asmap %s</translation>
- </message>
- <message>
- <source>Disk space is too low!</source>
- <translation type="unfinished">‫تحذير: مساحة التخزين منخÙضة!‬</translation>
- </message>
- <message>
- <source>Do you want to rebuild the block database now?</source>
- <translation type="unfinished">‫هل تريد إعادة بناء قاعدة بيانات الطوابق الآن؟‬</translation>
- </message>
- <message>
- <source>Done loading</source>
- <translation type="unfinished">إنتهاء التحميل</translation>
- </message>
- <message>
- <source>Dump file %s does not exist.</source>
- <translation type="unfinished">‫مل٠الاسقاط %s غير موجود.‬</translation>
- </message>
- <message>
- <source>Error creating %s</source>
- <translation type="unfinished">خطأ ÙÙŠ إنشاء %s</translation>
- </message>
- <message>
- <source>Error loading %s</source>
- <translation type="unfinished">خطأ ÙÙŠ تحميل %s</translation>
- </message>
- <message>
- <source>Error loading %s: Private keys can only be disabled during creation</source>
- <translation type="unfinished">‫خطأ ÙÙŠ تحميل %s: يمكن تعطيل المÙاتيح الخاصة أثناء الانشاء Ùقط‬</translation>
- </message>
- <message>
- <source>Error loading %s: Wallet corrupted</source>
- <translation type="unfinished">خطأ ÙÙŠ التحميل %s: المحÙظة تالÙØ©.</translation>
- </message>
- <message>
- <source>Error loading %s: Wallet requires newer version of %s</source>
- <translation type="unfinished">‫خطأ ÙÙŠ تحميل %s: المحÙظة تتطلب الاصدار الجديد من %s‬</translation>
- </message>
- <message>
- <source>Error loading block database</source>
- <translation type="unfinished">‫خطأ ÙÙŠ تحميل قاعدة بيانات الطوابق‬</translation>
- </message>
- <message>
- <source>Error opening block database</source>
- <translation type="unfinished">‫خطأ ÙÙŠ Ùتح قاعدة بيانات الطوابق‬</translation>
- </message>
- <message>
- <source>Error reading from database, shutting down.</source>
- <translation type="unfinished">‫خطأ ÙÙŠ القراءة من قاعدة البيانات ØŒ يجري التوقÙ.‬</translation>
- </message>
- <message>
- <source>Error reading next record from wallet database</source>
- <translation type="unfinished">خطأ قراءة السجل التالي من قاعدة بيانات المحÙظة</translation>
- </message>
- <message>
- <source>Error: Couldn't create cursor into database</source>
- <translation type="unfinished">‫خطأ : لم نتمكن من انشاء علامة Ùارقة (cursor) ÙÙŠ قاعدة البيانات‬</translation>
- </message>
- <message>
- <source>Error: Disk space is low for %s</source>
- <translation type="unfinished">‫خطأ : مساحة التخزين منخÙضة Ù„ %s</translation>
- </message>
- <message>
- <source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">‫خطأ: Ùشل انشاء محÙظة المراقبة Ùقط الجديدة‬</translation>
- </message>
- <message>
- <source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">‫خطأ: المÙتاح ليس ÙÙŠ صيغة ست عشرية: %s</translation>
- </message>
- <message>
- <source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">‫خطأ: القيمة ليست ÙÙŠ صيغة ست عشرية: %s</translation>
- </message>
- <message>
- <source>Error: Missing checksum</source>
- <translation type="unfinished">خطأ : مجموع اختباري Ù…Ùقود </translation>
- </message>
- <message>
- <source>Error: No %s addresses available.</source>
- <translation type="unfinished">‫خطأ : لا يتوÙر %s عناوين.‬</translation>
- </message>
- <message>
- <source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">‫خطأ: غير قادر على قراءة السجلات ÙÙŠ قاعدة البيانات‬</translation>
- </message>
- <message>
- <source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">‫خطأ: غير قادر النسخ الاحتياطي للمحÙظة‬</translation>
- </message>
- <message>
- <source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">‫خطأ: غير قادر على قراءة السجلات ÙÙŠ قاعدة البيانات‬</translation>
- </message>
- <message>
- <source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">‫خطأ: غير قادر على ازالة عناوين المراقبة Ùقط من السجل‬</translation>
- </message>
- <message>
- <source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">خطأ : لا يمكن كتابة السجل للمحÙظة الجديدة</translation>
- </message>
- <message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Ùشل ÙÙŠ الاستماع على أي منÙØ°. استخدام الاستماع = 0 إذا كنت تريد هذا.</translation>
- </message>
- <message>
- <source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">‫Ùشلت عملية اعادة تÙحص وتدقيق المحÙظة أثناء التهيئة‬</translation>
- </message>
- <message>
- <source>Failed to verify database</source>
- <translation type="unfinished">Ùشل ÙÙŠ التحقق من قاعدة البيانات</translation>
- </message>
- <message>
- <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
- <translation type="unfinished">‫معدل الرسوم (%s) أقل من الحد الادنى لاعدادات معدل الرسوم (%s)‬</translation>
- </message>
- <message>
- <source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">‫تجاهل المحÙظة المكررة %s.‬</translation>
- </message>
- <message>
- <source>Importing…</source>
- <translation type="unfinished">‫الاستيراد…‬</translation>
- </message>
- <message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">‫لم يتم العثور على طابق الأساس أو المعلومات غير صحيحة. مجلد بيانات خاطئ للشبكة؟‬</translation>
- </message>
- <message>
- <source>Initialization sanity check failed. %s is shutting down.</source>
- <translation type="unfinished">‫Ùشل التحقق من اختبار التعقل. تم إيقا٠%s.</translation>
- </message>
- <message>
- <source>Input not found or already spent</source>
- <translation type="unfinished">‫المدخلات غير موجودة أو تم صرÙها‬</translation>
- </message>
- <message>
- <source>Insufficient funds</source>
- <translation type="unfinished">الرصيد غير كاÙÙŠ</translation>
- </message>
- <message>
- <source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">عنوان اونيون غير صحيح : '%s'</translation>
- </message>
- <message>
- <source>Invalid P2P permission: '%s'</source>
- <translation type="unfinished">‫إذن القرين للقرين غير صالح: ‘%s’‬</translation>
- </message>
- <message>
- <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">‫قيمة غير صحيحة‬ ل - %s=&lt;amount&gt;:"%s"</translation>
- </message>
- <message>
- <source>Loading P2P addresses…</source>
- <translation type="unfinished">تحميل عناوين P2P....</translation>
- </message>
- <message>
- <source>Loading banlist…</source>
- <translation type="unfinished">تحميل قائمة الحظر</translation>
- </message>
- <message>
- <source>Loading block index…</source>
- <translation type="unfinished">‫تحميل Ùهرس الطابق…‬</translation>
- </message>
- <message>
- <source>Loading wallet…</source>
- <translation type="unfinished">‫تحميل المحÙظة…‬</translation>
- </message>
- <message>
- <source>Missing amount</source>
- <translation type="unfinished">‫يÙتقد القيمة‬</translation>
- </message>
- <message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">لا تتوÙر واصÙات ملÙات كاÙية.</translation>
- </message>
- <message>
- <source>Prune cannot be configured with a negative value.</source>
- <translation type="unfinished">‫لا يمكن ضبط الاختصار بقيمة سالبة.‬</translation>
- </message>
- <message>
- <source>Prune mode is incompatible with -txindex.</source>
- <translation type="unfinished">‫وضع الاختصار غير متواÙÙ‚ مع -txindex.‬</translation>
- </message>
- <message>
- <source>Replaying blocks…</source>
- <translation type="unfinished">‫إستعادة الطوابق…‬</translation>
- </message>
- <message>
- <source>Rescanning…</source>
- <translation type="unfinished">‫إعادة التÙحص والتدقيق…‬</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <translation type="unfinished">‫‫SQLiteDatabase: Ùشل ÙÙŠ تنÙيذ الامر لتوثيق قاعدة البيانات: %s</translation>
- </message>
- <message>
- <source>Section [%s] is not recognized.</source>
- <translation type="unfinished">لم يتم التعر٠على القسم [%s]</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">Ùشل توقيع المعاملة</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" does not exist</source>
- <translation type="unfinished">‫مجلد المحÙظة المحددة "%s" غير موجود</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" is a relative path</source>
- <translation type="unfinished">‫مسار مجلد المحÙظة المحدد "%s" مختصر ومتغير‬</translation>
- </message>
- <message>
- <source>The source code is available from %s.</source>
- <translation type="unfinished">Ø´Ùرة المصدر متاحة من %s.</translation>
- </message>
- <message>
- <source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">‫قيمة المعاملة صغيرة جدا ولا تكÙÙŠ لدÙع الرسوم‬</translation>
- </message>
- <message>
- <source>The wallet will avoid paying less than the minimum relay fee.</source>
- <translation type="unfinished">‫سو٠تتجنب المحÙظة دÙع رسوم أقل من الحد الأدنى للتوصيل.‬</translation>
+ <translation type="unfinished">لايمكن الكتابة على دليل البيانات '%s'؛ تحقق من السماحيات.</translation>
</message>
- <message>
- <source>This is experimental software.</source>
- <translation type="unfinished">هذا برنامج تجريبي.</translation>
- </message>
- <message>
- <source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">هذه هي اقل قيمة من العمولة التي تدÙعها عند كل عملية تحويل للأموال.</translation>
- </message>
- <message>
- <source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">‫هذه هي رسوم ارسال العملية التي ستدÙعها إذا قمت بارسال العمليات.‬</translation>
- </message>
- <message>
- <source>Transaction amount too small</source>
- <translation type="unfinished">قيمة العملية صغيره جدا</translation>
- </message>
- <message>
- <source>Transaction amounts must not be negative</source>
- <translation type="unfinished">‫يجب ألا تكون قيمة العملية بالسالب‬</translation>
- </message>
- <message>
- <source>Transaction must have at least one recipient</source>
- <translation type="unfinished">يجب أن تحتوي المعاملة على مستلم واحد على الأقل</translation>
- </message>
- <message>
- <source>Transaction needs a change address, but we can't generate it.</source>
- <translation type="unfinished">‫العملية تتطلب عنوان Ùكة ولكن لم نتمكن من توليد العنوان.‬</translation>
- </message>
- <message>
- <source>Transaction too large</source>
- <translation type="unfinished">المعاملة كبيرة جدا</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">يتعذر الربط مع %s على هذا الكمبيوتر (الربط انتج خطأ %s)</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer. %s is probably already running.</source>
- <translation type="unfinished">تعذر الربط مع %s على هذا الكمبيوتر. %s على الأغلب يعمل مسبقا.</translation>
- </message>
- <message>
- <source>Unable to generate initial keys</source>
- <translation type="unfinished">غير قادر على توليد Ù…Ùاتيح أولية</translation>
- </message>
- <message>
- <source>Unable to generate keys</source>
- <translation type="unfinished"> غير قادر على توليد Ù…Ùاتيح</translation>
- </message>
- <message>
- <source>Unable to open %s for writing</source>
- <translation type="unfinished">غير قادر على Ùتح %s للكتابة </translation>
- </message>
- <message>
- <source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">غير قادر على بدء خادم ال HTTP. راجع سجل تصحيح الأخطاء للحصول على التÙاصيل.</translation>
- </message>
- <message>
- <source>Unknown -blockfilterindex value %s.</source>
- <translation type="unfinished">‫قيمة -blockfilterindex  مجهولة %s.‬</translation>
- </message>
- <message>
- <source>Unknown address type '%s'</source>
- <translation type="unfinished">عنوان غير صحيح : '%s'</translation>
- </message>
- <message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">شبكة مجهولة عرÙت حددت ÙÙŠ -onlynet: '%s'</translation>
- </message>
- <message>
- <source>Verifying blocks…</source>
- <translation type="unfinished">جار التحقق من الطوابق...</translation>
- </message>
- <message>
- <source>Verifying wallet(s)…</source>
- <translation type="unfinished"> التحقق من المحاÙظ ....</translation>
- </message>
- <message>
- <source>Wallet needed to be rewritten: restart %s to complete</source>
- <translation type="unfinished">يجب إعادة كتابة المحÙظة: يلزم إعادة التشغيل %s لإكمال العملية</translation>
- </message>
- <message>
- <source>Settings file could not be read</source>
- <translation type="unfinished">‫مل٠الاعدادات لا يمكن قراءته‬</translation>
- </message>
- <message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">‫لم نتمكن من كتابة مل٠الاعدادات‬</translation>
- </message>
-</context>
+ </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_az.ts b/src/qt/locale/bitcoin_az.ts
index fcb85f3553..ad81f3a0bd 100644
--- a/src/qt/locale/bitcoin_az.ts
+++ b/src/qt/locale/bitcoin_az.ts
@@ -176,6 +176,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Pulqabı üçün köhnə şifrəli sözü və yeni şifrəli sözü daxil edin</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Davam et</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Unutmayın ki, pulqabınızın şifrələməsi bitcoinlərinizi kompüterinizə zərərli proqram tərəfindən oğurlanmaqdan tamamilə qoruya bilməz.</translation>
</message>
@@ -324,7 +328,11 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart cüzdan</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -506,7 +514,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Ödəmə tələbi (QR-kodlar və Bitcoin URI-ləri yaradılır)^</translation>
+ <translation type="unfinished">Ödəmə tələbi (QR-kodlar və Bitcoin URI-ləri yaradılır):</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -514,7 +522,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Ä°stifadÉ™ edilmiÅŸ </translation>
+ <translation type="unfinished">İstifadə edilmiş qəbuletmə ünvanlarının və etiketlərin siyahısını göstərmək</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -529,7 +537,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 geridə qaldı</translation>
+ <translation type="unfinished">%1 geridə qalır</translation>
</message>
<message>
<source>Catching up…</source>
@@ -630,10 +638,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">İcmal vərəqində dəyərləri gizlədin</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Heç bir cüzdan yoxdur</translation>
</message>
@@ -650,7 +654,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">Cüzdanı bərpa et</translation>
+ <translation type="unfinished">Pulqabını bərpa et</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -885,7 +889,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
- <translation type="unfinished">Xərclənməmiş qalığı kiliddən &amp;çıxarın</translation>
+ <translation type="unfinished">Xərclənməmiş qalığı kilidd'n &amp;çıxarın</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -950,7 +954,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Can't list signers</source>
- <translation type="unfinished">İmzalayanları göstərmək mümkün deyil</translation>
+ <translation type="unfinished">İmzalaynları göstərmək mümkün deyil</translation>
</message>
</context>
<context>
@@ -958,7 +962,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message>
<source>Load Wallets</source>
<extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
- <translation type="unfinished">Pulqabıları yükləyin</translation>
+ <translation type="unfinished">Cüzdanları yükləyin</translation>
</message>
<message>
<source>Loading wallets…</source>
@@ -984,10 +988,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Pulqabının açılması xəbərdarlığı</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart pulqabı</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Pulqabını açın</translation>
@@ -1423,17 +1423,29 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Komissiydan sonra:</translation>
+ <translation type="unfinished">Komissiyadan sonra:</translation>
</message>
<message>
<source>Change:</source>
<translation type="unfinished">Qalıq:</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">kilobayt başına</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">GizlÉ™</translation>
</message>
<message>
+ <source>Choose…</source>
+ <translation type="unfinished">Seçin…</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation type="unfinished">Balans:</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">Miqdarı kopyalayın</translation>
</message>
@@ -1487,6 +1499,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<source>unknown</source>
<translation type="unfinished">naməlum</translation>
</message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">öz ünvanı</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -1570,13 +1586,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_az@latin.ts b/src/qt/locale/bitcoin_az@latin.ts
index b392a60287..c35a060fa4 100644
--- a/src/qt/locale/bitcoin_az@latin.ts
+++ b/src/qt/locale/bitcoin_az@latin.ts
@@ -176,6 +176,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Pulqabı üçün köhnə şifrəli sözü və yeni şifrəli sözü daxil edin</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Davam et</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Unutmayın ki, pulqabınızın şifrələməsi bitcoinlərinizi kompüterinizə zərərli proqram tərəfindən oğurlanmaqdan tamamilə qoruya bilməz.</translation>
</message>
@@ -324,7 +328,11 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart cüzdan</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -506,7 +514,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Ödəmə tələbi (QR-kodlar və Bitcoin URI-ləri yaradılır)^</translation>
+ <translation type="unfinished">Ödəmə tələbi (QR-kodlar və Bitcoin URI-ləri yaradılır):</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -514,7 +522,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Ä°stifadÉ™ edilmiÅŸ </translation>
+ <translation type="unfinished">İstifadə edilmiş qəbuletmə ünvanlarının və etiketlərin siyahısını göstərmək</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -529,7 +537,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 geridə qaldı</translation>
+ <translation type="unfinished">%1 geridə qalır</translation>
</message>
<message>
<source>Catching up…</source>
@@ -630,10 +638,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">İcmal vərəqində dəyərləri gizlədin</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Heç bir cüzdan yoxdur</translation>
</message>
@@ -977,10 +981,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Pulqabının açılması xəbərdarlığı</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Cüzdanı açın</translation>
@@ -1563,13 +1563,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts
index e7bb0d50e0..bfbc848fb6 100644
--- a/src/qt/locale/bitcoin_bg.ts
+++ b/src/qt/locale/bitcoin_bg.ts
@@ -183,6 +183,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Въведете Ñтарата и новата паролна фраза за портфейла.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Продължи</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Ðе забравÑйте, че криптирането на Ð²Ð°ÑˆÐ¸Ñ Ð¿Ð¾Ñ€Ñ‚Ñ„ÐµÐ¹Ð» не може напълно да защити вашите биткойни от кражба от зловреден Ñофтуер, заразÑващ компютъра ви.</translation>
</message>
@@ -397,6 +401,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 Гигабайт</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Портфейл по подразбиране</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -491,7 +499,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">Шифровай портфейла</translation>
+ <translation type="unfinished">&amp;Крипритай уолет..</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -642,7 +650,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Заредете PSBT от &amp;клипборд...</translation>
+ <translation type="unfinished">Заредете PSBT (чаÑтично подпиÑана Bitcoin транÑакциÑ) от &amp;клипборд...</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
@@ -715,10 +723,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">МаÑкирай ÑтойноÑтите в раздела Преглед</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Портфейл по подразбиране</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">ÐÑма доÑтъпни портфейли</translation>
</message>
@@ -800,7 +804,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Предварителна ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° Headers (%1%)…</translation>
+ <translation type="unfinished">Предварителна ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° хедъри (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -1109,10 +1113,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Внимание, отворен портфейл</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Портфейл по подразбиране</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Отворете портфейл</translation>
@@ -2137,6 +2137,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Копирай адреÑ</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">нито един</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Извършване на команда без портфейл</translation>
</message>
@@ -2558,10 +2562,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ адреÑа и опитайте отново.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">ВъведениÑÑ‚ Ð°Ð´Ñ€ÐµÑ Ð½Ðµ може да Ñе ÑъпоÑтави Ñ Ð²Ð°Ð»Ð¸Ð´ÐµÐ½ ключ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Отключването на портфейла беше отменено.</translation>
</message>
@@ -2941,11 +2941,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">Изпращане</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Портфейл по подразбиране</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_bn.ts b/src/qt/locale/bitcoin_bn.ts
index f4cdcd1a4b..bfb104a7a3 100644
--- a/src/qt/locale/bitcoin_bn.ts
+++ b/src/qt/locale/bitcoin_bn.ts
@@ -276,6 +276,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">আংশিক সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¿à¦¤ বিটকয়েন লেনদেন লোড করà§à¦¨</translation>
</message>
<message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">&amp;কà§à¦²à¦¿à¦ªà¦¬à§‹à¦°à§à¦¡ থেকে আংশিক সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¿à¦¤ বিটকয়েন লেনদেন আনà§à¦¨</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">কà§à¦²à¦¿à¦ªà¦¬à§‹à¦°à§à¦¡ থেকে আংশিক সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¿à¦¤ বিটকয়েন লেনদেন লোড করà§à¦¨</translation>
</message>
@@ -466,6 +470,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ঠিকানা কপি করà§à¦¨</translation>
</message>
<message>
+ <source>via %1</source>
+ <translation type="unfinished">à¦à¦° মাধà§à¦¯à¦®à§‡ %1</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation type="unfinished">অজানা</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bs.ts b/src/qt/locale/bitcoin_bs.ts
index 2667d04cb7..e71def3e6c 100644
--- a/src/qt/locale/bitcoin_bs.ts
+++ b/src/qt/locale/bitcoin_bs.ts
@@ -329,7 +329,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">zadani novÄanik</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -598,10 +602,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Maskirajte vrijednosti na kartici Pregled</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">zadani novÄanik</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nema dostupnih novÄanika</translation>
</message>
@@ -851,10 +851,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">zadani novÄanik</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otvorite NovÄanik</translation>
@@ -1515,13 +1511,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">zadani novÄanik</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts
index d668c2d13f..eff91d3387 100644
--- a/src/qt/locale/bitcoin_ca.ts
+++ b/src/qt/locale/bitcoin_ca.ts
@@ -184,6 +184,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Introduïu la contrasenya antiga i la contrasenya nova a la cartera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continua</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recorda que tot i xifrant la teva cartera, els teus bitcoins no estan completament protegits de robatori a través de programari maliciós que estigui infectant el teu ordinador.</translation>
</message>
@@ -273,7 +277,11 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<source>Internal error</source>
<translation type="unfinished">Error intern</translation>
</message>
- </context>
+ <message>
+ <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
+ <translation type="unfinished">S'ha produït un error intern. %1 intentarà continuar amb seguretat. Es tracta d’un error inesperat que es pot informar tal com es descriu a continuació.</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -396,7 +404,11 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<numerusform>%n anys</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">cartera predeterminada</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -706,10 +718,6 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Emmascara els valors en la pestanya Visió general</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">cartera predeterminada</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">No hi ha cap cartera disponible</translation>
</message>
@@ -1116,10 +1124,6 @@ El procés de migració crearà una còpia de seguretat de la cartera abans de m
<translation type="unfinished">Avís en l'obertura de la cartera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">cartera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Obre la cartera</translation>
@@ -1189,7 +1193,7 @@ El procés de migració crearà una còpia de seguretat de la cartera abans de m
</message>
<message>
<source>You are one step away from creating your new wallet!</source>
- <translation type="unfinished">Només et queda un pas per a crear la teva nova cartera</translation>
+ <translation type="unfinished">A un pas de crear la teva nova cartera</translation>
</message>
<message>
<source>Please provide a name and, if desired, enable any advanced options</source>
@@ -1552,6 +1556,10 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Nombre de fils de &amp;verificació d'scripts</translation>
</message>
<message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">Camí complet a %1 script compatible amb Bitcoin Core (per exemple, C:\Downloads\hwi.exe o /Users/you/Downloads/hwi.py). Aneu amb compte: el programari maliciós pot robar-vos les monedes!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Adreça IP del proxy (p. ex. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -2443,6 +2451,10 @@ Si rebeu aquest error, haureu de sol·licitar al comerciant que proporcioni un U
<translation type="unfinished">Activitat de xarxa inhabilitada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Cap</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">S'està executant l'ordre sense cap cartera</translation>
</message>
@@ -2640,8 +2652,7 @@ No utilitzeu aquesta consola sense entendre completament les ramificacions d'una
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">&amp;Verifica
-</translation>
+ <translation type="unfinished">&amp;Verifica</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
@@ -3116,10 +3127,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">&amp;Signa el missatge</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Podeu signar missatges/acords amb les vostres adreces per a provar que rebeu les bitcoins que s'hi envien. Aneu amb compte no signar res que sigui vague o aleatori, perquè en alguns atacs de suplantació es pot provar que hi signeu la vostra identitat. Només signeu aquelles declaracions completament detallades en què hi esteu d'acord. </translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">L'adreça Bitcoin amb què signar el missatge</translation>
</message>
@@ -3208,10 +3215,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Comproveu l'adreça i torneu-ho a provar.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L'adreça introduïda no referencia a cap clau.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">S'ha cancel·lat el desblocatge de la cartera.</translation>
</message>
@@ -3328,10 +3331,8 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>madura en %n bloc més
-</numerusform>
- <numerusform>madura en %n blocs més
-</numerusform>
+ <numerusform>madura en %n bloc més</numerusform>
+ <numerusform>madura en %n blocs més</numerusform>
</translation>
</message>
<message>
@@ -3752,11 +3753,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">PSBT copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiat al portaretalls</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">No es pot signar la transacció.</translation>
</message>
@@ -3768,10 +3764,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<source>Can't display address</source>
<translation type="unfinished">No es pot mostrar l'adreça</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">cartera predeterminada</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3876,10 +3868,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">No s'ha proporcionat cap format de fitxer de cartera. Per a utilitzar createfromdump, s'ha de proporcionar&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Comproveu que la data i hora de l'ordinador són correctes. Si el rellotge és incorrecte, %s no funcionarà correctament.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Contribueix si trobes %s útil. Visita %s per a obtenir més informació sobre el programari.</translation>
</message>
@@ -3964,10 +3952,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">-maxmempool ha de tenir almenys %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">S'ha produït un error intern fatal. Consulteu debug.log per a més detalls</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">No es pot resoldre -%s adreça: '%s'</translation>
</message>
@@ -3981,8 +3965,7 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s especificat molt alt! Tarifes tan grans podrien pagar-se en una única transacció.
-</translation>
+ <translation type="unfinished">%s especificat molt alt! Tarifes tan grans podrien pagar-se en una única transacció.</translation>
</message>
<message>
<source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
@@ -3994,7 +3977,7 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Import no vàlid per a %s=&lt;amount&gt;: '%s' (cal que sigui com a mínim la comissió de minrelay de %s per evitar que les comissions s'encallin)</translation>
+ <translation type="unfinished">Import no vàlid per a %s=&lt;amount&gt;: '%s' (cal que sigui com a mínim la tarifa de minrelay de %s per evi tar que les tarifes s'encallin)</translation>
</message>
<message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
diff --git a/src/qt/locale/bitcoin_cmn.ts b/src/qt/locale/bitcoin_cmn.ts
index d65385fd59..b5d9efb79d 100644
--- a/src/qt/locale/bitcoin_cmn.ts
+++ b/src/qt/locale/bitcoin_cmn.ts
@@ -175,6 +175,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">請記得, å³ä½¿å°‡éŒ¢åŒ…加密, 也ä¸èƒ½å®Œå…¨é˜²æ­¢å› æƒ¡æ„軟體入侵, 而導致ä½å…ƒå¹£è¢«å·.</translation>
</message>
@@ -257,6 +265,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未æ•èŽ·çš„异常</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">發生致命錯誤。 %1無法å†ç¹¼çºŒå®‰å…¨åœ°é‹è¡Œä¸¦é›¢é–‹ã€‚</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">內部錯誤</translation>
</message>
@@ -428,7 +440,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -506,7 +518,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -517,16 +529,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">接收(&amp;R)</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">选项(&amp;O)</translation>
- </message>
- <message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">加密钱包(&amp;E)</translation>
- </message>
- <message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">把你钱包中的ç§é’¥åŠ å¯†</translation>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -537,18 +541,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">修改密ç (&amp;C)</translation>
</message>
<message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">ç­¾å消æ¯(&amp;M)</translation>
- </message>
- <message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">验è¯æ¶ˆæ¯(&amp;V)</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">校验消æ¯ï¼Œç¡®ä¿è¯¥æ¶ˆæ¯æ˜¯ç”±æŒ‡å®šçš„比特å¸åœ°å€æ‰€æœ‰è€…ç­¾åçš„</translation>
- </message>
- <message>
<source>&amp;Load PSBT from file…</source>
<translation type="unfinished">从文件加载PSBT(&amp;L)...</translation>
</message>
@@ -565,32 +557,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">创建钱包...</translation>
</message>
<message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">关闭所有钱包...</translation>
- </message>
- <message>
<source>&amp;File</source>
- <translation type="unfinished">文件(&amp;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <translation type="unfinished">&amp;說明</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">标签页工具æ </translation>
- </message>
- <message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">åŒæ­¥åŒºå—头 (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">与网络åŒæ­¥...</translation>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -602,7 +582,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">连到åŒè¡Œ...</translation>
+ <translation type="unfinished">连接到节点...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -632,15 +612,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">赶上...</translation>
+ <translation type="unfinished">正在追上进度...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -726,7 +706,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示 %1 帮助信æ¯ï¼ŒèŽ·å–å¯ç”¨å‘½ä»¤è¡Œé€‰é¡¹åˆ—表</translation>
+ <translation type="unfinished">显示%1帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -737,10 +717,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">在“概况â€æ ‡ç­¾é¡µä¸­ä¸æ˜Žæ–‡æ˜¾ç¤ºæ•°å€¼ã€åªæ˜¾ç¤ºæŽ©ç </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -762,7 +738,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">钱包å称</translation>
+ <translation type="unfinished">錢包å稱</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -778,15 +754,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">éšè—(&amp;H)</translation>
+ <translation type="unfinished">&amp;躲</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -798,26 +774,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">点击查看更多æ“作。</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">显示节点标签</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">ç¦ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">點擊查看更多æ“作</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">å¯ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">關閉網路紀錄</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">é å…ˆåŒæ­¥æ¨™é ­(%1%)</translation>
+ <translation type="unfinished">预åŒæ­¥åŒºå—头 (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -919,11 +885,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -938,14 +904,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">計費後金é¡:</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">找零:</translation>
- </message>
- <message>
- <source>(un)select all</source>
- <translation type="unfinished">å…¨(ä¸)选</translation>
- </message>
- <message>
<source>Tree mode</source>
<translation type="unfinished">树状模å¼</translation>
</message>
@@ -958,22 +916,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金é¢</translation>
</message>
<message>
- <source>Received with label</source>
- <translation type="unfinished">收款标签</translation>
- </message>
- <message>
<source>Received with address</source>
<translation type="unfinished">收款地å€</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">日期</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
- </message>
- <message>
<source>Copy amount</source>
<translation type="unfinished">å¤åˆ¶é‡‘é¢</translation>
</message>
@@ -998,10 +944,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">é”定未花费(&amp;O)</translation>
</message>
<message>
- <source>&amp;Unlock unspent</source>
- <translation type="unfinished">解é”未花费(&amp;U)</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">å¤åˆ¶æ•°ç›®</translation>
</message>
@@ -1037,11 +979,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1133,10 +1071,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
@@ -1186,7 +1120,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1237,7 +1171,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
</context>
<context>
@@ -1276,7 +1210,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">地å€â€œ%1â€å·²ç»å­˜åœ¨ï¼Œå®ƒæ˜¯ä¸€ä¸ªæ”¶æ¬¾åœ°å€ï¼Œæ ‡ç­¾ä¸ºâ€œ%2â€ï¼Œæ‰€ä»¥å®ƒä¸èƒ½ä½œä¸ºä¸€ä¸ªä»˜æ¬¾åœ°å€è¢«æ·»åŠ è¿›æ¥ã€‚</translation>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1299,7 +1233,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1307,7 +1241,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1344,7 +1278,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1375,7 +1309,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <translation type="unfinished">歡迎來到 %1。</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
@@ -1383,7 +1317,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">å–消此设置需è¦é‡æ–°ä¸‹è½½æ•´ä¸ªåŒºå—链。先完整下载整æ¡é“¾å†è¿›è¡Œä¿®å‰ªä¼šæ›´å¿«ã€‚这会ç¦ç”¨ä¸€äº›é«˜çº§åŠŸèƒ½ã€‚</translation>
+ <translation type="unfinished">æ¢å¾©æ­¤è¨­å®šéœ€è¦é‡æ–°ä¸‹è¼‰æ•´å€‹å€å¡Šéˆã€‚ 先下載完整éˆç„¶å¾Œå†ä¿®å‰ªå®ƒçš„速度更快。 ç¦ç”¨ä¸€äº›é«˜ç´šåŠŸèƒ½ã€‚</translation>
</message>
<message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
@@ -1425,7 +1359,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1436,15 +1370,15 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">近期交易å¯èƒ½å°šæœªæ˜¾ç¤ºï¼Œå› æ­¤å½“å‰ä½™é¢å¯èƒ½ä¸å‡†ç¡®ã€‚以上信æ¯å°†åœ¨ä¸Žæ¯”特å¸ç½‘络完全åŒæ­¥åŽæ›´æ­£ã€‚详情如下</translation>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">å°è¯•ä½¿ç”¨å—未å¯è§äº¤æ˜“å½±å“çš„ä½™é¢å°†ä¸è¢«ç½‘络接å—。</translation>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1456,7 +1390,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1468,7 +1402,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1496,7 +1430,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Paste address from clipboard</source>
<extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
</context>
<context>
@@ -1507,11 +1441,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1523,11 +1457,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
@@ -2274,10 +2208,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">传输</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID,如果有的è¯ã€‚</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">会è¯ID</translation>
</message>
@@ -2384,6 +2314,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">这个节点是通过这ç§ç½‘络å议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2446,7 +2380,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>&amp;Open</source>
@@ -2552,7 +2486,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2576,6 +2510,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2611,7 +2549,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2801,11 +2739,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2943,7 +2881,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2957,9 +2895,9 @@ For more information on using this console, type %6.
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">指定交易虚拟大å°çš„æ¯kB (1,000字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–50è°çš„手續費。</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
@@ -3074,6 +3012,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">部分签å交易(二进制)</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3082,6 +3024,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ä½ å¯ä»¥ä¹‹å¾Œå†æ高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">請檢查您的交易æ案。這將產生部分簽å的比特幣交易(PSBT),您å¯ä»¥å„²å­˜æˆ–複製該交易,然後使用簽å。離線%1錢包或與PSBT相容的硬體錢包。</translation>
+ </message>
+ <message>
<source>%1 from wallet '%2'</source>
<translation type="unfinished">%1 æ¥è‡ªé’±åŒ… “%2â€</translation>
</message>
@@ -3205,7 +3152,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3262,10 +3209,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">簽署訊æ¯(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ä½¿ç”¨æ‚¨çš„地å€ç°½å訊æ¯/å”議,以證明您å¯ä»¥æŽ¥æ”¶ç™¼é€çµ¦ä»–們的比特幣。但是請å°å¿ƒï¼Œä¸è¦ç°½å語æ„å«ç³Šä¸æ¸…,或隨機產生的內容,因為釣魚å¼è©é¨™å¯èƒ½æœƒç”¨é¨™ä½ ç°½å的手法來冒充是你。åªæœ‰ç°½å您åŒæ„的詳細內容。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用æ¥å¯¹æ¶ˆæ¯ç­¾å的地å€</translation>
</message>
@@ -3275,7 +3218,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3350,10 +3293,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请检查地å€åŽé‡è¯•ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">找ä¸åˆ°ä¸Žè¾“入地å€ç›¸å…³çš„密钥。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">å·²å–消解é”钱包。</translation>
</message>
@@ -3406,6 +3345,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3772,7 +3718,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3906,11 +3852,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT已複製</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">å¤åˆ¶åˆ°å‰ªè´´æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">沒辦法簽署交易。</translation>
</message>
@@ -3920,11 +3861,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't display address</source>
- <translation type="unfinished">無法顯示地å€</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <translation type="unfinished">無法顯示錢包ä½å€</translation>
</message>
</context>
<context>
@@ -3974,6 +3911,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%sæ壞。嘗試使用錢包工具bitcoin-wallet挽救或還原備份。</translation>
+ </message>
+ <message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<translation type="unfinished">%s éªŒè¯ -assumeutxo 快照状æ€å¤±è´¥ã€‚这表明硬件å¯èƒ½æœ‰é—®é¢˜ï¼Œä¹Ÿå¯èƒ½æ˜¯è½¯ä»¶bug,或者还å¯èƒ½æ˜¯è½¯ä»¶è¢«ä¸å½“修改ã€ä»Žè€Œè®©éžæ³•å¿«ç…§ä¹Ÿèƒ½å¤Ÿè¢«åŠ è½½ã€‚因此,将关闭节点并åœæ­¢ä½¿ç”¨ä»Žè¿™ä¸ªå¿«ç…§æž„建出的任何状æ€ï¼Œå¹¶å°†é“¾é«˜åº¦ä»Ž %d é‡ç½®åˆ° %d 。下次å¯åŠ¨æ—¶ï¼ŒèŠ‚点将会ä¸ä½¿ç”¨å¿«ç…§æ•°æ®ä»Ž %d 继续åŒæ­¥ã€‚请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状æ€å¿«ç…§ä»è¢«ä¿å­˜è‡³ç£ç›˜ä¸Šï¼Œä»¥ä¾›è¯Šæ–­é—®é¢˜çš„原因。</translation>
</message>
@@ -3987,7 +3928,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <translation type="unfinished">無法在資料目錄上ç²å–鎖定%s。%så¯èƒ½å·²ç¶“在é‹è¡Œäº†ã€‚</translation>
</message>
<message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
@@ -4015,7 +3956,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ <translation type="unfinished">
+錯誤:轉存檔案識別記錄ä¸æ­£ç¢ºã€‚ç²å¾—%s,é æœŸ
+%s。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
@@ -4054,10 +3997,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">没有æ供钱包格å¼ã€‚è¦ä½¿ç”¨ createfromdump ,必须æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">请检查电脑的日期时间设置是å¦æ­£ç¡®ï¼æ—¶é—´é”™è¯¯å¯èƒ½ä¼šå¯¼è‡´ %s è¿è¡Œå¼‚常。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你认为%s对你比较有用的è¯ï¼Œè¯·å¯¹æˆ‘们进行一些自愿贡献。请访问%s网站æ¥èŽ·å–有关这个软件的更多信æ¯ã€‚</translation>
</message>
@@ -4166,10 +4105,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">åƒæ•¸ -maxmempool 至少è¦çµ¦ %d 百è¬ä½å…ƒçµ„(MB)</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">å‘生了致命的内部错误,请在debug.log中查看详情</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ²’è¾¦æ³•è§£æž -%s åƒæ•¸æŒ‡å®šçš„地å€: '%s'</translation>
</message>
@@ -4304,6 +4239,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4321,7 +4260,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">找ä¸åˆ°asmap文件%s</translation>
+ <translation type="unfinished">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4412,14 +4351,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: %s 所在的ç£ç›˜ç©ºé—´ä½Žã€‚</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">錯誤:轉存檔案的校驗和ä¸åŒ¹é…。%s計算得%s</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—çš„éµä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—的值ä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">錯誤:keypool已用完,請先é‡æ–°å‘¼å«keypoolrefill</translation>
</message>
<message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">錯誤:缺少校驗和</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">錯誤: 沒有å¯ç”¨çš„ %s 地å€</translation>
+ </message>
+ <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4472,6 +4431,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4480,6 +4443,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4504,6 +4475,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">dbcacheä¸è¶³ä»¥ç”¨äºŽåŒºå—验è¯</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">金é¢ä¸è¶³</translation>
+ </message>
+ <message>
<source>Invalid -i2psam address or hostname: '%s'</source>
<translation type="unfinished">无效的 -i2psam 地å€æˆ–主机å: '%s'</translation>
</message>
@@ -4672,10 +4647,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易ä½å…ƒé‡å¤ªå¤§</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts
index e817e0b40e..1f5c6d9610 100644
--- a/src/qt/locale/bitcoin_cs.ts
+++ b/src/qt/locale/bitcoin_cs.ts
@@ -171,6 +171,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Zadej staré a nové heslo k peněžence.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">PokraÄovat</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Pamatujte, že zaÅ¡ifrování peněženky nemůže plnÄ› ochránit vaÅ¡e bitcoiny pÅ™ed krádeží, pokud by byl váš poÄítaÄ napadem malwarem.</translation>
</message>
@@ -396,7 +400,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n let</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">výchozí peněženka</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -597,7 +605,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">
<numerusform>Zpracován %n blok transakÄní historie.</numerusform>
<numerusform>Zpracovány %n bloky transakÄní historie.</numerusform>
- <numerusform>Zpracováno %n bloků transakÄní historie.</numerusform>
+ <numerusform>Zpracováno %n bloků transakÄní historie</numerusform>
</translation>
</message>
<message>
@@ -703,10 +711,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Skrýt Äástky v pÅ™ehledu</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">výchozí peněženka</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nejsou dostupné žádné peněženky</translation>
</message>
@@ -1059,10 +1063,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Varování otevření peněženky</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">výchozí peněženka</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otevřít peněženku</translation>
@@ -2531,6 +2531,10 @@ Pokud vidíte tuto chybu, měli byste požádat, aby obchodník poskytl adresu k
<translation type="unfinished">Síť je vypnutá</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Žádné</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Spouštění příkazu bez jakékoliv peněženky</translation>
</message>
@@ -2539,6 +2543,23 @@ Pokud vidíte tuto chybu, měli byste požádat, aby obchodník poskytl adresu k
<translation type="unfinished">Příkaz se vykonává s použitím peněženky "%1"</translation>
</message>
<message>
+ <source>Welcome to the %1 RPC console.
+Use up and down arrows to navigate history, and %2 to clear screen.
+Use %3 and %4 to increase or decrease the font size.
+Type %5 for an overview of available commands.
+For more information on using this console, type %6.
+
+%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
+ <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
+ <translation type="unfinished">Vítejte v konzole %1 RPC.
+ Použijte šipky nahoru a dolů k procházení historie a %2 k vymazání obrazovky.
+ Použijte %3 a %4 ke zvětšení nebo zmenšení velikosti písma.
+ Pro přehled dostupných příkazů zadejte %5.
+ Další informace o používání této konzoly získáte zadáním %6
+
+ %7VAROVÃNÃ: Podvodníci byli aktivní a říkali uživatelům, aby sem zadávali příkazy, a kradli jim obsah peněženky. Nepoužívejte tuto konzolu, aniž byste plnÄ› porozumÄ›li důsledkům příkazu.%8</translation>
+ </message>
+ <message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished">Provádím...</translation>
@@ -3225,10 +3246,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">&amp;Podepiš zprávu</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Podepsáním zprávy/smlouvy svými adresami můžeÅ¡ prokázat, že jsi na nÄ› schopen pÅ™ijmout bitcoiny. BuÄ opatrný a nepodepisuj nic vágního nebo náhodného; například pÅ™i phishingových útocích můžeÅ¡ být lákán, abys nÄ›co takového podepsal. Podepisuj pouze naprosto úplná a detailní prohlášení, se kterými souhlasíš.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoinová adresa, kterou se zpráva podepíše</translation>
</message>
@@ -3313,10 +3330,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Zkontroluj ji prosím a zkus to pak znovu.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Zadaná adresa nepasuje ke klíÄi.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">OdemÄení peněženky bylo zruÅ¡eno.</translation>
</message>
@@ -3871,11 +3884,6 @@ PÅ™ejdÄ›te do Soubor &gt; Otevřít peněženku pro naÄtení peněženky.
<translation type="unfinished">PSBT zkopírována</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Zkopírováno do schránky</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Nemůžu podepsat transakci.</translation>
</message>
@@ -3887,10 +3895,6 @@ PÅ™ejdÄ›te do Soubor &gt; Otevřít peněženku pro naÄtení peněženky.
<source>Can't display address</source>
<translation type="unfinished">Nemohu zobrazit adresu</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">výchozí peněženka</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4016,10 +4020,6 @@ Ověřuji peněženku.</translation>
<translation type="unfinished">Nebyl poskytnut formát souboru peněženky. Pro použití createfromdump, -format=&lt;format&gt; musí být poskytnut.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Zkontroluj, že máš v poÄítaÄi správnÄ› nastavený datum a Äas! Pokud jsou nastaveny Å¡patnÄ›, %s nebude fungovat správnÄ›.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Prosíme, zapoj se nebo pÅ™ispÄ›j, pokud ti %s pÅ™ijde užiteÄný. Více informací o programu je na %s.</translation>
</message>
@@ -4116,10 +4116,6 @@ Ověřuji peněženku.</translation>
<translation type="unfinished">-maxmempool musí být alespoň %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Nastala závažná vnitřní chyba, podrobnosti viz v debug.log.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Nemohu přeložit -%s adresu: '%s'</translation>
</message>
@@ -4149,9 +4145,7 @@ Ověřuji peněženku.</translation>
</message>
<message>
<source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
- <translation type="unfinished">Nastala chyba pÅ™i Ätení souboru %s! VÅ¡echny klíÄe se pÅ™eÄetly správnÄ›, ale data o transakcích nebo záznamy v adresáři moho
-u chybÄ›t Äi být nesprávné.
-</translation>
+ <translation type="unfinished">Nastala chyba pÅ™i Ätení souboru %s! VÅ¡echny klíÄe se pÅ™eÄetly správnÄ›, ale data o transakcích nebo záznamy v adresáři mohou chybÄ›t Äi být nesprávné.</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
@@ -4668,10 +4662,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Transakce je příliš velká</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Není možné alokovat paměť pro -maxsigcachesize '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Nedaří se mi pÅ™ipojit na %s na tomhle poÄítaÄi (operace bind vrátila chybu %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts
index f3b153d3f7..78ce4e7155 100644
--- a/src/qt/locale/bitcoin_da.ts
+++ b/src/qt/locale/bitcoin_da.ts
@@ -175,6 +175,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Indtast den gamle adgangskode og en ny adgangskode til tegnebogen.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Forsæt</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Husk, at kryptere din tegnebog vil ikke fuldt ud beskytte dine bitcoins mod at blive stjålet af malware på din computer.</translation>
</message>
@@ -382,7 +386,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n år</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard tegnebog</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -680,10 +688,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Maskér værdierne i Oversigt-fanebladet</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard tegnebog</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ingen tegnebøger tilgængelige</translation>
</message>
@@ -1007,10 +1011,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Advarsel for åbning af tegnebog</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard tegnebog</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ã…ben Tegnebog</translation>
@@ -2362,6 +2362,10 @@ Hvis du modtager denne fejl, skal du anmode forhandleren om en BIP21-kompatibel
<translation type="unfinished">Netværksaktivitet deaktiveret</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ingen</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Udfører kommando uden en tegnebog</translation>
</message>
@@ -2802,6 +2806,10 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">L&amp;av usigneret</translation>
</message>
<message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">Laver en delvist signeret bitcointransaktion (forkortet PSBT) som kan bruges med f.eks. en offline %1 tegnebog. De kan også bruges med PSBT-kompatible hardwaretegnebøger.</translation>
+ </message>
+ <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 til '%2'</translation>
</message>
@@ -2924,8 +2932,8 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Anslået at begynde bekræftelse inden for %n blok(e).</numerusform>
- <numerusform>Anslået at begynde bekræftelse inden for %n blok(e).</numerusform>
+ <numerusform>Anslået at begynde bekræftelse inden for %n blok.</numerusform>
+ <numerusform>Anslået at begynde bekræftelse inden for %n blokke.</numerusform>
</translation>
</message>
<message>
@@ -3030,10 +3038,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">&amp;Singér besked</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Du kan signere beskeder/aftaler med dine adresser for at bevise, at du kan modtage bitcoin, der bliver sendt til adresserne. Vær forsigtig med ikke at signere noget vagt eller tilfældigt, da eventuelle phishing-angreb kan snyde dig til at overlade din identitet til dem. Signér kun fuldt ud detaljerede udsagn, som du er enig i.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-adresse, som beskeden skal signeres med</translation>
</message>
@@ -3118,10 +3122,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">Tjek venligst adressen og forsøg igen.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Den indtastede adresse henviser ikke til en nøgle.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Tegnebogsoplåsning annulleret.</translation>
</message>
@@ -3238,8 +3238,8 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>modnes i yderligere %n blok(e)</numerusform>
- <numerusform>modnes i yderligere %n blok(e)</numerusform>
+ <numerusform>modnes i yderligere %n blok</numerusform>
+ <numerusform>modnes i yderligere %n blokke</numerusform>
</translation>
</message>
<message>
@@ -3672,10 +3672,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<source>Can't display address</source>
<translation type="unfinished">Adressen kan ikke vises</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Standard tegnebog</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3788,10 +3784,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Der er ikke angivet noget tegnebogsfilformat. For at bruge createfromdump skal -format=&lt;format&gt; angives.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Undersøg venligst at din computers dato og klokkeslet er korrekt indstillet! Hvis der er fejl i disse, vil %s ikke fungere korrekt.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Overvej venligst at bidrage til udviklingen, hvis du finder %s brugbar. Besøg %s for yderligere information om softwaren.</translation>
</message>
@@ -3876,10 +3868,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">-maxmempool skal være mindst %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Der er sket en fatal intern fejl, se debug.log for detaljer</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Kan ikke finde -%s-adressen: “%sâ€</translation>
</message>
@@ -4117,8 +4105,7 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
</message>
<message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">Lytning efter indkommende forbindelser mislykkedes (lytning resultarede i fejl %s)
-</translation>
+ <translation type="unfinished">Lytning efter indkommende forbindelser mislykkedes (lytning resultarede i fejl %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts
index 8a73df2627..807a1c64ee 100644
--- a/src/qt/locale/bitcoin_de.ts
+++ b/src/qt/locale/bitcoin_de.ts
@@ -184,6 +184,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Geben Sie die alte und die neue Wallet-Passphrase ein.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Weiter</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Zurück</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Beachten Sie, dass das Verschlüsseln Ihrer Wallet nicht komplett vor Diebstahl Ihrer Bitcoins durch Malware schützt, die Ihren Computer infiziert hat.</translation>
</message>
@@ -291,6 +299,10 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Ein schwerwiegender Fehler ist aufgetreten. Überprüfen Sie, ob die Einstellungsdatei beschreibbar ist, oder versuchen Sie, mit -nosettings zu starten.</translation>
</message>
<message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Fehler: %1</translation>
+ </message>
+ <message>
<source>%1 didn't yet exit safely…</source>
<translation type="unfinished">%1 noch nicht sicher beendet…</translation>
</message>
@@ -423,7 +435,11 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<numerusform>%n Jahre</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard-Wallet</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -501,7 +517,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Die Passphrase ändern, die für die Wallet-Verschlüsselung benutzt wird</translation>
+ <translation type="unfinished">Ändert die Passphrase, die für die Wallet-Verschlüsselung benutzt wird</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -521,7 +537,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Die zu Ihrer Wallet gehörenden privaten Schlüssel verschlüsseln</translation>
+ <translation type="unfinished">Verschlüsselt die zu Ihrer Wallet gehörenden privaten Schlüssel</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -533,7 +549,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">&amp;Nachricht signieren</translation>
+ <translation type="unfinished">&amp;Nachricht unterzeichnen…</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
@@ -557,11 +573,11 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Wallet schließen</translation>
+ <translation type="unfinished">Schließe Wallet…</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Wallet erstellen…</translation>
+ <translation type="unfinished">Erstelle Wallet…</translation>
</message>
<message>
<source>Close All Wallets…</source>
@@ -585,7 +601,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisiere Header (%1%)…</translation>
+ <translation type="unfinished">Synchronisiere Headers (%1%)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -601,126 +617,16 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Verbinde mit Gegenstellen...</translation>
- </message>
- <message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Zahlungen anfordern (erzeugt QR-Codes und bitcoin: URIs)</translation>
- </message>
- <message>
- <source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Liste verwendeter Zahlungsadressen und Bezeichnungen anzeigen</translation>
- </message>
- <message>
- <source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Liste verwendeter Empfangsadressen und Bezeichnungen anzeigen</translation>
- </message>
- <message>
- <source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Kommandozeilenoptionen</translation>
+ <translation type="unfinished">Verbindung zu Peers wird hergestellt…</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform> %n Block der Transaktionshistorie verarbeitet.</numerusform>
- <numerusform> %n Blöcke der Transaktionshistorie verarbeitet.</numerusform>
+ <numerusform>%n Block der Transaktionshistorie prozessiert.</numerusform>
+ <numerusform>%n Block/Blöcke der Transaktionshistorie prozessiert.</numerusform>
</translation>
</message>
<message>
- <source>%1 behind</source>
- <translation type="unfinished">%1 im Rückstand</translation>
- </message>
- <message>
- <source>Catching up…</source>
- <translation type="unfinished">Hole auf…</translation>
- </message>
- <message>
- <source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Zuletzt empfangener Block wurde generiert vor %1 .</translation>
- </message>
- <message>
- <source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Transaktionen hiernach werden noch nicht angezeigt.</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Fehler</translation>
- </message>
- <message>
- <source>Warning</source>
- <translation type="unfinished">Warnung</translation>
- </message>
- <message>
- <source>Information</source>
- <translation type="unfinished">Informationen</translation>
- </message>
- <message>
- <source>Up to date</source>
- <translation type="unfinished">Auf aktuellem Stand</translation>
- </message>
- <message>
- <source>Ctrl+Q</source>
- <translation type="unfinished">STRG+B</translation>
- </message>
- <message>
- <source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Lade teilsignierte Bitcoin-Transaktion</translation>
- </message>
- <message>
- <source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Lade PSBT aus Zwischenablage…</translation>
- </message>
- <message>
- <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Lade teilsignierte Bitcoin-Transaktion aus Zwischenablage</translation>
- </message>
- <message>
- <source>Node window</source>
- <translation type="unfinished">Node-Fenster</translation>
- </message>
- <message>
- <source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Öffne Node-Konsole für Fehlersuche und Diagnose</translation>
- </message>
- <message>
- <source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Versandadressen</translation>
- </message>
- <message>
- <source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Empfangsadressen</translation>
- </message>
- <message>
- <source>Open a bitcoin: URI</source>
- <translation type="unfinished">Öffne bitcoin: URI</translation>
- </message>
- <message>
- <source>Open Wallet</source>
- <translation type="unfinished">Wallet öffnen</translation>
- </message>
- <message>
- <source>Open a wallet</source>
- <translation type="unfinished">Eine Wallet öffnen</translation>
- </message>
- <message>
- <source>Close wallet</source>
- <translation type="unfinished">Wallet schließen</translation>
- </message>
- <message>
- <source>Restore Wallet…</source>
- <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">Wallet wiederherstellen...</translation>
- </message>
- <message>
- <source>Restore a wallet from a backup file</source>
- <extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">Wiederherstellen einer Wallet aus einer Sicherungsdatei</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">Schließe alle Wallets</translation>
- </message>
- <message>
<source>Migrate Wallet</source>
<translation type="unfinished">Wallet migrieren</translation>
</message>
@@ -741,10 +647,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Blende die Werte im Ãœbersichtsreiter aus</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Keine Wallets verfügbar</translation>
</message>
@@ -800,8 +702,8 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
- <numerusform>%n aktive Verbindung(en) zum Bitcoin-Netzwerk</numerusform>
+ <numerusform>%n aktive Verbindung zum Bitcoin-Netzwerk</numerusform>
+ <numerusform>%n aktive Verbindungen zum Bitcoin-Netzwerk</numerusform>
</translation>
</message>
<message>
@@ -812,7 +714,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<message>
<source>Show Peers tab</source>
<extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">Gegenstellen Reiter anzeigen</translation>
+ <translation type="unfinished">Reiter mit Peers anzeigen</translation>
</message>
<message>
<source>Disable network activity</source>
@@ -826,7 +728,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisiere Header vorab (%1%)…</translation>
+ <translation type="unfinished">Synchronisiere Header (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -1149,10 +1051,6 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Wallet öffnen Warnung</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Wallet öffnen</translation>
@@ -1526,7 +1424,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</message>
<message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
- <translation type="unfinished">%1 synchronisiert gerade. Es lädt Header und Blöcke von Gegenstellen und validiert sie bis zum Erreichen der Spitze der Blockchain.</translation>
+ <translation type="unfinished">%1 synchronisiert gerade. Es lädt Header und Blöcke von Peers und validiert sie bis zum Erreichen der Spitze der Blockchain.</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
@@ -1745,7 +1643,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</message>
<message>
<source>Used for reaching peers via:</source>
- <translation type="unfinished">Benutzt um Gegenstellen zu erreichen über:</translation>
+ <translation type="unfinished">Benutzt um Peers zu erreichen über:</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -1809,7 +1707,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</message>
<message>
<source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
- <translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
+ <translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Peers über Tor-Onion-Dienste zu erreichen:</translation>
</message>
<message>
<source>&amp;Cancel</source>
@@ -2148,11 +2046,6 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">User-Agent</translation>
</message>
<message>
- <source>Peer</source>
- <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
- <translation type="unfinished">Gegenstelle</translation>
- </message>
- <message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
<translation type="unfinished">Alter</translation>
@@ -2277,6 +2170,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Anzahl der Verbindungen</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Lokale Adressen</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Netzwerk-Adressen, die dein Bitcoin-Node aktuell verwendet, um mit anderen Nodes zu kommunizieren.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Blockchain</translation>
</message>
@@ -2309,28 +2210,28 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Gesendet</translation>
</message>
<message>
- <source>&amp;Peers</source>
- <translation type="unfinished">&amp;Gegenstellen</translation>
- </message>
- <message>
<source>Banned peers</source>
- <translation type="unfinished">Gesperrte Gegenstellen</translation>
+ <translation type="unfinished">Gesperrte Peers</translation>
</message>
<message>
<source>Select a peer to view detailed information.</source>
- <translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
+ <translation type="unfinished">Peers auswählen, um detaillierte Informationen zu erhalten.</translation>
</message>
<message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">Die Transportschicht-Version: %1</translation>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Reiter mit Peers verstecken</translation>
+ </message>
+ <message>
+ <source>Ctrl+X</source>
+ <translation type="unfinished">Strg+X</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form, falls vorhanden.</translation>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Die Transportschicht-Version: %1</translation>
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
+ <translation type="unfinished">Ob wir Adressen an diesen Peer weiterleiten.</translation>
</message>
<message>
<source>Transaction Relay</source>
@@ -2354,7 +2255,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</message>
<message>
<source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">Das zugeordnete autonome System zur Diversifizierung der Gegenstellen-Auswahl.</translation>
+ <translation type="unfinished">Das zugeordnete autonome System zur Diversifizierung der Peer-Auswahl.</translation>
</message>
<message>
<source>Mapped AS</source>
@@ -2363,7 +2264,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<message>
<source>Whether we relay addresses to this peer.</source>
<extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
+ <translation type="unfinished">Ob wir Adressen an diesen Peer weiterleiten.</translation>
</message>
<message>
<source>Address Relay</source>
@@ -2373,12 +2274,12 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<message>
<source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
<extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">Die Gesamtzahl der von dieser Gegenstelle empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
+ <translation type="unfinished">Die Gesamtzahl der von diesem Peer empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Die Gesamtzahl der von dieser Gegenstelle empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
+ <translation type="unfinished">Die Gesamtzahl der von diesem Peer empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -2395,10 +2296,6 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">User-Agent</translation>
</message>
<message>
- <source>Node window</source>
- <translation type="unfinished">Node-Fenster</translation>
- </message>
- <message>
<source>Current block height</source>
<translation type="unfinished">Aktuelle Blockhöhe</translation>
</message>
@@ -2420,15 +2317,19 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</message>
<message>
<source>The direction and type of peer connection: %1</source>
- <translation type="unfinished">Die Richtung und der Typ der Gegenstellen-Verbindung: %1</translation>
+ <translation type="unfinished">Die Richtung und der Typ der Peer-Verbindung: %1</translation>
</message>
<message>
<source>Direction/Type</source>
<translation type="unfinished">Richtung/Typ</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">Das Netzwerkprotokoll, über das diese Gegenstelle verbunden ist, ist: IPv4, IPv6, Onion, I2P oder CJDNS.</translation>
+ <translation type="unfinished">Das Netzwerkprotokoll, über das dieser Peer verbunden ist, ist: IPv4, IPv6, Onion, I2P oder CJDNS.</translation>
</message>
<message>
<source>Services</source>
@@ -2448,7 +2349,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</message>
<message>
<source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
- <translation type="unfinished">Abgelaufene Zeit seitdem ein neuer Block mit erfolgreichen initialen Gültigkeitsprüfungen von dieser Gegenstelle empfangen wurde.</translation>
+ <translation type="unfinished">Verstrichene Zeit, seit ein neuer Block, der initiale Validierungsprüfungen bestanden hat, von diesem Peer empfangen wurde.</translation>
</message>
<message>
<source>Last Block</source>
@@ -2457,7 +2358,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<message>
<source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
<extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">Abgelaufene Zeit seit eine neue Transaktion, die in unseren Speicherpool hineingelassen wurde, von dieser Gegenstelle empfangen wurde.</translation>
+ <translation type="unfinished">Verstrichene Zeit, seit eine neue Transaktion, die in unseren Mempool aufgenommen wurde, von diesem Peer empfangen wurde.</translation>
</message>
<message>
<source>Last Send</source>
@@ -2526,7 +2427,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<message>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">Eingehend: wurde von Gegenstelle initiiert</translation>
+ <translation type="unfinished">Eingehend: wurde vom Peer initiiert</translation>
</message>
<message>
<source>Outbound Full Relay: default</source>
@@ -2556,7 +2457,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<message>
<source>detecting: peer could be v1 or v2</source>
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
- <translation type="unfinished">Erkennen: Peer könnte v1 oder v2 sein</translation>
+ <translation type="unfinished">Erkenne: Peer könnte v1 oder v2 sein</translation>
</message>
<message>
<source>v1: unencrypted, plaintext transport protocol</source>
@@ -2570,11 +2471,11 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</message>
<message>
<source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">Wir haben die Gegenstelle zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
+ <translation type="unfinished">Wir haben den Peer zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
</message>
<message>
<source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">Die Gegenstelle hat uns zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
+ <translation type="unfinished">Der Peer hat uns zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
</message>
<message>
<source>no high bandwidth relay selected</source>
@@ -2639,6 +2540,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Netzwerkaktivität deaktiviert</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Keine</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Befehl wird ohne spezifizierte Wallet ausgeführt</translation>
</message>
@@ -2690,7 +2595,7 @@ Für weitere Informationen über diese Konsole, tippe %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(Gegenstelle: %1)</translation>
+ <translation type="unfinished">(Peer: %1)</translation>
</message>
<message>
<source>via %1</source>
@@ -3369,8 +3274,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Nachricht &amp;signieren</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Sie können Nachrichten/Vereinbarungen mit Hilfe Ihrer Adressen signieren, um zu beweisen, dass Sie Bitcoins empfangen können, die an diese Adressen überwiesen werden. Seien Sie vorsichtig und signieren Sie nichts Vages oder Willkürliches, um Ihre Indentität vor Phishingangriffen zu schützen. Signieren Sie nur vollständig-detaillierte Aussagen, mit denen Sie auch einverstanden sind.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Du kannst Nachrichten/Vereinbarungen mit Deinen Legacy-(P2PKH)-Adressen unterzeichnen, um zu beweisen, dass Du Bitcoins empfangen kannst, die an sie gesendet werden. Achte darauf, nichts Vages oder Zufälliges zu signieren, da Phishing-Angriffe versuchen könnten, Dich dazu zu verleiten, Deine Identität zu unterschreiben. Unterschreibe nur ausführliche Erklärungen, denen Du zustimmst.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3457,8 +3362,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Bitte überprüfen Sie die Adresse und versuchen Sie es erneut.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Die eingegebene Adresse verweist nicht auf einen Schlüssel.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">Die eingegebene Adresse bezieht sich nicht auf einen Legacy-Schlüssel (P2PKH). Die Nachrichtensignierung für SegWit und andere Adresstypen, die nicht zu P2PKH gehören, wird in dieser Version von %1 nicht unterstützt. Bitte überprüfe die Adresse und versuche es erneut.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -4026,9 +3931,8 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">PSBT kopiert</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">In die Zwischenablage kopiert </translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Fee-Bump PSBT in die Zwischenablage kopiert</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4039,12 +3943,12 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Konnte Transaktion nicht übergeben</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Die Adresse kann nicht angezeigt werden</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Fehler beim Signieren</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Die Adresse kann nicht angezeigt werden</translation>
</message>
</context>
<context>
@@ -4103,7 +4007,7 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
</message>
<message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Bitcoin Core Gegenstellen mit ihm verbinden. Siehe doc/p2p-bad-ports.md für Details und eine vollständige Liste.</translation>
+ <translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Peers mit ihm verbinden. Siehe doc/p2p-bad-ports.md für Details und eine vollständige Liste.</translation>
</message>
<message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
@@ -4178,10 +4082,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Kein Format der Wallet-Datei angegeben. Um createfromdump zu nutzen, muss -format=&lt;format&gt; angegeben werden.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da %s ansonsten nicht ordnungsgemäß funktionieren wird.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Wenn sie %s nützlich finden, sind Helfer sehr gern gesehen. Besuchen Sie %s um mehr über das Softwareprojekt zu erfahren.</translation>
</message>
@@ -4272,7 +4172,7 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
</message>
<message>
<source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation type="unfinished">Warnung: Wir scheinen nicht vollständig mit unseren Gegenstellen übereinzustimmen! Sie oder die anderen Knoten müssen unter Umständen Ihre Client-Software aktualisieren.</translation>
+ <translation type="unfinished">Warnung: Wir scheinen nicht vollständig mit unseren Peers übereinzustimmen! Sie oder die anderen Knoten müssen unter Umständen Ihre Client-Software aktualisieren.</translation>
</message>
<message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
@@ -4287,10 +4187,6 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">-maxmempool muss mindestens %d MB betragen</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ein fataler interner Fehler ist aufgetreten, siehe debug.log für Details</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Kann Adresse in -%s nicht auflösen: '%s'</translation>
</message>
@@ -4339,6 +4235,12 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Es war nicht möglich, die Bump-Gebühren zu berechnen, da unbestätigte UTXOs von einem enormen Cluster unbestätigter Transaktionen abhängen.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Fehler beim Entfernen des Snapshot-Chainstate-Verzeichnisses (%s). Entferne es manuell, bevor dem Neustart.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Kann ungültige Datei peers.dat nicht umbenennen. Bitte Verschieben oder Löschen und noch einmal versuchen.</translation>
</message>
@@ -4347,6 +4249,14 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Gebührenschätzung fehlgeschlagen. Fallbackgebühr ist deaktiviert. Warten Sie ein paar Blöcke oder aktivieren Sie %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Fehler beim Leeren der Blockdatei auf die Festplatte. Dies ist wahrscheinlich das Ergebnis eines E/A-Fehlers.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Fehler beim Leeren der Undo-Datei auf den Datenträger. Dies ist wahrscheinlich das Ergebnis eines E/A-Fehlers.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Inkompatible Optionen: -dnsseed=1 wurde explizit angegeben, aber -onlynet verbietet Verbindungen zu IPv4/IPv6</translation>
</message>
@@ -4355,6 +4265,14 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Ungültiger Betrag für %s=&lt;amount&gt;: '%s' (muss mindestens die MinRelay-Gebühr von %s betragen, um festhängende Transaktionen zu verhindern)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Das maximale Transaktionsgewicht ist kleiner als das Transaktionsgewicht ohne Inputs</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Das maximale Transaktionsgewicht ist zu niedrig und kann den Change-Output nicht aufnehmen</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Ausgehende Verbindungen sind auf CJDNS beschränkt (-onlynet=cjdns), aber -cjdnsreachable ist nicht angegeben</translation>
</message>
@@ -4371,6 +4289,14 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Ausgehende Verbindungen sind auf i2p (-onlynet=i2p) beschränkt, aber -i2psam ist nicht angegeben</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Die Umbenennung von '%s' -&gt; '%s' ist fehlgeschlagen. Das Hintergrund-Verzeichnis chainstate leveldb kann nicht bereinigt werden.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Die Kombination aus den vorausgewählten Inputs und der automatischen Auswahl der Wallet-Inputs überschreitet das maximale Transaktionsgewicht. Bitte versuche, einen kleineren Betrag zu senden oder die UTXOs der Wallet manuell zu konsolidieren.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">Die Größe der Inputs übersteigt das maximale Gewicht. Bitte versuchen Sie, einen kleineren Betrag zu senden oder die UTXOs Ihrer Wallet manuell zu konsolidieren.</translation>
</message>
@@ -4413,6 +4339,10 @@ Bitte mit der neuesten Softwareversion versuchen.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">Das Datum und die Uhrzeit des Computers scheinen mehr als %d Minuten nicht mit dem Netzwerk synchronisiert zu sein, was zu einem Konsensus-Fehler führen kann. Nachdem die Uhr des Computers überprüft wurde und der Node neu gestatet wurde, sollte diese Meldung nicht mehr angezeigt werden. Ohne Neustart sollte es nicht mehr automatisch angezeigt werden, nachdem eine Verbindung mit einer ausreichenden Anzahl neuer ausgehender Peers hergestellt wurde, was einige Zeit dauern kann. Das Feld 'timeoffset' der RPC-Methoden 'getpeerinfo' und 'getnetworkinfo' kann überprüft werden, um weitere Informationen zu erhalten.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4425,6 +4355,18 @@ Unable to restore backup of wallet.</source>
Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind darf nur für eingehende Verbindungen verwendet werden ("out" wurde übergeben)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Es ist ein schwerwiegender interner Fehler aufgetreten, siehe debug.log für Details:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Für den angegebenen Blockhash '%s' wurden keine Assumeutxo-Daten gefunden.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Blocküberprüfung wurde unterbrochen</translation>
</message>
@@ -4433,6 +4375,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Konfigurationseinstellungen für %s sind nur auf %s network gültig, wenn in Sektion [%s]</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Beschädigter Block gefunden, was auf einen möglichen Hardwarefehler hinweist.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Beschädigte Blockdatenbank erkannt</translation>
</message>
@@ -4461,6 +4407,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fehler bei der Plausibilitätsprüfung der Elliptischen Kurvenkryptografie. %s wird heruntergefahren.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Fehler beim Bestätigen der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
</message>
@@ -4610,10 +4560,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Verbindung zum besten Block (%s) konnte nicht hergestellt werden.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Block konnte nicht getrennt werden.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fehler: Konnte auf keinem Port hören. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Block konnte nicht gelesen werden.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Fehler: Wallet konnte während der Initialisierung nicht erneut gescannt werden.</translation>
</message>
@@ -4626,6 +4588,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Block konnte nicht geschrieben werden.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Schreiben in die Blockindex-Datenbank fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Schreiben in die Coin-Datenbank fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Das Schreiben der Undo-Daten ist fehlgeschlagen.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
</message>
@@ -4722,6 +4700,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Lade Wallet...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Das maximale Transaktionsgewicht muss zwischen %d und %d liegen.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Fehlender Betrag</translation>
</message>
@@ -4750,6 +4732,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Nicht auflösbare vorausgewählter Input %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Nur Richtung wurde festgelegt, keine Genehmigungen: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Kürzungsmodus kann nicht mit einem negativen Wert konfiguriert werden.</translation>
</message>
@@ -4795,6 +4781,18 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Sektion [%s] ist nicht delegiert.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Der Signierer hat die Adresse nicht wiederholt</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Unterzeichner wiederholte unerwartete Adresse %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Der Signierer hat einen Fehler zurückgegeben: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Signierung der Transaktion fehlgeschlagen</translation>
</message>
@@ -4823,6 +4821,18 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Starte Netzwerk-Threads...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Systemfehler beim Leeren: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Systemfehler beim Laden der externen Blockdatei: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Systemfehler beim Speichern des Blocks auf der Festplatte: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Der Quellcode ist auf %s verfügbar.</translation>
</message>
@@ -4839,6 +4849,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Das Wallet verhindert Zahlungen, die die Mindesttransaktionsgebühr nicht berücksichtigen.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Für diese Adresse gibt es keinen ScriptPubKeyManager</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Dies ist experimentelle Software.</translation>
</message>
@@ -4879,10 +4893,6 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Transaktion zu groß</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Speicher kann für -maxsigcachesize: '%s' MiB nicht zugewiesen werden:</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Kann auf diesem Computer nicht an %s binden (bind meldete Fehler %s)</translation>
</message>
@@ -4943,6 +4953,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Unbekannte neue Regeln aktiviert (Versionsbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Nicht erkannte Option "%s" in -test=&lt;option&gt; angegeben.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Nicht unterstützte globale Protokollierungsebene %s=%s. Gültige Werte: %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de_AT.ts b/src/qt/locale/bitcoin_de_AT.ts
index 72ec23d469..1c597c6866 100644
--- a/src/qt/locale/bitcoin_de_AT.ts
+++ b/src/qt/locale/bitcoin_de_AT.ts
@@ -1,749 +1,70 @@
<TS version="2.1" language="de_AT">
<context>
- <name>AddressBookPage</name>
- <message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Rechtsklick zum Bearbeiten der Adresse oder der Beschreibung</translation>
- </message>
- <message>
- <source>Create a new address</source>
- <translation type="unfinished">Neue Adresse erstellen</translation>
- </message>
- <message>
- <source>&amp;New</source>
- <translation type="unfinished">&amp;Neu</translation>
- </message>
- <message>
- <source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Ausgewählte Adresse in die Zwischenablage kopieren</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation type="unfinished">&amp;Kopieren</translation>
- </message>
- <message>
- <source>C&amp;lose</source>
- <translation type="unfinished">&amp;Schließen</translation>
- </message>
- <message>
- <source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Ausgewählte Adresse aus der Liste entfernen</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation type="unfinished">Zu suchende Adresse oder Bezeichnung eingeben</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Daten der aktuellen Ansicht in eine Datei exportieren</translation>
- </message>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">&amp;Exportieren</translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation type="unfinished">&amp;Löschen</translation>
- </message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished">Wählen Sie die Adresse aus, an die Sie Bitcoins senden möchten</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">Wählen Sie die Adresse aus, mit der Sie Bitcoins empfangen wollen</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation type="unfinished">&amp;Auswählen</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Dies sind Ihre Bitcoin-Adressen zum Tätigen von Überweisungen. Bitte prüfen Sie den Betrag und die Adresse des Empfängers, bevor Sie Bitcoins überweisen.</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
-Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">Dies sind Ihre Bitcoin-Adressen für den Empfang von Zahlungen. Verwenden Sie die 'Neue Empfangsadresse erstellen' Taste auf der Registerkarte "Empfangen", um neue Adressen zu erstellen.
-Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
- </message>
- <message>
- <source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;Adresse kopieren</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation type="unfinished">&amp;Bezeichnung kopieren</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation type="unfinished">&amp;Bearbeiten</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation type="unfinished">Adressliste exportieren</translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Durch Komma getrennte Datei</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">Beim Speichern der Adressliste nach %1 ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.</translation>
- </message>
- <message>
- <source>Sending addresses - %1</source>
- <translation type="unfinished">Sendeadressen - %1</translation>
- </message>
- <message>
- <source>Receiving addresses - %1</source>
- <translation type="unfinished">Empfangsadressen - %1</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation type="unfinished">Exportieren fehlgeschlagen</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation type="unfinished">Bezeichnung</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(keine Bezeichnung)</translation>
- </message>
-</context>
-<context>
- <name>AskPassphraseDialog</name>
- <message>
- <source>Passphrase Dialog</source>
- <translation type="unfinished">Passphrasendialog</translation>
- </message>
- <message>
- <source>Enter passphrase</source>
- <translation type="unfinished">Passphrase eingeben</translation>
- </message>
- <message>
- <source>New passphrase</source>
- <translation type="unfinished">Neue Passphrase</translation>
- </message>
- <message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">Neue Passphrase bestätigen</translation>
- </message>
- <message>
- <source>Show passphrase</source>
- <translation type="unfinished">Zeige Passphrase</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation type="unfinished">Wallet verschlüsseln</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Dieser Vorgang benötigt Ihre Passphrase, um die Wallet zu entsperren.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation type="unfinished">Wallet entsperren</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation type="unfinished">Passphrase ändern</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation type="unfinished">Wallet-Verschlüsselung bestätigen</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Warnung: Wenn Sie Ihre Wallet verschlüsseln und Ihre Passphrase verlieren, werden Sie &lt;b&gt;ALLE IHRE BITCOINS VERLIEREN&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">Sind Sie sich sicher, dass Sie Ihre Wallet verschlüsseln möchten?</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation type="unfinished">Wallet verschlüsselt</translation>
- </message>
- <message>
- <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">Geben Sie die neue Passphrase für die Wallet ein.&lt;br/&gt;Bitte benutzen Sie eine Passphrase bestehend aus &lt;b&gt;zehn oder mehr zufälligen Zeichen&lt;/b&gt; oder &lt;b&gt;acht oder mehr Wörtern&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Geben Sie die alte und die neue Wallet-Passphrase ein.</translation>
- </message>
- <message>
- <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">Beachten Sie, dass das Verschlüsseln Ihrer Wallet nicht komplett vor Diebstahl Ihrer Bitcoins durch Malware schützt, die Ihren Computer infiziert hat.</translation>
- </message>
- <message>
- <source>Wallet to be encrypted</source>
- <translation type="unfinished">Wallet zu verschlüsseln</translation>
- </message>
- <message>
- <source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Wallet wird verschlüsselt.</translation>
- </message>
- <message>
- <source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Deine Wallet ist jetzt verschlüsselt.</translation>
- </message>
- <message>
- <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">WICHTIG: Alle vorherigen Wallet-Backups sollten durch die neu erzeugte, verschlüsselte Wallet ersetzt werden. Aus Sicherheitsgründen werden vorherige Backups der unverschlüsselten Wallet nutzlos, sobald Sie die neue, verschlüsselte Wallet verwenden.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation type="unfinished">Wallet-Verschlüsselung fehlgeschlagen</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">Die Wallet-Verschlüsselung ist aufgrund eines internen Fehlers fehlgeschlagen. Ihre Wallet wurde nicht verschlüsselt.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Die eingegebenen Passphrasen stimmen nicht überein.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation type="unfinished">Wallet-Entsperrung fehlgeschlagen.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">Die eingegebene Passphrase zur Wallet-Entschlüsselung war nicht korrekt.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">Die für die Entschlüsselung der Wallet eingegebene Passphrase ist falsch. Sie enthält ein Null-Zeichen (d.h. ein Null-Byte). Wenn die Passphrase mit einer Version dieser Software vor 25.0 festgelegt wurde, versuchen Sie es bitte erneut mit den Zeichen bis zum ersten Null-Zeichen, aber ohne dieses. Wenn dies erfolgreich ist, setzen Sie bitte eine neue Passphrase, um dieses Problem in Zukunft zu vermeiden.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">Die Wallet-Passphrase wurde erfolgreich geändert.</translation>
- </message>
- <message>
- <source>Passphrase change failed</source>
- <translation type="unfinished">Änderung der Passphrase fehlgeschlagen</translation>
- </message>
- <message>
- <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">Die alte Passphrase, die für die Entschlüsselung der Wallet eingegeben wurde, ist falsch. Sie enthält ein Null-Zeichen (d.h. ein Null-Byte). Wenn die Passphrase mit einer Version dieser Software vor 25.0 festgelegt wurde, versuchen Sie es bitte erneut mit den Zeichen bis zum ersten Null-Zeichen, aber ohne dieses.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">Warnung: Die Feststelltaste ist aktiviert!</translation>
- </message>
-</context>
-<context>
- <name>BanTableModel</name>
- <message>
- <source>IP/Netmask</source>
- <translation type="unfinished">IP/Netzmaske</translation>
- </message>
- <message>
- <source>Banned Until</source>
- <translation type="unfinished">Gesperrt bis</translation>
- </message>
-</context>
-<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">Die Einstellungsdatei %1 ist möglicherweise beschädigt oder ungültig.</translation>
- </message>
- <message>
- <source>Runaway exception</source>
- <translation type="unfinished">Ausreisser Ausnahme</translation>
- </message>
- <message>
- <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Ein fataler Fehler ist aufgetreten. %1 kann nicht länger sicher fortfahren und wird beendet.</translation>
- </message>
- <message>
- <source>Internal error</source>
- <translation type="unfinished">Interner Fehler</translation>
- </message>
- <message>
- <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <translation type="unfinished">Ein interner Fehler ist aufgetreten. %1 wird versuchen, sicher fortzufahren. Dies ist ein unerwarteter Fehler, der wie unten beschrieben, gemeldet werden kann.</translation>
- </message>
-</context>
-<context>
<name>QObject</name>
- <message>
- <source>Do you want to reset settings to default values, or to abort without making changes?</source>
- <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">Möchten Sie Einstellungen auf Standardwerte zurücksetzen oder abbrechen, ohne Änderungen vorzunehmen?</translation>
- </message>
- <message>
- <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
- <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
- <translation type="unfinished">Ein schwerwiegender Fehler ist aufgetreten. Überprüfen Sie, ob die Einstellungsdatei beschreibbar ist, oder versuchen Sie, mit -nosettings zu starten.</translation>
- </message>
- <message>
- <source>Error: %1</source>
- <translation type="unfinished">Fehler: %1</translation>
- </message>
- <message>
- <source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 noch nicht sicher beendet…</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">unbekannt</translation>
- </message>
- <message>
- <source>Embedded "%1"</source>
- <translation type="unfinished">Eingebettet "%1"</translation>
- </message>
- <message>
- <source>Default system font "%1"</source>
- <translation type="unfinished">Standard Systemschriftart "%1"</translation>
- </message>
- <message>
- <source>Custom…</source>
- <translation type="unfinished">Benutzerdefiniert...</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation type="unfinished">Betrag</translation>
- </message>
- <message>
- <source>Enter a Bitcoin address (e.g. %1)</source>
- <translation type="unfinished">Bitcoin-Adresse eingeben (z.B. %1)</translation>
- </message>
- <message>
- <source>Ctrl+W</source>
- <translation type="unfinished">Strg+W</translation>
- </message>
- <message>
- <source>Unroutable</source>
- <translation type="unfinished">Nicht weiterleitbar</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
- <translation type="unfinished">Eingehend</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">Ausgehend</translation>
- </message>
- <message>
- <source>Full Relay</source>
- <extracomment>Peer connection type that relays all network information.</extracomment>
- <translation type="unfinished">Volles Relais</translation>
- </message>
- <message>
- <source>Block Relay</source>
- <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Blockrelais</translation>
- </message>
- <message>
- <source>Manual</source>
- <extracomment>Peer connection type established manually through one of several methods.</extracomment>
- <translation type="unfinished">Manuell</translation>
- </message>
- <message>
- <source>Feeler</source>
- <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Fühler</translation>
- </message>
- <message>
- <source>Address Fetch</source>
- <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
- <translation type="unfinished">Adress Abholung</translation>
- </message>
- <message>
- <source>%1 d</source>
- <translation type="unfinished">%1 T</translation>
- </message>
- <message>
- <source>%1 m</source>
- <translation type="unfinished">%1 min</translation>
- </message>
- <message>
- <source>None</source>
- <translation type="unfinished">Keine</translation>
- </message>
- <message>
- <source>N/A</source>
- <translation type="unfinished">k.A.</translation>
- </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform>%n Sekunde</numerusform>
- <numerusform>%n Sekunden</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform>%n Minute</numerusform>
- <numerusform>%n Minuten</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform>%nStunde</numerusform>
- <numerusform>%n Stunden</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform>%nTag</numerusform>
- <numerusform>%n Tage</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform>%n Woche</numerusform>
- <numerusform>%n Wochen</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
</translation>
</message>
- <message>
- <source>%1 and %2</source>
- <translation type="unfinished">%1 und %2</translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform>%nJahr</numerusform>
- <numerusform>%n Jahre</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
</context>
<context>
<name>BitcoinGUI</name>
- <message>
- <source>&amp;Overview</source>
- <translation type="unfinished">und Ãœbersicht</translation>
- </message>
- <message>
- <source>Show general overview of wallet</source>
- <translation type="unfinished">Allgemeine Ãœbersicht des Wallets anzeigen.</translation>
- </message>
- <message>
- <source>&amp;Transactions</source>
- <translation type="unfinished">Und Überträgen </translation>
- </message>
- <message>
- <source>Create a new wallet</source>
- <translation type="unfinished">Neues Wallet erstellen</translation>
- </message>
- <message>
- <source>&amp;Options…</source>
- <translation type="unfinished">weitere Möglichkeiten/Einstellungen </translation>
- </message>
- <message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">Nachricht bestätigen </translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation type="unfinished">&amp;Hilfe</translation>
- </message>
- <message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">Verbinde mit Peers...</translation>
- </message>
- <message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Zahlungen anfordern (erzeugt QR-Codes und "bitcoin:"-URIs)</translation>
- </message>
- <message>
- <source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Liste verwendeter Zahlungsadressen und Bezeichnungen anzeigen</translation>
- </message>
- <message>
- <source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Liste verwendeter Empfangsadressen und Bezeichnungen anzeigen</translation>
- </message>
- <message>
- <source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Kommandozeilenoptionen</translation>
- </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform> %n Block der Transaktionshistorie verarbeitet.</numerusform>
- <numerusform> %n Blöcke der Transaktionshistorie verarbeitet.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
</translation>
</message>
- <message>
- <source>%1 behind</source>
- <translation type="unfinished">%1 im Rückstand</translation>
- </message>
- <message>
- <source>Catching up…</source>
- <translation type="unfinished">Hole auf…</translation>
- </message>
- <message>
- <source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Der letzte empfangene Block ist %1 alt.</translation>
- </message>
- <message>
- <source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Transaktionen hiernach werden noch nicht angezeigt.</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Fehler</translation>
- </message>
- <message>
- <source>Warning</source>
- <translation type="unfinished">Warnung</translation>
- </message>
- <message>
- <source>Information</source>
- <translation type="unfinished">Hinweis</translation>
- </message>
- <message>
- <source>Up to date</source>
- <translation type="unfinished">Auf aktuellem Stand</translation>
- </message>
- <message>
- <source>Ctrl+Q</source>
- <translation type="unfinished">STRG+Q</translation>
- </message>
- <message>
- <source>Restore Wallet…</source>
- <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">Wallet wiederherstellen...</translation>
- </message>
- <message>
- <source>Restore a wallet from a backup file</source>
- <extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">Wiederherstellen einer Wallet aus einer Sicherungsdatei</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">Schließe alle Wallets</translation>
- </message>
- <message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Wallet migrieren</translation>
- </message>
- <message>
- <source>Migrate a wallet</source>
- <translation type="unfinished">Eine Wallet Migrieren</translation>
- </message>
- <message>
- <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Zeige den "%1"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten</translation>
- </message>
- <message>
- <source>&amp;Mask values</source>
- <translation type="unfinished">&amp;Blende Werte aus</translation>
- </message>
- <message>
- <source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Blende die Werte im Ãœbersichtsreiter aus</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
- </message>
- <message>
- <source>No wallets available</source>
- <translation type="unfinished">Keine Wallets verfügbar</translation>
- </message>
- <message>
- <source>Wallet Data</source>
- <extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Wallet-Daten</translation>
- </message>
- <message>
- <source>Load Wallet Backup</source>
- <extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Wallet-Backup laden</translation>
- </message>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">Wallet wiederherstellen...</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Wallet-Name</translation>
- </message>
- <message>
- <source>&amp;Window</source>
- <translation type="unfinished">&amp;Programmfenster</translation>
- </message>
- <message>
- <source>Ctrl+M</source>
- <translation type="unfinished">STRG+M</translation>
- </message>
- <message>
- <source>Zoom</source>
- <translation type="unfinished">Vergrößern</translation>
- </message>
- <message>
- <source>Main Window</source>
- <translation type="unfinished">Hauptfenster</translation>
- </message>
- <message>
- <source>%1 client</source>
- <translation type="unfinished">%1 Client</translation>
- </message>
- <message>
- <source>&amp;Hide</source>
- <translation type="unfinished">&amp;Ausblenden</translation>
- </message>
- <message>
- <source>S&amp;how</source>
- <translation type="unfinished">&amp;Anzeigen</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n aktive Verbindung zum Bitcoin-Netzwerk</numerusform>
- <numerusform>%n aktive Verbindung(en) zum Bitcoin-Netzwerk</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
- <message>
- <source>Click for more actions.</source>
- <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">Klicken für sonstige Aktionen.</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">Gegenstellen Reiter anzeigen</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">Netzwerk Aktivität ausschalten</translation>
- </message>
- <message>
- <source>Enable network activity</source>
- <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">Netzwerk Aktivität einschalten</translation>
- </message>
- <message>
- <source>Error creating wallet</source>
- <translation type="unfinished">Fehler beim Erstellen der Wallet</translation>
- </message>
- <message>
- <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Es kann keine neue Wallet erstellt werden, die Software wurde ohne SQLite-Unterstützung kompiliert (erforderlich für Deskriptor-Wallets)</translation>
- </message>
- <message>
- <source>Error: %1</source>
- <translation type="unfinished">Fehler: %1</translation>
- </message>
- <message>
- <source>Warning: %1</source>
- <translation type="unfinished">Warnung: %1</translation>
- </message>
- <message>
- <source>Date: %1
-</source>
- <translation type="unfinished">Datum: %1
-</translation>
- </message>
- <message>
- <source>Amount: %1
-</source>
- <translation type="unfinished">Betrag: %1
-</translation>
- </message>
- <message>
- <source>Type: %1
-</source>
- <translation type="unfinished">Typ: %1
-</translation>
- </message>
- <message>
- <source>Label: %1
-</source>
- <translation type="unfinished">Bezeichnung: %1
-</translation>
- </message>
- <message>
- <source>Address: %1
-</source>
- <translation type="unfinished">Adresse: %1
-</translation>
- </message>
- <message>
- <source>Sent transaction</source>
- <translation type="unfinished">Gesendete Transaktion</translation>
- </message>
- <message>
- <source>Incoming transaction</source>
- <translation type="unfinished">Eingehende Transaktion</translation>
- </message>
- <message>
- <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">HD Schlüssel Generierung ist &lt;b&gt;aktiviert&lt;/b&gt;</translation>
- </message>
- <message>
- <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">HD Schlüssel Generierung ist &lt;b&gt;deaktiviert&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">Privater Schlüssel &lt;b&gt;deaktiviert&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">Wallet ist &lt;b&gt;verschlüsselt&lt;/b&gt; und aktuell &lt;b&gt;entsperrt&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">Wallet ist &lt;b&gt;verschlüsselt&lt;/b&gt; und aktuell &lt;b&gt;gesperrt&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Original message:</source>
- <translation type="unfinished">Original-Nachricht:</translation>
- </message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- <message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">Die Einheit in der Beträge angezeigt werden. Klicken, um eine andere Einheit auszuwählen.</translation>
- </message>
-</context>
+ </context>
<context>
<name>CoinControlDialog</name>
<message>
- <source>Coin Selection</source>
- <translation type="unfinished">Münzauswahl ("Coin Control")</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">Anzahl:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Betrag:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">Gebühr:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Abzüglich Gebühr:</translation>
</message>
@@ -832,14 +153,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Bytes kopieren</translation>
</message>
<message>
- <source>Copy change</source>
- <translation type="unfinished">Wechselgeld kopieren</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation type="unfinished">(%1 gesperrt)</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Kann pro Eingabe um +/- %1 Satoshi(s) abweichen.</translation>
</message>
@@ -899,3898 +212,67 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
</context>
<context>
- <name>MigrateWalletActivity</name>
- <message>
- <source>Migrate wallet</source>
- <translation type="unfinished">Wallet migrieren</translation>
- </message>
- <message>
- <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Sicher, dass die Wallet migriert werden soll? &lt;i&gt;%1&lt;/i&gt;?</translation>
- </message>
- <message>
- <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
-If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
-If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
-
-The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
- <translation type="unfinished">Durch die Migration der Wallet wird diese Wallet in eine oder mehrere Deskriptor-Wallets umgewandelt. Es muss ein neues Wallet-Backup erstellt werden.
-Wenn diese Wallet Watchonly-Skripte enthält, wird eine neue Wallet erstellt, die diese Watchonly-Skripte enthält.
-Wenn diese Wallet lösbare, aber nicht beobachtete Skripte enthält, wird eine andere und neue Wallet erstellt, die diese Skripte enthält.
-
-Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet erstellt. Diese Backup-Datei heißt &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak und befindet sich im Verzeichnis für diese Wallet. Im Falle einer fehlerhaften Migration kann das Backup mit der Funktion "Wallet wiederherstellen" wiederhergestellt werden.</translation>
- </message>
- <message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Wallet migrieren</translation>
- </message>
- <message>
- <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <translation type="unfinished">Wallet migrieren &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
- <message>
- <source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">Die Wallet '%1' wurde erfolgreich migriert.</translation>
- </message>
- <message>
- <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Nur-beobachten Scripts wurden in eine neue Wallet namens '%1' überführt.</translation>
- </message>
- <message>
- <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Lösbare aber nicht beobachtete Scripts wurde in eine neue Wallet namens '%1' überführt.</translation>
- </message>
- <message>
- <source>Migration failed</source>
- <translation type="unfinished">Migration fehlgeschlagen</translation>
- </message>
- <message>
- <source>Migration Successful</source>
- <translation type="unfinished">Migration erfolgreich</translation>
- </message>
-</context>
-<context>
- <name>OpenWalletActivity</name>
- <message>
- <source>Open wallet failed</source>
- <translation type="unfinished">Wallet öffnen fehlgeschlagen</translation>
- </message>
- <message>
- <source>Open wallet warning</source>
- <translation type="unfinished">Wallet öffnen Warnung</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
- </message>
- <message>
- <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">Öffne Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
-</context>
-<context>
- <name>RestoreWalletActivity</name>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">Wallet wiederherstellen...</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">Wiederherstellen der Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
- <message>
- <source>Restore wallet failed</source>
- <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Wallet Wiederherstellung fehlgeschlagen</translation>
- </message>
- <message>
- <source>Restore wallet warning</source>
- <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">Wallet Wiederherstellungs Warnung</translation>
- </message>
- <message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">Wallet Wiederherstellungs Nachricht</translation>
- </message>
-</context>
-<context>
- <name>WalletController</name>
- <message>
- <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Sind Sie sich sicher, dass Sie die Wallet &lt;i&gt;%1&lt;/i&gt; schließen möchten?</translation>
- </message>
- <message>
- <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <translation type="unfinished">Wenn Sie die Wallet zu lange schließen, kann es dazu kommen, dass Sie die gesamte Chain neu synchronisieren müssen, wenn Pruning aktiviert ist.</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">Schließe alle Wallets</translation>
- </message>
- <message>
- <source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">Sicher, dass Sie alle Wallets schließen möchten?</translation>
- </message>
-</context>
-<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>Create Wallet</source>
- <translation type="unfinished">Wallet erstellen</translation>
- </message>
- <message>
- <source>You are one step away from creating your new wallet!</source>
- <translation type="unfinished">Nur noch einen Schritt entfernt, das neue Wallet zu erstellen!</translation>
- </message>
- <message>
- <source>Please provide a name and, if desired, enable any advanced options</source>
- <translation type="unfinished">Bitte einen Namen angeben und, falls gewünscht, alle erweiterten Optionen aktivieren</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <translation type="unfinished">Wallet-Name</translation>
- </message>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">Brieftasche</translation>
- </message>
- <message>
- <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">Verschlüssele das Wallet. Das Wallet wird mit einer Passphrase deiner Wahl verschlüsselt.</translation>
- </message>
- <message>
- <source>Encrypt Wallet</source>
- <translation type="unfinished">Wallet verschlüsseln</translation>
- </message>
- <message>
- <source>Advanced Options</source>
- <translation type="unfinished">Erweiterte Optionen</translation>
- </message>
- <message>
- <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Deaktiviert private Schlüssel für dieses Wallet. Wallets mit deaktivierten privaten Schlüsseln werden keine privaten Schlüssel haben und können keinen HD Seed oder private Schlüssel importieren. Das ist ideal für Wallets, die nur beobachten.</translation>
- </message>
- <message>
- <source>Disable Private Keys</source>
- <translation type="unfinished">Private Keys deaktivieren</translation>
- </message>
- <message>
- <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">Erzeugt ein leeres Wallet. Leere Wallets haben zu Anfang keine privaten Schlüssel oder Scripte. Private Schlüssel oder Adressen können importiert werden, ebenso können jetzt oder später HD-Seeds gesetzt werden.</translation>
- </message>
- <message>
- <source>Make Blank Wallet</source>
- <translation type="unfinished">Eine leere Wallet erstellen</translation>
- </message>
- <message>
- <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
- <translation type="unfinished">Verwenden Sie ein externes Signiergerät, z. B. eine Hardware-Wallet. Konfigurieren Sie zunächst das Skript für den externen Signierer in den Wallet-Einstellungen.</translation>
- </message>
- <message>
- <source>External signer</source>
- <translation type="unfinished">Externer Unterzeichner</translation>
- </message>
- <message>
- <source>Create</source>
- <translation type="unfinished">Erstellen</translation>
- </message>
- <message>
- <source>Compiled without external signing support (required for external signing)</source>
- <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Ohne Unterstützung für die Signierung durch externe Geräte Dritter kompiliert (notwendig für Signierung durch externe Geräte Dritter)</translation>
- </message>
-</context>
-<context>
- <name>EditAddressDialog</name>
- <message>
- <source>Edit Address</source>
- <translation type="unfinished">Adresse bearbeiten</translation>
- </message>
- <message>
- <source>&amp;Label</source>
- <translation type="unfinished">&amp;Bezeichnung</translation>
- </message>
- <message>
- <source>The label associated with this address list entry</source>
- <translation type="unfinished">Bezeichnung, die dem Adresslisteneintrag zugeordnet ist.</translation>
- </message>
- <message>
- <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">Adresse, die dem Adresslisteneintrag zugeordnet ist. Diese kann nur bei Zahlungsadressen verändert werden.</translation>
- </message>
- <message>
- <source>&amp;Address</source>
- <translation type="unfinished">&amp;Adresse</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">Neue Zahlungsadresse</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation type="unfinished">Empfangsadresse bearbeiten</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation type="unfinished">Zahlungsadresse bearbeiten</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">Die eingegebene Adresse "%1" ist keine gültige Bitcoin-Adresse.</translation>
- </message>
- <message>
- <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">Die Adresse "%1" existiert bereits als Empfangsadresse mit dem Label "%2" und kann daher nicht als Sendeadresse hinzugefügt werden.</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book with label "%2".</source>
- <translation type="unfinished">Die eingegebene Adresse "%1" befindet sich bereits im Adressbuch mit der Bezeichnung "%2".</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Wallet konnte nicht entsperrt werden.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation type="unfinished">Erzeugung eines neuen Schlüssels fehlgeschlagen.</translation>
- </message>
-</context>
-<context>
- <name>FreespaceChecker</name>
- <message>
- <source>A new data directory will be created.</source>
- <translation type="unfinished">Es wird ein neues Datenverzeichnis angelegt.</translation>
- </message>
- <message>
- <source>name</source>
- <translation type="unfinished">Name</translation>
- </message>
- <message>
- <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation type="unfinished">Verzeichnis existiert bereits. Fügen Sie %1 an, wenn Sie beabsichtigen hier ein neues Verzeichnis anzulegen.</translation>
- </message>
- <message>
- <source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">Pfad existiert bereits und ist kein Verzeichnis.</translation>
- </message>
- <message>
- <source>Cannot create data directory here.</source>
- <translation type="unfinished">Datenverzeichnis kann hier nicht angelegt werden.</translation>
- </message>
-</context>
-<context>
<name>Intro</name>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform>%n GB Speicherplatz verfügbar</numerusform>
- <numerusform>%n GB Speicherplatz verfügbar</numerusform>
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB of space available</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform>(von %n GB benötigt)</numerusform>
- <numerusform>(von %n GB benötigt)</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(%n GB benötigt für komplette Blockchain)</numerusform>
- <numerusform>(%n GB benötigt für komplette Blockchain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
</translation>
</message>
- <message>
- <source>Choose data directory</source>
- <translation type="unfinished">Datenverzeichnis auswählen</translation>
- </message>
- <message>
- <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Mindestens %1 GB Daten werden in diesem Verzeichnis gespeichert, und sie werden mit der Zeit zunehmen.</translation>
- </message>
- <message>
- <source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Etwa %1 GB Daten werden in diesem Verzeichnis gespeichert.</translation>
- </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform>(für Wiederherstellung ausreichende Sicherung %n Tag alt)</numerusform>
- <numerusform>(für Wiederherstellung ausreichende Sicherung %n Tage alt)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
</translation>
</message>
- <message>
- <source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">%1 wird eine Kopie der Bitcoin-Blockchain herunterladen und speichern.</translation>
- </message>
- <message>
- <source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished">Die Wallet wird ebenfalls in diesem Verzeichnis gespeichert.</translation>
- </message>
- <message>
- <source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">Fehler: Angegebenes Datenverzeichnis "%1" kann nicht angelegt werden.</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Fehler</translation>
- </message>
- <message>
- <source>Welcome</source>
- <translation type="unfinished">Willkommen</translation>
- </message>
- <message>
- <source>Welcome to %1.</source>
- <translation type="unfinished">Willkommen zu %1.</translation>
- </message>
- <message>
- <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">Da Sie das Programm gerade zum ersten Mal starten, können Sie nun auswählen wo %1 seine Daten ablegen wird.</translation>
- </message>
- <message>
- <source>Limit block chain storage to</source>
- <translation type="unfinished">Blockchain-Speicher beschränken auf</translation>
- </message>
- <message>
- <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">Um diese Einstellung wiederherzustellen, muss die gesamte Blockchain neu heruntergeladen werden. Es ist schneller, die gesamte Chain zuerst herunterzuladen und später zu bearbeiten. Deaktiviert einige erweiterte Funktionen.</translation>
- </message>
- <message>
- <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">Diese initiale Synchronisation führt zur hohen Last und kann Hardwareprobleme, die bisher nicht aufgetreten sind, mit ihrem Computer verursachen. Jedes Mal, wenn Sie %1 ausführen, wird der Download zum letzten Synchronisationspunkt fortgesetzt.</translation>
- </message>
- <message>
- <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">Wenn Sie auf OK klicken, beginnt %1 mit dem Herunterladen und Verarbeiten der gesamten %4-Blockchain (%2GB), beginnend mit den frühesten Transaktionen in %3 beim ersten Start von %4.</translation>
- </message>
- <message>
- <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">Wenn Sie bewusst den Blockchain-Speicher begrenzen (pruning), müssen die historischen Daten dennoch heruntergeladen und verarbeitet werden. Diese Daten werden aber zum späteren Zeitpunkt gelöscht, um die Festplattennutzung niedrig zu halten.</translation>
- </message>
- <message>
- <source>Use the default data directory</source>
- <translation type="unfinished">Standard-Datenverzeichnis verwenden</translation>
- </message>
- <message>
- <source>Use a custom data directory:</source>
- <translation type="unfinished">Ein benutzerdefiniertes Datenverzeichnis verwenden:</translation>
- </message>
-</context>
-<context>
- <name>HelpMessageDialog</name>
- <message>
- <source>version</source>
- <translation type="unfinished">Version</translation>
- </message>
- <message>
- <source>About %1</source>
- <translation type="unfinished">Ãœber %1</translation>
- </message>
- <message>
- <source>Command-line options</source>
- <translation type="unfinished">Kommandozeilenoptionen</translation>
- </message>
-</context>
-<context>
- <name>ShutdownWindow</name>
- <message>
- <source>%1 is shutting down…</source>
- <translation type="unfinished">%1 wird beendet...</translation>
- </message>
- <message>
- <source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">Fahren Sie den Computer nicht herunter, bevor dieses Fenster verschwindet.</translation>
- </message>
-</context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">Formular</translation>
- </message>
- <message>
- <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">Neueste Transaktionen werden eventuell noch nicht angezeigt, daher könnte Ihr Kontostand veraltet sein. Er wird korrigiert, sobald Ihr Wallet die Synchronisation mit dem Bitcoin-Netzwerk erfolgreich abgeschlossen hat. Details dazu finden sich weiter unten.</translation>
- </message>
- <message>
- <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">Versuche, Bitcoins aus noch nicht angezeigten Transaktionen auszugeben, werden vom Netzwerk nicht akzeptiert.</translation>
- </message>
- <message>
- <source>Number of blocks left</source>
- <translation type="unfinished">Anzahl verbleibender Blöcke</translation>
- </message>
- <message>
- <source>Unknown…</source>
- <translation type="unfinished">Unbekannt...</translation>
- </message>
- <message>
- <source>calculating…</source>
- <translation type="unfinished">berechne...</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Letzte Blockzeit</translation>
- </message>
- <message>
- <source>Progress</source>
- <translation type="unfinished">Fortschritt</translation>
- </message>
- <message>
- <source>Progress increase per hour</source>
- <translation type="unfinished">Fortschritt pro Stunde</translation>
- </message>
- <message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">Abschätzung der verbleibenden Zeit bis synchronisiert</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">Ausblenden</translation>
- </message>
- <message>
- <source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
- <translation type="unfinished">%1 synchronisiert gerade. Es lädt Header und Blöcke von Gegenstellen und validiert sie bis zum Erreichen der Spitze der Blockkette.</translation>
- </message>
- <message>
- <source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Unbekannt. Synchronisiere Headers (%1, %2%)...</translation>
- </message>
- <message>
- <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Unbekannt. vorsynchronisiere Header (%1, %2%)...</translation>
- </message>
-</context>
-<context>
- <name>OpenURIDialog</name>
- <message>
- <source>Open bitcoin URI</source>
- <translation type="unfinished">Öffne bitcoin URI</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">Adresse aus der Zwischenablage einfügen</translation>
- </message>
-</context>
-<context>
- <name>OptionsDialog</name>
- <message>
- <source>Options</source>
- <translation type="unfinished">Konfiguration</translation>
- </message>
- <message>
- <source>&amp;Main</source>
- <translation type="unfinished">&amp;Allgemein</translation>
- </message>
- <message>
- <source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">%1 nach der Anmeldung im System automatisch ausführen.</translation>
- </message>
- <message>
- <source>&amp;Start %1 on system login</source>
- <translation type="unfinished">&amp;Starte %1 nach Systemanmeldung</translation>
- </message>
- <message>
- <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Durch das Aktivieren von Pruning wird der zum Speichern von Transaktionen benötigte Speicherplatz erheblich reduziert. Alle Blöcke werden weiterhin vollständig validiert. Um diese Einstellung rückgängig zu machen, muss die gesamte Blockchain erneut heruntergeladen werden.</translation>
- </message>
- <message>
- <source>Size of &amp;database cache</source>
- <translation type="unfinished">Größe des &amp;Datenbankpufferspeichers</translation>
- </message>
- <message>
- <source>Number of script &amp;verification threads</source>
- <translation type="unfinished">Anzahl an Skript-&amp;Verifizierungs-Threads</translation>
- </message>
- <message>
- <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">Vollständiger Pfad zu %1 einem Bitcoin Core kompatibelen Script (z.B.: C:\Downloads\hwi.exe oder /Users/you/Downloads/hwi.py). Achtung: Malware kann Bitcoins stehlen!</translation>
- </message>
- <message>
- <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
- <translation type="unfinished">IP-Adresse des Proxies (z.B. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
- </message>
- <message>
- <source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
- <translation type="unfinished">Zeigt an, ob der gelieferte Standard SOCKS5 Proxy verwendet wurde, um die Peers mit diesem Netzwerktyp zu erreichen.</translation>
- </message>
- <message>
- <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
- <translation type="unfinished">Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie die Anwendung über "Beenden" im Menü schließen.</translation>
- </message>
- <message>
- <source>Font in the Overview tab: </source>
- <translation type="unfinished">Schriftart im Ãœberblicks-Tab:</translation>
- </message>
- <message>
- <source>Options set in this dialog are overridden by the command line:</source>
- <translation type="unfinished">Einstellungen in diesem Dialog werden von der Kommandozeile überschrieben:</translation>
- </message>
- <message>
- <source>Open the %1 configuration file from the working directory.</source>
- <translation type="unfinished">Öffnen Sie die %1 Konfigurationsdatei aus dem Arbeitsverzeichnis.</translation>
- </message>
- <message>
- <source>Open Configuration File</source>
- <translation type="unfinished">Konfigurationsdatei öffnen</translation>
- </message>
- <message>
- <source>Reset all client options to default.</source>
- <translation type="unfinished">Setzt die Clientkonfiguration auf Standardwerte zurück.</translation>
- </message>
- <message>
- <source>&amp;Reset Options</source>
- <translation type="unfinished">Konfiguration &amp;zurücksetzen</translation>
- </message>
- <message>
- <source>&amp;Network</source>
- <translation type="unfinished">&amp;Netzwerk</translation>
- </message>
- <message>
- <source>Prune &amp;block storage to</source>
- <translation type="unfinished">&amp;Blockspeicher kürzen auf</translation>
- </message>
- <message>
- <source>Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Wenn diese Einstellung rückgängig gemacht wird, muss die komplette Blockchain erneut heruntergeladen werden.</translation>
- </message>
- <message>
- <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
- <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
- <translation type="unfinished">Maximale Größe des Datenbank-Caches. Ein größerer Cache kann zu einer schnelleren Synchronisierung beitragen, danach ist der Vorteil für die meisten Anwendungsfälle weniger ausgeprägt. Eine Verringerung der Cache-Größe reduziert den Speicherverbrauch. Ungenutzter Mempool-Speicher wird für diesen Cache gemeinsam genutzt.</translation>
- </message>
- <message>
- <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
- <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">Legen Sie die Anzahl der Skriptüberprüfungs-Threads fest. Negative Werte entsprechen der Anzahl der Kerne, die Sie für das System frei lassen möchten.</translation>
- </message>
- <message>
- <source>(0 = auto, &lt;0 = leave that many cores free)</source>
- <translation type="unfinished">(0 = automatisch, &lt;0 = so viele Kerne frei lassen)</translation>
- </message>
- <message>
- <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
- <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
- <translation type="unfinished">Dies ermöglicht Ihnen oder einem Drittanbieter-Tool die Kommunikation mit dem Knoten über Befehlszeilen- und JSON-RPC-Befehle.</translation>
- </message>
- <message>
- <source>Enable R&amp;PC server</source>
- <extracomment>An Options window setting to enable the RPC server.</extracomment>
- <translation type="unfinished">RPC-Server aktivieren</translation>
- </message>
- <message>
- <source>W&amp;allet</source>
- <translation type="unfinished">B&amp;rieftasche</translation>
- </message>
- <message>
- <source>Whether to set subtract fee from amount as default or not.</source>
- <extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">Wählen Sie, ob die Gebühr standardmäßig vom Betrag abgezogen werden soll oder nicht.</translation>
- </message>
- <message>
- <source>Subtract &amp;fee from amount by default</source>
- <extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">Standardmäßig die Gebühr vom Betrag abziehen</translation>
- </message>
- <message>
- <source>Expert</source>
- <translation type="unfinished">Experten-Optionen</translation>
- </message>
- <message>
- <source>Enable coin &amp;control features</source>
- <translation type="unfinished">"&amp;Coin Control"-Funktionen aktivieren</translation>
- </message>
- <message>
- <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
- <translation type="unfinished">Wenn Sie das Ausgeben von unbestätigtem Wechselgeld deaktivieren, kann das Wechselgeld einer Transaktion nicht verwendet werden, bis es mindestens eine Bestätigung erhalten hat. Dies wirkt sich auf die Berechnung des Kontostands aus.</translation>
- </message>
- <message>
- <source>&amp;Spend unconfirmed change</source>
- <translation type="unfinished">&amp;Unbestätigtes Wechselgeld darf ausgegeben werden</translation>
- </message>
- <message>
- <source>Enable &amp;PSBT controls</source>
- <extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">&amp;PBST-Kontrollen aktivieren</translation>
- </message>
- <message>
- <source>Whether to show PSBT controls.</source>
- <extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
- <translation type="unfinished">Ob PSBT-Kontrollen angezeigt werden sollen. </translation>
- </message>
- <message>
- <source>External Signer (e.g. hardware wallet)</source>
- <translation type="unfinished">Gerät für externe Signierung (z. B.: Hardware wallet)</translation>
- </message>
- <message>
- <source>&amp;External signer script path</source>
- <translation type="unfinished">&amp;Pfad zum Script des externen Gerätes zur Signierung</translation>
- </message>
- <message>
- <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
- <translation type="unfinished">Automatisch den Bitcoin-Clientport auf dem Router öffnen. Dies funktioniert nur, wenn Ihr Router UPnP unterstützt und dies aktiviert ist.</translation>
- </message>
- <message>
- <source>Map port using &amp;UPnP</source>
- <translation type="unfinished">Portweiterleitung via &amp;UPnP</translation>
- </message>
- <message>
- <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
- <translation type="unfinished">Öffnet automatisch den Bitcoin-Client-Port auf dem Router. Dies funktioniert nur, wenn Ihr Router NAT-PMP unterstützt und es aktiviert ist. Der externe Port kann zufällig sein.</translation>
- </message>
- <message>
- <source>Map port using NA&amp;T-PMP</source>
- <translation type="unfinished">Map-Port mit NA&amp;T-PMP</translation>
- </message>
- <message>
- <source>Accept connections from outside.</source>
- <translation type="unfinished">Akzeptiere Verbindungen von außerhalb.</translation>
- </message>
- <message>
- <source>Allow incomin&amp;g connections</source>
- <translation type="unfinished">Erlaube &amp;eingehende Verbindungen</translation>
- </message>
- <message>
- <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
- <translation type="unfinished">Ãœber einen SOCKS5-Proxy mit dem Bitcoin-Netzwerk verbinden.</translation>
- </message>
- <message>
- <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
- <translation type="unfinished">Ãœber einen SOCKS5-Proxy &amp;verbinden (Standardproxy):</translation>
- </message>
- <message>
- <source>Proxy &amp;IP:</source>
- <translation type="unfinished">Proxy-&amp;IP:</translation>
- </message>
- <message>
- <source>Port of the proxy (e.g. 9050)</source>
- <translation type="unfinished">Port des Proxies (z.B. 9050)</translation>
- </message>
- <message>
- <source>Used for reaching peers via:</source>
- <translation type="unfinished">Benutzt um Gegenstellen zu erreichen über:</translation>
- </message>
- <message>
- <source>&amp;Window</source>
- <translation type="unfinished">&amp;Programmfenster</translation>
- </message>
- <message>
- <source>Show the icon in the system tray.</source>
- <translation type="unfinished">Zeigt das Symbol in der Leiste an.</translation>
- </message>
- <message>
- <source>&amp;Show tray icon</source>
- <translation type="unfinished">&amp;Zeige Statusleistensymbol</translation>
- </message>
- <message>
- <source>Show only a tray icon after minimizing the window.</source>
- <translation type="unfinished">Nur ein Symbol im Infobereich anzeigen, nachdem das Programmfenster minimiert wurde.</translation>
- </message>
- <message>
- <source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation type="unfinished">In den Infobereich anstatt in die Taskleiste &amp;minimieren</translation>
- </message>
- <message>
- <source>M&amp;inimize on close</source>
- <translation type="unfinished">Beim Schließen m&amp;inimieren</translation>
- </message>
- <message>
- <source>&amp;Display</source>
- <translation type="unfinished">&amp;Anzeige</translation>
- </message>
- <message>
- <source>User Interface &amp;language:</source>
- <translation type="unfinished">&amp;Sprache der Benutzeroberfläche:</translation>
- </message>
- <message>
- <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
- <translation type="unfinished">Die Sprache der Benutzeroberflächen kann hier festgelegt werden. Diese Einstellung wird nach einem Neustart von %1 wirksam werden.</translation>
- </message>
- <message>
- <source>&amp;Unit to show amounts in:</source>
- <translation type="unfinished">&amp;Einheit der Beträge:</translation>
- </message>
- <message>
- <source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation type="unfinished">Wählen Sie die standardmäßige Untereinheit, die in der Benutzeroberfläche und beim Überweisen von Bitcoins angezeigt werden soll.</translation>
- </message>
- <message>
- <source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
- <translation type="unfinished">URLs von Drittanbietern (z. B. eines Block-Explorers), erscheinen als Kontextmenüpunkte auf der Registerkarte. %s in der URL wird durch den Transaktionshash ersetzt. Mehrere URLs werden durch senkrechte Striche | getrennt.</translation>
- </message>
- <message>
- <source>&amp;Third-party transaction URLs</source>
- <translation type="unfinished">&amp;Transaktions-URLs von Drittparteien</translation>
- </message>
- <message>
- <source>Whether to show coin control features or not.</source>
- <translation type="unfinished">Legt fest, ob die "Coin Control"-Funktionen angezeigt werden.</translation>
- </message>
- <message>
- <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
- <translation type="unfinished">Verbinde mit dem Bitcoin-Netzwerk über einen separaten SOCKS5-Proxy für Tor-Onion-Dienste.</translation>
- </message>
- <message>
- <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
- <translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
- </message>
- <message>
- <source>&amp;Cancel</source>
- <translation type="unfinished">&amp;Abbrechen</translation>
- </message>
- <message>
- <source>Compiled without external signing support (required for external signing)</source>
- <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Ohne Unterstützung für die Signierung durch externe Geräte Dritter kompiliert (notwendig für Signierung durch externe Geräte Dritter)</translation>
- </message>
- <message>
- <source>default</source>
- <translation type="unfinished">Standard</translation>
- </message>
- <message>
- <source>none</source>
- <translation type="unfinished">keine</translation>
- </message>
- <message>
- <source>Confirm options reset</source>
- <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
- <translation type="unfinished">Zurücksetzen der Konfiguration bestätigen</translation>
- </message>
- <message>
- <source>Client restart required to activate changes.</source>
- <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
- <translation type="unfinished">Client-Neustart erforderlich, um Änderungen zu aktivieren.</translation>
- </message>
- <message>
- <source>Current settings will be backed up at "%1".</source>
- <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">Aktuelle Einstellungen werden in "%1" gespeichert.</translation>
- </message>
- <message>
- <source>Client will be shut down. Do you want to proceed?</source>
- <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
- <translation type="unfinished">Client wird beendet. Möchten Sie den Vorgang fortsetzen?</translation>
- </message>
- <message>
- <source>Configuration options</source>
- <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
- <translation type="unfinished">Konfigurationsoptionen</translation>
- </message>
- <message>
- <source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
- <extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
- <translation type="unfinished">Die Konfigurationsdatei wird verwendet, um erweiterte Benutzeroptionen festzulegen, die die GUI-Einstellungen überschreiben. Darüber hinaus werden alle Befehlszeilenoptionen diese Konfigurationsdatei überschreiben.</translation>
- </message>
- <message>
- <source>Continue</source>
- <translation type="unfinished">Weiter</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="unfinished">Abbrechen</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Fehler</translation>
- </message>
- <message>
- <source>The configuration file could not be opened.</source>
- <translation type="unfinished">Die Konfigurationsdatei konnte nicht geöffnet werden.</translation>
- </message>
- <message>
- <source>This change would require a client restart.</source>
- <translation type="unfinished">Diese Änderung würde einen Client-Neustart erfordern.</translation>
- </message>
- <message>
- <source>The supplied proxy address is invalid.</source>
- <translation type="unfinished">Die eingegebene Proxy-Adresse ist ungültig.</translation>
- </message>
-</context>
-<context>
- <name>OptionsModel</name>
- <message>
- <source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">Die folgende Einstellung konnte nicht gelesen werden "%1", %2.</translation>
- </message>
-</context>
-<context>
- <name>OverviewPage</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">Formular</translation>
- </message>
- <message>
- <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
- <translation type="unfinished">Die angezeigten Informationen sind möglicherweise nicht mehr aktuell. Ihre Wallet wird automatisch synchronisiert, nachdem eine Verbindung zum Bitcoin-Netzwerk hergestellt wurde. Dieser Prozess ist jedoch derzeit noch nicht abgeschlossen.</translation>
- </message>
- <message>
- <source>Watch-only:</source>
- <translation type="unfinished">Beobachtet:</translation>
- </message>
- <message>
- <source>Available:</source>
- <translation type="unfinished">Verfügbar:</translation>
- </message>
- <message>
- <source>Your current spendable balance</source>
- <translation type="unfinished">Ihr aktuell verfügbarer Kontostand</translation>
- </message>
- <message>
- <source>Pending:</source>
- <translation type="unfinished">Ausstehend:</translation>
- </message>
- <message>
- <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
- <translation type="unfinished">Gesamtbetrag aus unbestätigten Transaktionen, der noch nicht im aktuell verfügbaren Kontostand enthalten ist</translation>
- </message>
- <message>
- <source>Immature:</source>
- <translation type="unfinished">Unreif:</translation>
- </message>
- <message>
- <source>Mined balance that has not yet matured</source>
- <translation type="unfinished">Erarbeiteter Betrag der noch nicht gereift ist</translation>
- </message>
- <message>
- <source>Balances</source>
- <translation type="unfinished">Kontostände</translation>
- </message>
- <message>
- <source>Total:</source>
- <translation type="unfinished">Gesamtbetrag:</translation>
- </message>
- <message>
- <source>Your current total balance</source>
- <translation type="unfinished">Ihr aktueller Gesamtbetrag</translation>
- </message>
- <message>
- <source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Ihr aktueller Kontostand in nur-beobachteten Adressen</translation>
- </message>
- <message>
- <source>Spendable:</source>
- <translation type="unfinished">Verfügbar:</translation>
- </message>
- <message>
- <source>Recent transactions</source>
- <translation type="unfinished">Letzte Transaktionen</translation>
- </message>
- <message>
- <source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">Unbestätigte Transaktionen an nur-beobachtete Adressen</translation>
- </message>
- <message>
- <source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">Erarbeiteter Betrag in nur-beobachteten Adressen der noch nicht gereift ist</translation>
- </message>
- <message>
- <source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Aktueller Gesamtbetrag in nur-beobachteten Adressen</translation>
- </message>
- <message>
- <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
- <translation type="unfinished">Datenschutz-Modus aktiviert für den Übersichtsreiter. Um die Werte einzublenden, deaktiviere Einstellungen-&gt;Werte ausblenden.</translation>
- </message>
-</context>
-<context>
- <name>PSBTOperationsDialog</name>
- <message>
- <source>PSBT Operations</source>
- <translation type="unfinished">PSBT-Operationen</translation>
- </message>
- <message>
- <source>Sign Tx</source>
- <translation type="unfinished">Signiere Tx</translation>
- </message>
- <message>
- <source>Broadcast Tx</source>
- <translation type="unfinished">Rundsende Tx</translation>
- </message>
- <message>
- <source>Copy to Clipboard</source>
- <translation type="unfinished">Kopiere in Zwischenablage</translation>
- </message>
- <message>
- <source>Save…</source>
- <translation type="unfinished">Speichern...</translation>
- </message>
- <message>
- <source>Close</source>
- <translation type="unfinished">Schließen</translation>
- </message>
- <message>
- <source>Failed to load transaction: %1</source>
- <translation type="unfinished">Laden der Transaktion fehlgeschlagen: %1</translation>
- </message>
- <message>
- <source>Failed to sign transaction: %1</source>
- <translation type="unfinished">Signieren der Transaktion fehlgeschlagen: %1</translation>
- </message>
- <message>
- <source>Cannot sign inputs while wallet is locked.</source>
- <translation type="unfinished">Eingaben können nicht unterzeichnet werden, wenn die Wallet gesperrt ist.</translation>
- </message>
- <message>
- <source>Could not sign any more inputs.</source>
- <translation type="unfinished">Konnte keinerlei weitere Eingaben signieren.</translation>
- </message>
- <message>
- <source>Signed %1 inputs, but more signatures are still required.</source>
- <translation type="unfinished">%1 Eingaben signiert, doch noch sind weitere Signaturen erforderlich.</translation>
- </message>
- <message>
- <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">Transaktion erfolgreich signiert. Transaktion ist bereit für Rundsendung.</translation>
- </message>
- <message>
- <source>Unknown error processing transaction.</source>
- <translation type="unfinished">Unbekannter Fehler bei der Transaktionsverarbeitung</translation>
- </message>
- <message>
- <source>Transaction broadcast successfully! Transaction ID: %1</source>
- <translation type="unfinished">Transaktion erfolgreich rundgesendet! Transaktions-ID: %1</translation>
- </message>
- <message>
- <source>Transaction broadcast failed: %1</source>
- <translation type="unfinished">Rundsenden der Transaktion fehlgeschlagen: %1</translation>
- </message>
- <message>
- <source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT in Zwischenablage kopiert.</translation>
- </message>
- <message>
- <source>Save Transaction Data</source>
- <translation type="unfinished">Speichere Transaktionsdaten</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (Binary)</source>
- <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Teilweise signierte Transaktion (binär)</translation>
- </message>
- <message>
- <source>PSBT saved to disk.</source>
- <translation type="unfinished">PSBT auf Platte gespeichert.</translation>
- </message>
- <message>
- <source>Sends %1 to %2</source>
- <translation type="unfinished">Schickt %1 an %2</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">eigene Adresse</translation>
- </message>
- <message>
- <source>Unable to calculate transaction fee or total transaction amount.</source>
- <translation type="unfinished">Kann die Gebühr oder den Gesamtbetrag der Transaktion nicht berechnen.</translation>
- </message>
- <message>
- <source>Pays transaction fee: </source>
- <translation type="unfinished">Zahlt Transaktionsgebühr:</translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">Gesamtbetrag</translation>
- </message>
- <message>
- <source>or</source>
- <translation type="unfinished">oder</translation>
- </message>
- <message>
- <source>Transaction has %1 unsigned inputs.</source>
- <translation type="unfinished">Transaktion hat %1 unsignierte Eingaben.</translation>
- </message>
- <message>
- <source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">Der Transaktion fehlen einige Informationen über Eingaben.</translation>
- </message>
- <message>
- <source>Transaction still needs signature(s).</source>
- <translation type="unfinished">Transaktion erfordert weiterhin Signatur(en).</translation>
- </message>
- <message>
- <source>(But no wallet is loaded.)</source>
- <translation type="unfinished">(Aber kein Wallet ist geladen.)</translation>
- </message>
- <message>
- <source>(But this wallet cannot sign transactions.)</source>
- <translation type="unfinished">(doch diese Wallet kann Transaktionen nicht signieren)</translation>
- </message>
- <message>
- <source>(But this wallet does not have the right keys.)</source>
- <translation type="unfinished">(doch diese Wallet hat nicht die richtigen Schlüssel)</translation>
- </message>
- <message>
- <source>Transaction is fully signed and ready for broadcast.</source>
- <translation type="unfinished">Transaktion ist vollständig signiert und zur Rundsendung bereit.</translation>
- </message>
- <message>
- <source>Transaction status is unknown.</source>
- <translation type="unfinished">Transaktionsstatus ist unbekannt.</translation>
- </message>
-</context>
-<context>
- <name>PaymentServer</name>
- <message>
- <source>Payment request error</source>
- <translation type="unfinished">Fehler bei der Zahlungsanforderung</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">Kann Bitcoin nicht starten: Klicken-zum-Bezahlen-Verarbeiter</translation>
- </message>
- <message>
- <source>URI handling</source>
- <translation type="unfinished">URI-Verarbeitung</translation>
- </message>
- <message>
- <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
- <translation type="unfinished">'bitcoin://' ist kein gültiger URL. Bitte 'bitcoin:' nutzen.</translation>
- </message>
- <message>
- <source>Cannot process payment request because BIP70 is not supported.
-Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
-If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">Zahlungsanforderung kann nicht verarbeitet werden, da BIP70 nicht unterstützt wird.
-Aufgrund der weit verbreiteten Sicherheitslücken in BIP70 wird dringend empfohlen, die Anweisungen des Händlers zum Wechsel des Wallets zu ignorieren.
-Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BIP21-kompatiblen URI bereitzustellen.</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation type="unfinished">URI kann nicht analysiert werden! Dies kann durch eine ungültige Bitcoin-Adresse oder fehlerhafte URI-Parameter verursacht werden.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation type="unfinished">Zahlungsanforderungsdatei-Verarbeitung</translation>
- </message>
-</context>
-<context>
- <name>PeerTableModel</name>
- <message>
- <source>User Agent</source>
- <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
- <translation type="unfinished">User-Agent</translation>
- </message>
- <message>
- <source>Peer</source>
- <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
- <translation type="unfinished">Gegenstelle</translation>
- </message>
- <message>
- <source>Age</source>
- <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">Alter</translation>
- </message>
- <message>
- <source>Direction</source>
- <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
- <translation type="unfinished">Richtung</translation>
- </message>
- <message>
- <source>Sent</source>
- <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
- <translation type="unfinished">Ãœbertragen</translation>
- </message>
- <message>
- <source>Received</source>
- <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
- <translation type="unfinished">Empfangen</translation>
- </message>
- <message>
- <source>Address</source>
- <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
- <translation type="unfinished">Adresse</translation>
- </message>
- <message>
- <source>Type</source>
- <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
- <translation type="unfinished">Typ</translation>
- </message>
- <message>
- <source>Network</source>
- <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
- <translation type="unfinished">Netzwerk</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An Inbound Connection from a Peer.</extracomment>
- <translation type="unfinished">Eingehend</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">Ausgehend</translation>
- </message>
-</context>
-<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;Bild speichern...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">Grafik &amp;kopieren</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">Resultierende URI ist zu lang, bitte den Text für Bezeichnung/Nachricht kürzen.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Beim Kodieren der URI in den QR-Code ist ein Fehler aufgetreten.</translation>
- </message>
- <message>
- <source>QR code support not available.</source>
- <translation type="unfinished">QR Code Funktionalität nicht vorhanden</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">QR-Code speichern</translation>
- </message>
- <message>
- <source>PNG Image</source>
- <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
- <translation type="unfinished">PNG-Bild</translation>
- </message>
-</context>
-<context>
- <name>RPCConsole</name>
- <message>
- <source>N/A</source>
- <translation type="unfinished">k.A.</translation>
- </message>
- <message>
- <source>Client version</source>
- <translation type="unfinished">Client-Version</translation>
- </message>
- <message>
- <source>&amp;Information</source>
- <translation type="unfinished">Hinweis</translation>
- </message>
- <message>
- <source>General</source>
- <translation type="unfinished">Allgemein</translation>
- </message>
- <message>
- <source>Datadir</source>
- <translation type="unfinished">Datenverzeichnis</translation>
- </message>
- <message>
- <source>To specify a non-default location of the data directory use the '%1' option.</source>
- <translation type="unfinished">Verwenden Sie die Option '%1' um einen anderen, nicht standardmäßigen Speicherort für das Datenverzeichnis festzulegen.</translation>
- </message>
- <message>
- <source>Blocksdir</source>
- <translation type="unfinished">Blockverzeichnis</translation>
- </message>
- <message>
- <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">Verwenden Sie die Option '%1' um einen anderen, nicht standardmäßigen Speicherort für das Blöckeverzeichnis festzulegen.</translation>
- </message>
- <message>
- <source>Startup time</source>
- <translation type="unfinished">Startzeit</translation>
- </message>
- <message>
- <source>Network</source>
- <translation type="unfinished">Netzwerk</translation>
- </message>
- <message>
- <source>Number of connections</source>
- <translation type="unfinished">Anzahl der Verbindungen</translation>
- </message>
- <message>
- <source>Block chain</source>
- <translation type="unfinished">Blockchain</translation>
- </message>
- <message>
- <source>Memory Pool</source>
- <translation type="unfinished">Speicher-Pool</translation>
- </message>
- <message>
- <source>Current number of transactions</source>
- <translation type="unfinished">Aktuelle Anzahl der Transaktionen</translation>
- </message>
- <message>
- <source>Memory usage</source>
- <translation type="unfinished">Speichernutzung</translation>
- </message>
- <message>
- <source>(none)</source>
- <translation type="unfinished">(keine)</translation>
- </message>
- <message>
- <source>&amp;Reset</source>
- <translation type="unfinished">&amp;Zurücksetzen</translation>
- </message>
- <message>
- <source>Received</source>
- <translation type="unfinished">Empfangen</translation>
- </message>
- <message>
- <source>Sent</source>
- <translation type="unfinished">Ãœbertragen</translation>
- </message>
- <message>
- <source>&amp;Peers</source>
- <translation type="unfinished">&amp;Gegenstellen</translation>
- </message>
- <message>
- <source>Banned peers</source>
- <translation type="unfinished">Gesperrte Gegenstellen</translation>
- </message>
- <message>
- <source>Select a peer to view detailed information.</source>
- <translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
- </message>
- <message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">Die Transportschicht-Version: %1</translation>
- </message>
- <message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form, falls vorhanden.</translation>
- </message>
- <message>
- <source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
- </message>
- <message>
- <source>Transaction Relay</source>
- <translation type="unfinished">Transaktions-Relay</translation>
- </message>
- <message>
- <source>Starting Block</source>
- <translation type="unfinished">Start Block</translation>
- </message>
- <message>
- <source>Synced Headers</source>
- <translation type="unfinished">Synchronisierte Header</translation>
- </message>
- <message>
- <source>Synced Blocks</source>
- <translation type="unfinished">Synchronisierte Blöcke</translation>
- </message>
- <message>
- <source>Last Transaction</source>
- <translation type="unfinished">Letzte Transaktion</translation>
- </message>
- <message>
- <source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">Das zugeordnete autonome System zur Diversifizierung der Gegenstellen-Auswahl.</translation>
- </message>
- <message>
- <source>Mapped AS</source>
- <translation type="unfinished">Zugeordnetes AS</translation>
- </message>
- <message>
- <source>Whether we relay addresses to this peer.</source>
- <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
- </message>
- <message>
- <source>Address Relay</source>
- <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Adress-Relay</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
- <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">Die Gesamtzahl der von dieser Gegenstelle empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
- <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Die Gesamtzahl der von dieser Gegenstelle empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
- </message>
- <message>
- <source>Addresses Processed</source>
- <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">Verarbeitete Adressen</translation>
- </message>
- <message>
- <source>Addresses Rate-Limited</source>
- <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Ratenbeschränkte Adressen</translation>
- </message>
- <message>
- <source>User Agent</source>
- <translation type="unfinished">User-Agent</translation>
- </message>
- <message>
- <source>Current block height</source>
- <translation type="unfinished">Aktuelle Blockhöhe</translation>
- </message>
- <message>
- <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation type="unfinished">Öffnet die %1-Debug-Protokolldatei aus dem aktuellen Datenverzeichnis. Dies kann bei großen Protokolldateien einige Sekunden dauern.</translation>
- </message>
- <message>
- <source>Decrease font size</source>
- <translation type="unfinished">Schrift verkleinern</translation>
- </message>
- <message>
- <source>Increase font size</source>
- <translation type="unfinished">Schrift vergrößern</translation>
- </message>
- <message>
- <source>Permissions</source>
- <translation type="unfinished">Berechtigungen</translation>
- </message>
- <message>
- <source>The direction and type of peer connection: %1</source>
- <translation type="unfinished">Die Richtung und der Typ der Gegenstellen-Verbindung: %1</translation>
- </message>
- <message>
- <source>Direction/Type</source>
- <translation type="unfinished">Richtung/Typ</translation>
- </message>
- <message>
- <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">Das Netzwerkprotokoll, über das diese Gegenstelle verbunden ist, ist: IPv4, IPv6, Onion, I2P oder CJDNS.</translation>
- </message>
- <message>
- <source>Services</source>
- <translation type="unfinished">Dienste</translation>
- </message>
- <message>
- <source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">Kompakte BIP152 Blockweiterleitung mit hoher Bandbreite: %1</translation>
- </message>
- <message>
- <source>High Bandwidth</source>
- <translation type="unfinished">Hohe Bandbreite</translation>
- </message>
- <message>
- <source>Connection Time</source>
- <translation type="unfinished">Verbindungsdauer</translation>
- </message>
- <message>
- <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
- <translation type="unfinished">Abgelaufene Zeit seitdem ein neuer Block mit erfolgreichen initialen Gültigkeitsprüfungen von dieser Gegenstelle empfangen wurde.</translation>
- </message>
- <message>
- <source>Last Block</source>
- <translation type="unfinished">Letzter Block</translation>
- </message>
- <message>
- <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
- <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">Abgelaufene Zeit seit eine neue Transaktion, die in unseren Speicherpool hineingelassen wurde, von dieser Gegenstelle empfangen wurde.</translation>
- </message>
- <message>
- <source>Last Send</source>
- <translation type="unfinished">Letzte Ãœbertragung</translation>
- </message>
- <message>
- <source>Last Receive</source>
- <translation type="unfinished">Letzter Empfang</translation>
- </message>
- <message>
- <source>Ping Time</source>
- <translation type="unfinished">Ping-Zeit</translation>
- </message>
- <message>
- <source>The duration of a currently outstanding ping.</source>
- <translation type="unfinished">Die Laufzeit eines aktuell ausstehenden Ping.</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">Ping-Wartezeit</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">Minimaler Ping</translation>
- </message>
- <message>
- <source>Time Offset</source>
- <translation type="unfinished">Zeitversatz</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Letzte Blockzeit</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished">&amp;Öffnen</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">&amp;Konsole</translation>
- </message>
- <message>
- <source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;Netzwerkauslastung</translation>
- </message>
- <message>
- <source>Totals</source>
- <translation type="unfinished">Gesamtbetrag:</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">Debug-Protokolldatei</translation>
- </message>
- <message>
- <source>Clear console</source>
- <translation type="unfinished">Konsole zurücksetzen</translation>
- </message>
- <message>
- <source>In:</source>
- <translation type="unfinished">Eingehend:</translation>
- </message>
- <message>
- <source>Out:</source>
- <translation type="unfinished">Ausgehend:</translation>
- </message>
- <message>
- <source>Inbound: initiated by peer</source>
- <extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">Eingehend: wurde von Gegenstelle initiiert</translation>
- </message>
- <message>
- <source>Outbound Full Relay: default</source>
- <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">Ausgehende vollständige Weiterleitung: Standard</translation>
- </message>
- <message>
- <source>Outbound Block Relay: does not relay transactions or addresses</source>
- <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Ausgehende Blockweiterleitung: leitet Transaktionen und Adressen nicht weiter</translation>
- </message>
- <message>
- <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
- <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">Ausgehend Manuell: durch die RPC %1 oder %2/%3 Konfigurationsoptionen hinzugefügt</translation>
- </message>
- <message>
- <source>Outbound Feeler: short-lived, for testing addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Ausgehender Fühler: kurzlebig, zum Testen von Adressen</translation>
- </message>
- <message>
- <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">Ausgehende Adressensammlung: kurzlebig, zum Anfragen von Adressen</translation>
- </message>
- <message>
- <source>detecting: peer could be v1 or v2</source>
- <extracomment>Explanatory text for "detecting" transport type.</extracomment>
- <translation type="unfinished">Erkennen: Peer könnte v1 oder v2 sein</translation>
- </message>
- <message>
- <source>v1: unencrypted, plaintext transport protocol</source>
- <extracomment>Explanatory text for v1 transport type.</extracomment>
- <translation type="unfinished">V1: Unverschlüsseltes Klartext-Transportprotokoll</translation>
- </message>
- <message>
- <source>v2: BIP324 encrypted transport protocol</source>
- <extracomment>Explanatory text for v2 transport type.</extracomment>
- <translation type="unfinished">v2: BIP324 verschlüsseltes Transportprotokoll</translation>
- </message>
- <message>
- <source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">Wir haben die Gegenstelle zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
- </message>
- <message>
- <source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">Die Gegenstelle hat uns zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
- </message>
- <message>
- <source>no high bandwidth relay selected</source>
- <translation type="unfinished">Keine Weiterleitung mit hoher Bandbreite ausgewählt</translation>
- </message>
- <message>
- <source>Ctrl++</source>
- <extracomment>Main shortcut to increase the RPC console font size.</extracomment>
- <translation type="unfinished">Strg++</translation>
- </message>
- <message>
- <source>Ctrl+=</source>
- <extracomment>Secondary shortcut to increase the RPC console font size.</extracomment>
- <translation type="unfinished">Strg+=</translation>
- </message>
- <message>
- <source>Ctrl+-</source>
- <extracomment>Main shortcut to decrease the RPC console font size.</extracomment>
- <translation type="unfinished">Strg+-</translation>
- </message>
- <message>
- <source>Ctrl+_</source>
- <extracomment>Secondary shortcut to decrease the RPC console font size.</extracomment>
- <translation type="unfinished">Strg+_</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <extracomment>Context menu action to copy the address of a peer.</extracomment>
- <translation type="unfinished">&amp;Adresse kopieren</translation>
- </message>
- <message>
- <source>&amp;Disconnect</source>
- <translation type="unfinished">&amp;Trennen</translation>
- </message>
- <message>
- <source>1 &amp;hour</source>
- <translation type="unfinished">1 &amp;Stunde</translation>
- </message>
- <message>
- <source>1 d&amp;ay</source>
- <translation type="unfinished">1 T&amp;ag</translation>
- </message>
- <message>
- <source>1 &amp;week</source>
- <translation type="unfinished">1 &amp;Woche</translation>
- </message>
- <message>
- <source>1 &amp;year</source>
- <translation type="unfinished">1 &amp;Jahr</translation>
- </message>
- <message>
- <source>&amp;Copy IP/Netmask</source>
- <extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
- <translation type="unfinished">&amp;Kopiere IP/Netzmaske</translation>
- </message>
- <message>
- <source>&amp;Unban</source>
- <translation type="unfinished">&amp;Entsperren</translation>
- </message>
- <message>
- <source>Network activity disabled</source>
- <translation type="unfinished">Netzwerkaktivität deaktiviert</translation>
- </message>
- <message>
- <source>Executing command without any wallet</source>
- <translation type="unfinished">Befehl wird ohne spezifizierte Wallet ausgeführt</translation>
- </message>
- <message>
- <source>Ctrl+I</source>
- <translation type="unfinished">Strg+I</translation>
- </message>
- <message>
- <source>Ctrl+T</source>
- <translation type="unfinished">Strg+T</translation>
- </message>
- <message>
- <source>Ctrl+N</source>
- <translation type="unfinished">Strg+N</translation>
- </message>
- <message>
- <source>Ctrl+P</source>
- <translation type="unfinished">Strg+P</translation>
- </message>
- <message>
- <source>Node window - [%1]</source>
- <translation type="unfinished">Node-Fenster - [%1]</translation>
- </message>
- <message>
- <source>Executing command using "%1" wallet</source>
- <translation type="unfinished">Befehl wird mit Wallet "%1" ausgeführt</translation>
- </message>
- <message>
- <source>Welcome to the %1 RPC console.
-Use up and down arrows to navigate history, and %2 to clear screen.
-Use %3 and %4 to increase or decrease the font size.
-Type %5 for an overview of available commands.
-For more information on using this console, type %6.
-
-%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
- <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">Willkommen bei der %1 RPC Konsole.
-Benutze die Auf/Ab Pfeiltasten, um durch die Historie zu navigieren, und %2, um den Bildschirm zu löschen.
-Benutze %3 und %4, um die Fontgröße zu vergrößern bzw. verkleinern.
-Tippe %5 für einen Überblick über verfügbare Befehle.
-Für weitere Informationen über diese Konsole, tippe %6.
-
-%7 ACHTUNG: Es sind Betrüger zu Gange, die Benutzer anweisen, hier Kommandos einzugeben, wodurch sie den Inhalt der Wallet stehlen können. Benutze diese Konsole nicht, ohne die Implikationen eines Kommandos vollständig zu verstehen.%8</translation>
- </message>
- <message>
- <source>Executing…</source>
- <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
- <translation type="unfinished">Ausführen…</translation>
- </message>
- <message>
- <source>(peer: %1)</source>
- <translation type="unfinished">(Gegenstelle: %1)</translation>
- </message>
- <message>
- <source>via %1</source>
- <translation type="unfinished">über %1</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation type="unfinished">Ja</translation>
- </message>
- <message>
- <source>No</source>
- <translation type="unfinished">Nein</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">An</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">Von</translation>
- </message>
- <message>
- <source>Ban for</source>
- <translation type="unfinished">Sperren für</translation>
- </message>
- <message>
- <source>Never</source>
- <translation type="unfinished">Nie</translation>
- </message>
- <message>
- <source>Unknown</source>
- <translation type="unfinished">Unbekannt</translation>
- </message>
-</context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>&amp;Amount:</source>
- <translation type="unfinished">&amp;Betrag:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Bezeichnung:</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">&amp;Nachricht:</translation>
- </message>
- <message>
- <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">Eine optionale Nachricht, die an die Zahlungsanforderung angehängt wird. Sie wird angezeigt, wenn die Anforderung geöffnet wird. Hinweis: Diese Nachricht wird nicht mit der Zahlung über das Bitcoin-Netzwerk gesendet.</translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address.</source>
- <translation type="unfinished">Eine optionale Bezeichnung, die der neuen Empfangsadresse zugeordnet wird.</translation>
- </message>
- <message>
- <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">Verwenden Sie dieses Formular, um Zahlungen anzufordern. Alle Felder sind &lt;b&gt;optional&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
- <translation type="unfinished">Ein optional angeforderter Betrag. Lassen Sie dieses Feld leer oder setzen Sie es auf 0, um keinen spezifischen Betrag anzufordern.</translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">Ein optionales Etikett zu einer neuen Empfängeradresse (für dich zum Identifizieren einer Rechnung). Es wird auch der Zahlungsanforderung beigefügt.</translation>
- </message>
- <message>
- <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
- <translation type="unfinished">Eine optionale Nachricht, die der Zahlungsanforderung beigefügt wird und dem Absender angezeigt werden kann.</translation>
- </message>
- <message>
- <source>&amp;Create new receiving address</source>
- <translation type="unfinished">&amp;Neue Empfangsadresse erstellen</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">Alle Formularfelder zurücksetzen.</translation>
- </message>
- <message>
- <source>Clear</source>
- <translation type="unfinished">Zurücksetzen</translation>
- </message>
- <message>
- <source>Requested payments history</source>
- <translation type="unfinished">Verlauf der angeforderten Zahlungen</translation>
- </message>
- <message>
- <source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Ausgewählte Zahlungsanforderungen anzeigen (entspricht einem Doppelklick auf einen Eintrag)</translation>
- </message>
- <message>
- <source>Show</source>
- <translation type="unfinished">Anzeigen</translation>
- </message>
- <message>
- <source>Remove the selected entries from the list</source>
- <translation type="unfinished">Ausgewählte Einträge aus der Liste entfernen</translation>
- </message>
- <message>
- <source>Remove</source>
- <translation type="unfinished">Entfernen</translation>
- </message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">&amp;URI kopieren</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">&amp;Adresse kopieren</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">&amp;Bezeichnung kopieren</translation>
- </message>
- <message>
- <source>Copy &amp;message</source>
- <translation type="unfinished">&amp;Nachricht kopieren</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">&amp;Betrag kopieren</translation>
- </message>
- <message>
- <source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">Nicht zu empfehlen aufgrund höherer Gebühren und geringerem Schutz vor Tippfehlern.</translation>
- </message>
- <message>
- <source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">Generiert eine Adresse, die mit älteren Wallets kompatibel ist.</translation>
- </message>
- <message>
- <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">Generiert eine native Segwit-Adresse (BIP-173). Einige alte Wallets unterstützen es nicht.</translation>
- </message>
- <message>
- <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) ist ein Upgrade auf Bech32, Wallet-Unterstützung ist immer noch eingeschränkt.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Wallet konnte nicht entsperrt werden.</translation>
- </message>
- <message>
- <source>Could not generate new %1 address</source>
- <translation type="unfinished">Konnte neue %1 Adresse nicht erzeugen.</translation>
- </message>
-</context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Request payment to …</source>
- <translation type="unfinished">Zahlung anfordern an ...</translation>
- </message>
- <message>
- <source>Address:</source>
- <translation type="unfinished">Adresse:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Betrag:</translation>
- </message>
- <message>
- <source>Label:</source>
- <translation type="unfinished">Bezeichnung:</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Nachricht:</translation>
- </message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">&amp;URI kopieren</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">&amp;Adresse kopieren</translation>
- </message>
- <message>
- <source>&amp;Verify</source>
- <translation type="unfinished">&amp;Überprüfen</translation>
- </message>
- <message>
- <source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">Verifizieren Sie diese Adresse z.B. auf dem Display Ihres Hardware-Wallets</translation>
- </message>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;Bild speichern...</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation type="unfinished">Zahlungsinformationen</translation>
- </message>
- <message>
- <source>Request payment to %1</source>
- <translation type="unfinished">Zahlung anfordern an %1</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation type="unfinished">Datum</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Bezeichnung</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Nachricht</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(keine Bezeichnung)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation type="unfinished">(keine Nachricht)</translation>
- </message>
- <message>
- <source>(no amount requested)</source>
- <translation type="unfinished">(kein Betrag angefordert)</translation>
- </message>
- <message>
- <source>Requested</source>
- <translation type="unfinished">Angefordert</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation type="unfinished">Bitcoins überweisen</translation>
- </message>
- <message>
- <source>Coin Control Features</source>
- <translation type="unfinished">"Coin Control"-Funktionen</translation>
- </message>
- <message>
- <source>automatically selected</source>
- <translation type="unfinished">automatisch ausgewählt</translation>
- </message>
- <message>
- <source>Insufficient funds!</source>
- <translation type="unfinished">Unzureichender Kontostand!</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">Anzahl:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Betrag:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">Gebühr:</translation>
- </message>
- <message>
- <source>After Fee:</source>
- <translation type="unfinished">Abzüglich Gebühr:</translation>
- </message>
- <message>
- <source>Change:</source>
- <translation type="unfinished">Wechselgeld:</translation>
- </message>
- <message>
- <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
- <translation type="unfinished">Wenn dies aktiviert ist, aber die Wechselgeld-Adresse leer oder ungültig ist, wird das Wechselgeld an eine neu generierte Adresse gesendet.</translation>
- </message>
- <message>
- <source>Custom change address</source>
- <translation type="unfinished">Benutzerdefinierte Wechselgeld-Adresse</translation>
- </message>
- <message>
- <source>Transaction Fee:</source>
- <translation type="unfinished">Transaktionsgebühr:</translation>
- </message>
- <message>
- <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">Die Verwendung der "fallbackfee" kann dazu führen, dass eine gesendete Transaktion erst nach mehreren Stunden oder Tagen (oder nie) bestätigt wird. Erwägen Sie, Ihre Gebühr manuell auszuwählen oder warten Sie, bis Sie die gesamte Chain validiert haben.</translation>
- </message>
- <message>
- <source>Warning: Fee estimation is currently not possible.</source>
- <translation type="unfinished">Achtung: Berechnung der Gebühr ist momentan nicht möglich.</translation>
- </message>
- <message>
- <source>per kilobyte</source>
- <translation type="unfinished">pro Kilobyte</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">Ausblenden</translation>
- </message>
- <message>
- <source>Recommended:</source>
- <translation type="unfinished">Empfehlungen:</translation>
- </message>
- <message>
- <source>Custom:</source>
- <translation type="unfinished">Benutzerdefiniert:</translation>
- </message>
- <message>
- <source>Send to multiple recipients at once</source>
- <translation type="unfinished">An mehrere Empfänger auf einmal überweisen</translation>
- </message>
- <message>
- <source>Add &amp;Recipient</source>
- <translation type="unfinished">Empfänger &amp;hinzufügen</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">Alle Formularfelder zurücksetzen.</translation>
- </message>
- <message>
- <source>Inputs…</source>
- <translation type="unfinished">Eingaben...</translation>
- </message>
- <message>
- <source>Choose…</source>
- <translation type="unfinished">Auswählen...</translation>
- </message>
- <message>
- <source>Hide transaction fee settings</source>
- <translation type="unfinished">Einstellungen für Transaktionsgebühr nicht anzeigen</translation>
- </message>
- <message>
- <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
-
-Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">Gib manuell eine Gebühr pro kB (1.000 Bytes) der virtuellen Transaktionsgröße an.
-
-Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebührenrate von "100 Satoshis per kvB" für eine Transaktion von 500 virtuellen Bytes (die Hälfte von 1 kvB) letztlich zu einer Gebühr von nur 50 Satoshis.</translation>
- </message>
- <message>
- <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation type="unfinished">Nur die minimale Gebühr zu bezahlen ist so lange in Ordnung, wie weniger Transaktionsvolumen als Platz in den Blöcken vorhanden ist. Aber Vorsicht, diese Option kann dazu führen, dass Transaktionen nicht bestätigt werden, wenn mehr Bedarf an Bitcoin-Transaktionen besteht als das Netzwerk verarbeiten kann.</translation>
- </message>
- <message>
- <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">Eine niedrige Gebühr kann dazu führen das eine Transaktion niemals bestätigt wird (Lesen sie die Anmerkung).</translation>
- </message>
- <message>
- <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">(Intelligente Gebühr noch nicht initialisiert. Das dauert normalerweise ein paar Blocks…)</translation>
- </message>
- <message>
- <source>Confirmation time target:</source>
- <translation type="unfinished">Bestätigungsziel:</translation>
- </message>
- <message>
- <source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Aktiviere Replace-By-Fee</translation>
- </message>
- <message>
- <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">Mit Replace-By-Fee (BIP-125) kann die Transaktionsgebühr nach dem Senden erhöht werden. Ohne dies wird eine höhere Gebühr empfohlen, um das Risiko einer hohen Transaktionszeit zu reduzieren.</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">&amp;Zurücksetzen</translation>
- </message>
- <message>
- <source>Balance:</source>
- <translation type="unfinished">Kontostand:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation type="unfinished">Überweisung bestätigen</translation>
- </message>
- <message>
- <source>S&amp;end</source>
- <translation type="unfinished">&amp;Ãœberweisen</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">Anzahl kopieren</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation type="unfinished">Betrag kopieren</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation type="unfinished">Gebühr kopieren</translation>
- </message>
- <message>
<source>Copy after fee</source>
<translation type="unfinished">Abzüglich Gebühr kopieren</translation>
</message>
- <message>
- <source>Copy bytes</source>
- <translation type="unfinished">Bytes kopieren</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">Wechselgeld kopieren</translation>
- </message>
- <message>
- <source>%1 (%2 blocks)</source>
- <translation type="unfinished">%1 (%2 Blöcke)</translation>
- </message>
- <message>
- <source>Sign on device</source>
- <extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">Gerät anmelden</translation>
- </message>
- <message>
- <source>Connect your hardware wallet first.</source>
- <translation type="unfinished">Verbinden Sie zunächst Ihre Hardware-Wallet</translation>
- </message>
- <message>
- <source>Set external signer script path in Options -&gt; Wallet</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Pfad für externes Signierskript in Optionen festlegen -&gt; Wallet</translation>
- </message>
- <message>
- <source>Cr&amp;eate Unsigned</source>
- <translation type="unfinished">Unsigniert &amp;erzeugen</translation>
- </message>
- <message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">Erzeugt eine teilsignierte Bitcoin Transaktion (PSBT) zur Benutzung mit z.B. einem Offline %1 Wallet, oder einem kompatiblen Hardware Wallet.</translation>
- </message>
- <message>
- <source>%1 to '%2'</source>
- <translation type="unfinished">%1 an '%2'</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation type="unfinished">%1 an %2</translation>
- </message>
- <message>
- <source>To review recipient list click "Show Details…"</source>
- <translation type="unfinished">Um die Empfängerliste zu sehen, klicke auf "Zeige Details…"</translation>
- </message>
- <message>
- <source>Sign failed</source>
- <translation type="unfinished">Signierung der Nachricht fehlgeschlagen</translation>
- </message>
- <message>
- <source>External signer not found</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Es konnte kein externes Gerät zum signieren gefunden werden</translation>
- </message>
- <message>
- <source>External signer failure</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Signierung durch externes Gerät fehlgeschlagen</translation>
- </message>
- <message>
- <source>Save Transaction Data</source>
- <translation type="unfinished">Speichere Transaktionsdaten</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (Binary)</source>
- <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Teilweise signierte Transaktion (binär)</translation>
- </message>
- <message>
- <source>PSBT saved</source>
- <extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">PSBT gespeichert</translation>
- </message>
- <message>
- <source>External balance:</source>
- <translation type="unfinished">Externe Bilanz:</translation>
- </message>
- <message>
- <source>or</source>
- <translation type="unfinished">oder</translation>
- </message>
- <message>
- <source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">Sie können die Gebühr später erhöhen (signalisiert Replace-By-Fee, BIP-125).</translation>
- </message>
- <message>
- <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
- <translation type="unfinished">Überprüfen Sie bitte Ihr Transaktionsvorhaben. Dadurch wird eine Partiell Signierte Bitcoin-Transaktion (PSBT) erstellt, die Sie speichern oder kopieren und dann z. B. mit einer Offline-Wallet %1 oder einer PSBT-kompatible Hardware-Wallet nutzen können.</translation>
- </message>
- <message>
- <source>%1 from wallet '%2'</source>
- <translation type="unfinished">%1 von Wallet '%2'</translation>
- </message>
- <message>
- <source>Do you want to create this transaction?</source>
- <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
- <translation type="unfinished">Möchtest du diese Transaktion erstellen?</translation>
- </message>
- <message>
- <source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">Bitte überprüfen Sie Ihre Transaktion. Sie können diese Transaktion erstellen und versenden oder eine Partiell Signierte Bitcoin Transaction (PSBT) erstellen, die Sie speichern oder kopieren und dann z.B. mit einer offline %1 Wallet oder einer PSBT-kompatiblen Hardware-Wallet signieren können.</translation>
- </message>
- <message>
- <source>Please, review your transaction.</source>
- <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">Bitte überprüfen sie ihre Transaktion.</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">Transaktionsgebühr</translation>
- </message>
- <message>
- <source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">Replace-By-Fee, BIP-125 wird nicht angezeigt.</translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">Gesamtbetrag</translation>
- </message>
- <message>
- <source>Unsigned Transaction</source>
- <comment>PSBT copied</comment>
- <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">Unsignierte Transaktion</translation>
- </message>
- <message>
- <source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">Die PSBT wurde in die Zwischenablage kopiert. Kann auch abgespeichert werden.</translation>
- </message>
- <message>
- <source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT auf Festplatte gespeichert</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation type="unfinished">Überweisung bestätigen</translation>
- </message>
- <message>
- <source>Watch-only balance:</source>
- <translation type="unfinished">Nur-Anzeige Saldo:</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">Die Zahlungsadresse ist ungültig, bitte nochmals überprüfen.</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">Der zu zahlende Betrag muss größer als 0 sein.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation type="unfinished">Der angegebene Betrag übersteigt Ihren Kontostand.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">Der angegebene Betrag übersteigt aufgrund der Transaktionsgebühr in Höhe von %1 Ihren Kontostand.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">Doppelte Adresse entdeckt: Adressen sollten jeweils nur einmal benutzt werden.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation type="unfinished">Transaktionserstellung fehlgeschlagen!</translation>
- </message>
- <message>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">Eine höhere Gebühr als %1 wird als unsinnig hohe Gebühr angesehen.</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Block</numerusform>
- <numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Blöcken</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">Warnung: Ungültige Bitcoin-Adresse</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation type="unfinished">Warnung: Unbekannte Wechselgeld-Adresse</translation>
- </message>
- <message>
- <source>Confirm custom change address</source>
- <translation type="unfinished">Bestätige benutzerdefinierte Wechselgeld-Adresse</translation>
- </message>
- <message>
- <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
- <translation type="unfinished">Die ausgewählte Wechselgeld-Adresse ist nicht Bestandteil dieses Wallets. Einige oder alle Mittel aus Ihrem Wallet könnten an diese Adresse gesendet werden. Wollen Sie das wirklich?</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(keine Bezeichnung)</translation>
- </message>
-</context>
-<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>A&amp;mount:</source>
- <translation type="unfinished">Betra&amp;g:</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">E&amp;mpfänger:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Bezeichnung:</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">Bereits verwendete Adresse auswählen</translation>
- </message>
- <message>
- <source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">Die Zahlungsadresse der Ãœberweisung</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Adresse aus der Zwischenablage einfügen</translation>
- </message>
- <message>
- <source>Remove this entry</source>
- <translation type="unfinished">Diesen Eintrag entfernen</translation>
- </message>
- <message>
- <source>The amount to send in the selected unit</source>
- <translation type="unfinished">Zu sendender Betrag in der ausgewählten Einheit</translation>
- </message>
- <message>
- <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
- <translation type="unfinished">Die Gebühr wird vom zu überweisenden Betrag abgezogen. Der Empfänger wird also weniger Bitcoins erhalten, als Sie im Betrags-Feld eingegeben haben. Falls mehrere Empfänger ausgewählt wurden, wird die Gebühr gleichmäßig verteilt.</translation>
- </message>
- <message>
- <source>S&amp;ubtract fee from amount</source>
- <translation type="unfinished">Gebühr vom Betrag ab&amp;ziehen</translation>
- </message>
- <message>
- <source>Use available balance</source>
- <translation type="unfinished">Benutze verfügbaren Kontostand</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Nachricht:</translation>
- </message>
- <message>
- <source>Enter a label for this address to add it to the list of used addresses</source>
- <translation type="unfinished">Bezeichnung für diese Adresse eingeben, um sie zur Liste bereits verwendeter Adressen hinzuzufügen.</translation>
- </message>
- <message>
- <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Eine an die "bitcoin:"-URI angefügte Nachricht, die zusammen mit der Transaktion gespeichert wird. Hinweis: Diese Nachricht wird nicht über das Bitcoin-Netzwerk gesendet.</translation>
- </message>
-</context>
-<context>
- <name>SendConfirmationDialog</name>
- <message>
- <source>Send</source>
- <translation type="unfinished">Senden</translation>
- </message>
- <message>
- <source>Create Unsigned</source>
- <translation type="unfinished">Unsigniert erstellen</translation>
- </message>
-</context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Signaturen - eine Nachricht signieren / verifizieren</translation>
- </message>
- <message>
- <source>&amp;Sign Message</source>
- <translation type="unfinished">Nachricht &amp;signieren</translation>
- </message>
- <message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Sie können Nachrichten/Vereinbarungen mit Hilfe Ihrer Adressen signieren, um zu beweisen, dass Sie Bitcoins empfangen können, die an diese Adressen überwiesen werden. Seien Sie vorsichtig und signieren Sie nichts Vages oder Willkürliches, um Ihre Indentität vor Phishingangriffen zu schützen. Signieren Sie nur vollständig-detaillierte Aussagen, mit denen Sie auch einverstanden sind.</translation>
- </message>
- <message>
- <source>The Bitcoin address to sign the message with</source>
- <translation type="unfinished">Die Bitcoin-Adresse, mit der die Nachricht signiert wird</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">Bereits verwendete Adresse auswählen</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Adresse aus der Zwischenablage einfügen</translation>
- </message>
- <message>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished">Zu signierende Nachricht hier eingeben</translation>
- </message>
- <message>
- <source>Signature</source>
- <translation type="unfinished">Signatur</translation>
- </message>
- <message>
- <source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">Aktuelle Signatur in die Zwischenablage kopieren</translation>
- </message>
- <message>
- <source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Die Nachricht signieren, um den Besitz dieser Bitcoin-Adresse zu beweisen</translation>
- </message>
- <message>
- <source>Sign &amp;Message</source>
- <translation type="unfinished">&amp;Nachricht signieren</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">Alle "Nachricht signieren"-Felder zurücksetzen</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">&amp;Zurücksetzen</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">Nachricht &amp;verifizieren</translation>
- </message>
- <message>
- <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
- <translation type="unfinished">Geben Sie die Zahlungsadresse des Empfängers, Nachricht (achten Sie darauf Zeilenumbrüche, Leerzeichen, Tabulatoren usw. exakt zu kopieren) und Signatur unten ein, um die Nachricht zu verifizieren. Vorsicht, interpretieren Sie nicht mehr in die Signatur hinein, als in der signierten Nachricht selber enthalten ist, um nicht von einem Man-in-the-middle-Angriff hinters Licht geführt zu werden. Beachten Sie, dass dies nur beweist, dass die signierende Partei über diese Adresse Überweisungen empfangen kann.</translation>
- </message>
- <message>
- <source>The Bitcoin address the message was signed with</source>
- <translation type="unfinished">Die Bitcoin-Adresse, mit der die Nachricht signiert wurde</translation>
- </message>
- <message>
- <source>The signed message to verify</source>
- <translation type="unfinished">Die zu überprüfende signierte Nachricht</translation>
- </message>
- <message>
- <source>The signature given when the message was signed</source>
- <translation type="unfinished">Die beim Signieren der Nachricht geleistete Signatur</translation>
- </message>
- <message>
- <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Die Nachricht verifizieren, um sicherzustellen, dass diese mit der angegebenen Bitcoin-Adresse signiert wurde</translation>
- </message>
- <message>
- <source>Verify &amp;Message</source>
- <translation type="unfinished">&amp;Nachricht verifizieren</translation>
- </message>
- <message>
- <source>Reset all verify message fields</source>
- <translation type="unfinished">Alle "Nachricht verifizieren"-Felder zurücksetzen</translation>
- </message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Auf "Nachricht signieren" klicken, um die Signatur zu erzeugen</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation type="unfinished">Die eingegebene Adresse ist ungültig.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation type="unfinished">Bitte überprüfen Sie die Adresse und versuchen Sie es erneut.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Die eingegebene Adresse verweist nicht auf einen Schlüssel.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation type="unfinished">Wallet-Entsperrung wurde abgebrochen.</translation>
- </message>
- <message>
- <source>No error</source>
- <translation type="unfinished">Kein Fehler</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation type="unfinished">Privater Schlüssel zur eingegebenen Adresse ist nicht verfügbar.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation type="unfinished">Signierung der Nachricht fehlgeschlagen.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation type="unfinished">Nachricht signiert.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation type="unfinished">Die Signatur konnte nicht dekodiert werden.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">Bitte überprüfen Sie die Signatur und versuchen Sie es erneut.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation type="unfinished">Die Signatur entspricht nicht dem "Message Digest".</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation type="unfinished">Verifizierung der Nachricht fehlgeschlagen.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">Nachricht verifiziert.</translation>
- </message>
-</context>
-<context>
- <name>SplashScreen</name>
- <message>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(drücke q, um herunterzufahren und später fortzuführen)</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">q zum Herunterfahren drücken</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionDesc</name>
- <message>
- <source>conflicted with a transaction with %1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
- <translation type="unfinished">steht im Konflikt mit einer Transaktion mit %1 Bestätigungen</translation>
- </message>
- <message>
- <source>0/unconfirmed, in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/unbestätigt, im Speicherpool</translation>
- </message>
- <message>
- <source>0/unconfirmed, not in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/unbestätigt, nicht im Speicherpool</translation>
- </message>
- <message>
- <source>abandoned</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
- <translation type="unfinished">eingestellt</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
- <translation type="unfinished">%1/unbestätigt</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
- <translation type="unfinished">%1 Bestätigungen</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Datum</translation>
- </message>
- <message>
- <source>Source</source>
- <translation type="unfinished">Quelle</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation type="unfinished">Erzeugt</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">Von</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">unbekannt</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">An</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">eigene Adresse</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">beobachtet</translation>
- </message>
- <message>
- <source>label</source>
- <translation type="unfinished">Bezeichnung</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation type="unfinished">Gutschrift</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>reift noch %n weiteren Block</numerusform>
- <numerusform>reift noch %n weitere Blöcken</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<message>
- <source>not accepted</source>
- <translation type="unfinished">nicht angenommen</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation type="unfinished">Belastung</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation type="unfinished">Gesamtbelastung</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation type="unfinished">Gesamtgutschrift</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">Transaktionsgebühr</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation type="unfinished">Nettobetrag</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Nachricht</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">Kommentar</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation type="unfinished">Transaktionskennung</translation>
- </message>
- <message>
- <source>Transaction total size</source>
- <translation type="unfinished">Gesamte Transaktionsgröße</translation>
- </message>
- <message>
- <source>Transaction virtual size</source>
- <translation type="unfinished">Virtuelle Größe der Transaktion</translation>
- </message>
- <message>
- <source>Output index</source>
- <translation type="unfinished">Ausgabeindex</translation>
- </message>
- <message>
- <source>%1 (Certificate was not verified)</source>
- <translation type="unfinished">%1 (Zertifikat wurde nicht verifiziert)</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation type="unfinished">Händler</translation>
- </message>
- <message>
- <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation type="unfinished">Erzeugte Bitcoins müssen %1 Blöcke lang reifen, bevor sie ausgegeben werden können. Als Sie diesen Block erzeugten, wurde er an das Netzwerk übertragen, um ihn der Blockchain hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und Sie werden keine Bitcoins gutgeschrieben bekommen. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block fast zeitgleich erzeugt.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation type="unfinished">Debug-Informationen</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation type="unfinished">Transaktion</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation type="unfinished">Eingaben</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">Betrag</translation>
</message>
- <message>
- <source>true</source>
- <translation type="unfinished">wahr</translation>
- </message>
- <message>
- <source>false</source>
- <translation type="unfinished">falsch</translation>
- </message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
- <message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Dieser Bereich zeigt eine detaillierte Beschreibung der Transaktion an</translation>
- </message>
- <message>
- <source>Details for %1</source>
- <translation type="unfinished">Details für %1</translation>
- </message>
-</context>
-<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation type="unfinished">Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation type="unfinished">Typ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Bezeichnung</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation type="unfinished">Unbestätigt</translation>
- </message>
- <message>
- <source>Abandoned</source>
- <translation type="unfinished">Eingestellt</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation type="unfinished">Wird bestätigt (%1 von %2 empfohlenen Bestätigungen)</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">Bestätigt (%1 Bestätigungen)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation type="unfinished">in Konflikt stehend</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">Unreif (%1 Bestätigungen, wird verfügbar sein nach %2)</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation type="unfinished">Generiert, aber nicht akzeptiert</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Empfangen über</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation type="unfinished">Empfangen von</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Ãœberwiesen an</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Erarbeitet</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">beobachtet</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation type="unfinished">(k.A.)</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(keine Bezeichnung)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">Transaktionsstatus. Fahren Sie mit der Maus über dieses Feld, um die Anzahl der Bestätigungen zu sehen.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation type="unfinished">Datum und Zeit als die Transaktion empfangen wurde.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation type="unfinished">Art der Transaktion</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">Zeigt an, ob eine beobachtete Adresse in diese Transaktion involviert ist.</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation type="unfinished">Benutzerdefinierter Verwendungszweck der Transaktion</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Der Betrag, der dem Kontostand abgezogen oder hinzugefügt wurde.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation type="unfinished">Alle</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">Heute</translation>
- </message>
- <message>
- <source>This week</source>
- <translation type="unfinished">Diese Woche</translation>
- </message>
- <message>
- <source>This month</source>
- <translation type="unfinished">Diesen Monat</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation type="unfinished">Letzten Monat</translation>
- </message>
- <message>
- <source>This year</source>
- <translation type="unfinished">Dieses Jahr</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Empfangen über</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Ãœberwiesen an</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Erarbeitet</translation>
- </message>
- <message>
- <source>Other</source>
- <translation type="unfinished">Andere</translation>
- </message>
- <message>
- <source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">Zu suchende Adresse, Transaktion oder Bezeichnung eingeben</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation type="unfinished">Mindestbetrag</translation>
- </message>
- <message>
- <source>Range…</source>
- <translation type="unfinished">Bereich…</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">&amp;Adresse kopieren</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">&amp;Bezeichnung kopieren</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">&amp;Betrag kopieren</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Transaktionskennung kopieren</translation>
- </message>
- <message>
- <source>Copy &amp;raw transaction</source>
- <translation type="unfinished">&amp;Rohdaten der Transaktion kopieren</translation>
- </message>
- <message>
- <source>Copy full transaction &amp;details</source>
- <translation type="unfinished">Vollständige Transaktions&amp;details kopieren</translation>
- </message>
- <message>
- <source>&amp;Show transaction details</source>
- <translation type="unfinished">Transaktionsdetails &amp;anzeigen</translation>
- </message>
- <message>
- <source>Increase transaction &amp;fee</source>
- <translation type="unfinished">Transaktions&amp;gebühr erhöhen</translation>
- </message>
- <message>
- <source>A&amp;bandon transaction</source>
- <translation type="unfinished">Transaktion a&amp;bbrechen</translation>
- </message>
- <message>
- <source>&amp;Edit address label</source>
- <translation type="unfinished">Adressbezeichnung &amp;bearbeiten</translation>
- </message>
- <message>
- <source>Show in %1</source>
- <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
- <translation type="unfinished">Zeige in %1</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation type="unfinished">Transaktionsverlauf exportieren</translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Durch Komma getrennte Datei</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">Bestätigt</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation type="unfinished">beobachtet</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Datum</translation>
- </message>
- <message>
- <source>Type</source>
- <translation type="unfinished">Typ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Bezeichnung</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Adresse</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation type="unfinished">Exportieren fehlgeschlagen</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation type="unfinished">Beim Speichern des Transaktionsverlaufs nach %1 ist ein Fehler aufgetreten.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation type="unfinished">Exportieren erfolgreich</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">Speichern des Transaktionsverlaufs nach %1 war erfolgreich.</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation type="unfinished">Zeitraum:</translation>
- </message>
- <message>
- <source>to</source>
- <translation type="unfinished">bis</translation>
- </message>
-</context>
-<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.
-Go to File &gt; Open Wallet to load a wallet.
-- OR -</source>
- <translation type="unfinished">Es wurde keine Wallet geladen.
-Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
-- ODER-</translation>
- </message>
- <message>
- <source>Create a new wallet</source>
- <translation type="unfinished">Neues Wallet erstellen</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Fehler</translation>
- </message>
- <message>
- <source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">Konnte PSBT aus Zwischenablage nicht entschlüsseln (ungültiges Base64)</translation>
- </message>
- <message>
- <source>Load Transaction Data</source>
- <translation type="unfinished">Lade Transaktionsdaten</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">Teilsignierte Transaktion (*.psbt)</translation>
- </message>
- <message>
- <source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">PSBT-Datei muss kleiner als 100 MiB sein</translation>
- </message>
- <message>
- <source>Unable to decode PSBT</source>
- <translation type="unfinished">PSBT konnte nicht entschlüsselt werden</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">Bitcoins überweisen</translation>
- </message>
- <message>
- <source>Fee bump error</source>
- <translation type="unfinished">Gebührenerhöhungsfehler</translation>
- </message>
- <message>
- <source>Increasing transaction fee failed</source>
- <translation type="unfinished">Erhöhung der Transaktionsgebühr fehlgeschlagen</translation>
- </message>
- <message>
- <source>Do you want to increase the fee?</source>
- <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
- <translation type="unfinished">Möchten Sie die Gebühr erhöhen?</translation>
- </message>
- <message>
- <source>Current fee:</source>
- <translation type="unfinished">Aktuelle Gebühr:</translation>
- </message>
- <message>
- <source>Increase:</source>
- <translation type="unfinished">Erhöhung:</translation>
- </message>
- <message>
- <source>New fee:</source>
- <translation type="unfinished">Neue Gebühr:</translation>
- </message>
- <message>
- <source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <translation type="unfinished">Warnung: Hierdurch kann die zusätzliche Gebühr durch Verkleinerung von Wechselgeld Outputs oder nötigenfalls durch Hinzunahme weitere Inputs beglichen werden. Ein neuer Wechselgeld Output kann dabei entstehen, falls noch keiner existiert. Diese Änderungen können möglicherweise private Daten preisgeben.</translation>
- </message>
- <message>
- <source>Confirm fee bump</source>
- <translation type="unfinished">Gebührenerhöhung bestätigen</translation>
- </message>
- <message>
- <source>Can't draft transaction.</source>
- <translation type="unfinished">Kann Transaktion nicht entwerfen.</translation>
- </message>
- <message>
- <source>PSBT copied</source>
- <translation type="unfinished">PSBT kopiert</translation>
- </message>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">In die Zwischenablage kopiert </translation>
- </message>
- <message>
- <source>Can't sign transaction.</source>
- <translation type="unfinished">Signierung der Transaktion fehlgeschlagen.</translation>
- </message>
- <message>
- <source>Could not commit transaction</source>
- <translation type="unfinished">Konnte Transaktion nicht übergeben</translation>
- </message>
- <message>
- <source>Can't display address</source>
- <translation type="unfinished">Die Adresse kann nicht angezeigt werden</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">&amp;Exportieren</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Daten der aktuellen Ansicht in eine Datei exportieren</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation type="unfinished">Wallet sichern</translation>
- </message>
- <message>
- <source>Wallet Data</source>
- <extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Wallet-Daten</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation type="unfinished">Sicherung fehlgeschlagen</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation type="unfinished">Beim Speichern der Wallet-Daten nach %1 ist ein Fehler aufgetreten.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation type="unfinished">Sicherung erfolgreich</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">Speichern der Wallet-Daten nach %1 war erfolgreich.</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="unfinished">Abbrechen</translation>
- </message>
-</context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>The %s developers</source>
- <translation type="unfinished">Die %s-Entwickler</translation>
- </message>
- <message>
- <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s korrupt. Versuche mit dem Wallet-Werkzeug bitcoin-wallet zu retten, oder eine Sicherung wiederherzustellen.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s konnte den -assumeutxo-Snapshot-Status nicht validieren. Dies deutet auf ein Hardwareproblem, einen Fehler in der Software oder eine fehlerhafte Softwareänderung hin, die das Laden eines ungültigen Schnappschusses ermöglichte. Infolgedessen wird der Knoten heruntergefahren und verwendet keinen Zustand mehr, der auf dem Snapshot aufgebaut wurde, wodurch die Chain Height von %d auf %d zurückgesetzt wird. Beim nächsten Neustart nimmt der Knoten die Synchronisierung ab %d ohne Verwendung von Snapshot-Daten wieder auf. Bitte melden Sie diesen Vorfall an %s und geben Sie an, wie Sie den Snapshot erhalten haben. Der ungültige Snapshot-Chainstatus wird auf der Festplatte belassen, falls er bei der Diagnose des Problems, das diesen Fehler verursacht hat, hilfreich ist.</translation>
- </message>
- <message>
- <source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Bitcoin Core Gegenstellen mit ihm verbinden. Siehe doc/p2p-bad-ports.md für Details und eine vollständige Liste.</translation>
- </message>
- <message>
- <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">Kann Wallet Version nicht von Version %i auf Version %i abstufen. Wallet Version bleibt unverändert.</translation>
- </message>
- <message>
- <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">Datenverzeichnis %s kann nicht gesperrt werden. Evtl. wurde %s bereits gestartet.</translation>
- </message>
- <message>
- <source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
- <translation type="unfinished">Kann ein aufgespaltenes nicht-HD Wallet nicht von Version %i auf Version %i aktualisieren, ohne auf Unterstützung von Keypools vor der Aufspaltung zu aktualisieren. Bitte benutze Version%i oder keine bestimmte Version.</translation>
- </message>
- <message>
- <source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">Der Speicherplatz für %s reicht möglicherweise nicht für die Block-Dateien aus. In diesem Verzeichnis werden ca. %u GB an Daten gespeichert.</translation>
- </message>
- <message>
- <source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
- <translation type="unfinished">Veröffentlicht unter der MIT-Softwarelizenz, siehe beiliegende Datei %s oder %s.</translation>
- </message>
- <message>
- <source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">Fehler beim Laden der Wallet. Wallet erfordert das Herunterladen von Blöcken, und die Software unterstützt derzeit nicht das Laden von Wallets, während Blöcke außer der Reihe heruntergeladen werden, wenn assumeutxo-Snapshots verwendet werden. Die Wallet sollte erfolgreich geladen werden können, nachdem die Node-Synchronisation die Höhe %s erreicht hat.</translation>
- </message>
- <message>
- <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">Fehler beim Lesen von %s! Transaktionsdaten fehlen oder sind nicht korrekt. Wallet wird erneut gescannt.</translation>
- </message>
- <message>
- <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
- <translation type="unfinished">Fehler: Dumpdatei Format Eintrag ist Ungültig. Habe "%s" bekommen, aber "format" erwartet.</translation>
- </message>
- <message>
- <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">Fehler: Dumpdatei Identifikationseintrag ist ungültig. Habe "%s" bekommen, aber "%s" erwartet.</translation>
- </message>
- <message>
- <source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">Fehler: Die Version der Speicherauszugsdatei ist %s und wird nicht unterstützt. Diese Version von bitcoin-wallet unterstützt nur Speicherauszugsdateien der Version 1.</translation>
- </message>
- <message>
- <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
- <translation type="unfinished">Fehler: Legacy Wallets unterstützen nur die Adresstypen "legacy", "p2sh-segwit" und "bech32".</translation>
- </message>
- <message>
- <source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Fehler: Es können keine Deskriptoren für diese Legacy-Wallet erstellt werden. Stellen Sie sicher, dass Sie die Passphrase der Wallet angeben, wenn diese verschlüsselt ist.</translation>
- </message>
- <message>
- <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
- <translation type="unfinished">Datei %s existiert bereits. Wenn Sie das wirklich tun wollen, dann bewegen Sie zuvor die existierende Datei woanders hin.</translation>
- </message>
- <message>
- <source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
- <translation type="unfinished">Ungültige oder beschädigte peers.dat (%s). Wenn Sie glauben, dass dies ein Programmierfehler ist, melden Sie ihn bitte an %s. Zur Abhilfe können Sie die Datei (%s) aus dem Weg räumen (umbenennen, verschieben oder löschen), so dass beim nächsten Start eine neue Datei erstellt wird.</translation>
- </message>
- <message>
- <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
- <translation type="unfinished">Mehr als eine Onion-Bindungsadresse angegeben. Verwende %s für den automatisch erstellten Tor-Onion-Dienst.</translation>
- </message>
- <message>
- <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">Keine Dumpdatei angegeben. Um createfromdump zu benutzen, muss -dumpfile=&lt;filename&gt; angegeben werden.</translation>
- </message>
- <message>
- <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">Keine Dumpdatei angegeben. Um dump verwenden zu können, muss -dumpfile=&lt;filename&gt; angegeben werden.</translation>
- </message>
- <message>
- <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">Kein Format der Wallet-Datei angegeben. Um createfromdump zu nutzen, muss -format=&lt;format&gt; angegeben werden.</translation>
- </message>
- <message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da %s ansonsten nicht ordnungsgemäß funktionieren wird.</translation>
- </message>
- <message>
- <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
- <translation type="unfinished">Wenn sie %s nützlich finden, sind Helfer sehr gern gesehen. Besuchen Sie %s um mehr über das Softwareprojekt zu erfahren.</translation>
- </message>
- <message>
- <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
- <translation type="unfinished">Prune-Modus wurde kleiner als das Minimum in Höhe von %d MiB konfiguriert. Bitte verwenden Sie einen größeren Wert.</translation>
- </message>
- <message>
- <source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">Der Prune-Modus ist mit -reindex-chainstate nicht kompatibel. Verwende stattdessen den vollen -reindex.</translation>
- </message>
- <message>
- <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
- <translation type="unfinished">Prune (Kürzung): Die letzte Synchronisation der Wallet liegt vor gekürzten (gelöschten) Blöcken. Es ist ein -reindex (erneuter Download der gesamten Blockchain im Fall eines gekürzten Nodes) notwendig.</translation>
- </message>
- <message>
- <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
- <translation type="unfinished">Umbenennung von '%s' -&gt; '%s' fehlgeschlagen. Sie sollten dieses Problem beheben, indem Sie das ungültige Snapshot-Verzeichnis %s manuell verschieben oder löschen, andernfalls wird der gleiche Fehler beim nächsten Start erneut auftreten.</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
- <translation type="unfinished">SQLite-Datenbank: Unbekannte SQLite-Wallet-Schema-Version %d. Nur Version %d wird unterstützt.</translation>
- </message>
- <message>
- <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
- <translation type="unfinished">Die Block-Datenbank enthält einen Block, der scheinbar aus der Zukunft kommt. Dies kann daran liegen, dass die Systemzeit Ihres Computers falsch eingestellt ist. Stellen Sie die Block-Datenbank erst dann wieder her, wenn Sie sich sicher sind, dass Ihre Systemzeit korrekt eingestellt ist.</translation>
- </message>
- <message>
- <source>The transaction amount is too small to send after the fee has been deducted</source>
- <translation type="unfinished">Der Transaktionsbetrag ist zu klein, um ihn nach Abzug der Gebühr zu senden.</translation>
- </message>
- <message>
- <source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
- <translation type="unfinished">Dieser Fehler kann auftreten, wenn diese Wallet nicht ordnungsgemäß heruntergefahren und zuletzt mithilfe eines Builds mit einer neueren Version von Berkeley DB geladen wurde. Verwenden Sie in diesem Fall die Software, die diese Wallet zuletzt geladen hat</translation>
- </message>
- <message>
- <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <translation type="unfinished">Dies ist eine Vorab-Testversion - Verwendung auf eigene Gefahr - nicht für Mining- oder Handelsanwendungen nutzen!</translation>
- </message>
- <message>
- <source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
- <translation type="unfinished">Dies ist die maximale Transaktionsgebühr, die Sie (zusätzlich zur normalen Gebühr) zahlen, um die Vermeidung von teilweisen Ausgaben gegenüber der regulären Münzauswahl zu priorisieren.</translation>
- </message>
- <message>
- <source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
- <translation type="unfinished">Dies ist die Transaktionsgebühr, die ggf. abgeschrieben wird, wenn das Wechselgeld "Staub" ist in dieser Stufe.</translation>
- </message>
- <message>
- <source>This is the transaction fee you may pay when fee estimates are not available.</source>
- <translation type="unfinished">Das ist die Transaktionsgebühr, welche Sie zahlen müssten, wenn die Gebührenschätzungen nicht verfügbar sind.</translation>
- </message>
- <message>
- <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
- <translation type="unfinished">Gesamtlänge des Netzwerkversionstrings (%i) erreicht die maximale Länge (%i). Reduzieren Sie Anzahl oder Größe von uacomments.</translation>
- </message>
- <message>
- <source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
- <translation type="unfinished">Fehler beim Verarbeiten von Blöcken. Sie müssen die Datenbank mit Hilfe des Arguments '-reindex-chainstate' neu aufbauen.</translation>
- </message>
- <message>
- <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">Angegebenes Format "%s" der Wallet-Datei ist unbekannt.
-Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
- </message>
- <message>
- <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
- <translation type="unfinished">Nicht unterstützte kategoriespezifische Protokollierungsebene %1$s=%2$s. Erwartet %1$s=&lt;category&gt;:&lt;loglevel&gt;. Gültige Kategorien: %3$s. Gültige Loglevels: %4$s.</translation>
- </message>
- <message>
- <source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
- <translation type="unfinished">Nicht unterstütztes Chainstate-Datenbankformat gefunden. Bitte starte mit -reindex-chainstate neu. Dadurch wird die Chainstate-Datenbank neu erstellt.</translation>
- </message>
- <message>
- <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">Wallet erfolgreich erstellt. Der Legacy-Wallet-Typ ist veraltet und die Unterstützung für das Erstellen und Öffnen von Legacy-Wallets wird in Zukunft entfernt.</translation>
- </message>
- <message>
- <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
- <translation type="unfinished">Wallet erfolgreich geladen. Der Legacy-Wallet-Typ ist veraltet und die Unterstützung für das Erstellen und Öffnen von Legacy-Wallets wird in Zukunft entfernt. Legacy-Wallets können mit migratewallet auf eine Deskriptor-Wallet migriert werden.</translation>
- </message>
- <message>
- <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
- <translation type="unfinished">Warnung: Dumpdatei Wallet Format "%s" passt nicht zum auf der Kommandozeile angegebenen Format "%s".</translation>
- </message>
- <message>
- <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <translation type="unfinished">Warnung: Es wurden private Schlüssel in der Wallet {%s} entdeckt, welche private Schlüssel jedoch deaktiviert hat.</translation>
- </message>
- <message>
- <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation type="unfinished">Warnung: Wir scheinen nicht vollständig mit unseren Gegenstellen übereinzustimmen! Sie oder die anderen Knoten müssen unter Umständen Ihre Client-Software aktualisieren.</translation>
- </message>
- <message>
- <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">Zeugnisdaten für Blöcke nach Höhe %d müssen validiert werden. Bitte mit -reindex neu starten.</translation>
- </message>
- <message>
- <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
- <translation type="unfinished">Sie müssen die Datenbank mit Hilfe von -reindex neu aufbauen, um zum ungekürzten Modus zurückzukehren. Dies erfordert, dass die gesamte Blockchain erneut heruntergeladen wird.</translation>
- </message>
- <message>
- <source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">-maxmempool muss mindestens %d MB betragen</translation>
- </message>
- <message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ein fataler interner Fehler ist aufgetreten, siehe debug.log für Details</translation>
- </message>
- <message>
- <source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">Kann Adresse in -%s nicht auflösen: '%s'</translation>
- </message>
- <message>
- <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">Kann -forcednsseed nicht auf true setzen, wenn -dnsseed auf false gesetzt ist.</translation>
- </message>
- <message>
- <source>Cannot set -peerblockfilters without -blockfilterindex.</source>
- <translation type="unfinished">Kann -peerblockfilters nicht ohne -blockfilterindex setzen.</translation>
- </message>
- <message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Es konnte nicht in das Datenverzeichnis '%s' geschrieben werden; Überprüfen Sie die Berechtigungen.</translation>
- </message>
- <message>
- <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s ist sehr hoch gesetzt! Gebühren dieser Höhe könnten für eine einzelne Transaktion gezahlt werden.</translation>
- </message>
- <message>
- <source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
- <translation type="unfinished">Es ist nicht möglich, bestimmte Verbindungen anzubieten und gleichzeitig addrman ausgehende Verbindungen finden zu lassen.</translation>
- </message>
- <message>
- <source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
- <translation type="unfinished">Fehler beim Laden von %s: Externe Unterzeichner-Brieftasche wird geladen, ohne dass die Unterstützung für externe Unterzeichner kompiliert wurde</translation>
- </message>
- <message>
- <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
- <translation type="unfinished">Fehler beim Lesen von %s! Alle Schlüssel wurden korrekt gelesen, aber Transaktionsdaten oder Adressmetadaten fehlen oder sind falsch.</translation>
- </message>
- <message>
- <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Fehler: Adressbuchdaten im Wallet können nicht als zum migrierten Wallet gehörend identifiziert werden</translation>
- </message>
- <message>
- <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">Fehler: Doppelte Deskriptoren, die während der Migration erstellt wurden. Diese Wallet ist möglicherweise beschädigt.</translation>
- </message>
- <message>
- <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Fehler: Transaktion in\m Wallet %s kann nicht als zu migrierten Wallet gehörend identifiziert werden</translation>
- </message>
- <message>
- <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
- <translation type="unfinished">Es war nicht möglich, die Bump-Gebühren zu berechnen, da unbestätigte UTXOs von einem enormen Cluster unbestätigter Transaktionen abhängen.</translation>
- </message>
- <message>
- <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">Kann ungültige Datei peers.dat nicht umbenennen. Bitte Verschieben oder Löschen und noch einmal versuchen.</translation>
- </message>
- <message>
- <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">Gebührenschätzung fehlgeschlagen. Fallbackgebühr ist deaktiviert. Warten Sie ein paar Blöcke oder aktivieren Sie %s.</translation>
- </message>
- <message>
- <source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">Inkompatible Optionen: -dnsseed=1 wurde explizit angegeben, aber -onlynet verbietet Verbindungen zu IPv4/IPv6</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Ungültiger Betrag für %s=&lt;amount&gt;: '%s' (muss mindestens die MinRelay-Gebühr von %s betragen, um festhängende Transaktionen zu verhindern)</translation>
- </message>
- <message>
- <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">Ausgehende Verbindungen sind auf CJDNS beschränkt (-onlynet=cjdns), aber -cjdnsreachable ist nicht angegeben</translation>
- </message>
- <message>
- <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
- <translation type="unfinished">Ausgehende Verbindungen sind eingeschränkt auf Tor (-onlynet=onion), aber der Proxy, um das Tor-Netzwerk zu erreichen ist nicht vorhanden (no -proxy= and no -onion= given) oder ausdrücklich verboten (-onion=0)</translation>
- </message>
- <message>
- <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
- <translation type="unfinished">Ausgehende Verbindungen sind eingeschränkt auf Tor (-onlynet=onion), aber der Proxy, um das Tor-Netzwerk zu erreichen ist nicht vorhanden. Kein -proxy, -onion oder -listenonion ist angegeben.</translation>
- </message>
- <message>
- <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">Ausgehende Verbindungen sind auf i2p (-onlynet=i2p) beschränkt, aber -i2psam ist nicht angegeben</translation>
- </message>
- <message>
- <source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">Die Größe der Inputs übersteigt das maximale Gewicht. Bitte versuchen Sie, einen kleineren Betrag zu senden oder die UTXOs Ihrer Wallet manuell zu konsolidieren.</translation>
- </message>
- <message>
- <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">Die vorgewählte Gesamtsumme der Coins deckt das Transaktionsziel nicht ab. Bitte erlauben Sie, dass andere Eingaben automatisch ausgewählt werden, oder fügen Sie manuell mehr Coins hinzu</translation>
- </message>
- <message>
- <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">Die Transaktion erfordert ein Ziel mit einem Wert ungleich 0, eine Gebühr ungleich 0 oder eine vorausgewählte Eingabe</translation>
- </message>
- <message>
- <source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
- <translation type="unfinished">UTXO-Snapshot konnte nicht validiert werden. Starten Sie neu, um den normalen anfänglichen Block-Download fortzusetzen, oder versuchen Sie, einen anderen Snapshot zu laden.</translation>
- </message>
- <message>
- <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Unbestätigte UTXOs sind verfügbar, aber deren Ausgabe erzeugt eine Kette von Transaktionen, die vom Mempool abgelehnt werden</translation>
- </message>
- <message>
- <source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
-
-The wallet might have been tampered with or created with malicious intent.
-</source>
- <translation type="unfinished">Unerwarteter Legacy-Eintrag in Deskriptor-Wallet gefunden. Lade Wallet %s
-
-Die Wallet könnte manipuliert oder in böser Absicht erstellt worden sein.
-</translation>
- </message>
- <message>
- <source>Unrecognized descriptor found. Loading wallet %s
-
-The wallet might had been created on a newer version.
-Please try running the latest software version.
-</source>
- <translation type="unfinished">Nicht erkannter Deskriptor gefunden. Beim Laden vom Wallet %s
-
-Die Wallet wurde möglicherweise in einer neueren Version erstellt.
-Bitte mit der neuesten Softwareversion versuchen.
-</translation>
- </message>
- <message>
- <source>
-Unable to cleanup failed migration</source>
- <translation type="unfinished">
-Fehlgeschlagene Migration kann nicht bereinigt werden</translation>
- </message>
- <message>
- <source>
-Unable to restore backup of wallet.</source>
- <translation type="unfinished">
-Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
- </message>
- <message>
- <source>Block verification was interrupted</source>
- <translation type="unfinished">Blocküberprüfung wurde unterbrochen</translation>
- </message>
- <message>
- <source>Config setting for %s only applied on %s network when in [%s] section.</source>
- <translation type="unfinished">Konfigurationseinstellungen für %s sind nur auf %s network gültig, wenn in Sektion [%s]</translation>
- </message>
- <message>
- <source>Corrupted block database detected</source>
- <translation type="unfinished">Beschädigte Blockdatenbank erkannt</translation>
- </message>
- <message>
- <source>Could not find asmap file %s</source>
- <translation type="unfinished">Konnte die asmap Datei %s nicht finden</translation>
- </message>
- <message>
- <source>Could not parse asmap file %s</source>
- <translation type="unfinished">Konnte die asmap Datei %s nicht analysieren</translation>
- </message>
- <message>
- <source>Disk space is too low!</source>
- <translation type="unfinished">Freier Plattenspeicher zu gering!</translation>
- </message>
- <message>
- <source>Do you want to rebuild the block database now?</source>
- <translation type="unfinished">Möchten Sie die Blockdatenbank jetzt neu aufbauen?</translation>
- </message>
- <message>
- <source>Done loading</source>
- <translation type="unfinished">Laden abgeschlossen</translation>
- </message>
- <message>
- <source>Dump file %s does not exist.</source>
- <translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
- </message>
- <message>
- <source>Error committing db txn for wallet transactions removal</source>
- <translation type="unfinished">Fehler beim Bestätigen der Datenbanktransaktion für die Entfernung der Wallet-transaktionen.</translation>
- </message>
- <message>
- <source>Error creating %s</source>
- <translation type="unfinished">Error beim Erstellen von %s</translation>
- </message>
- <message>
- <source>Error initializing block database</source>
- <translation type="unfinished">Fehler beim Initialisieren der Blockdatenbank</translation>
- </message>
- <message>
- <source>Error initializing wallet database environment %s!</source>
- <translation type="unfinished">Fehler beim Initialisieren der Wallet-Datenbankumgebung %s!</translation>
- </message>
- <message>
- <source>Error loading %s</source>
- <translation type="unfinished">Fehler beim Laden von %s</translation>
- </message>
- <message>
- <source>Error loading %s: Private keys can only be disabled during creation</source>
- <translation type="unfinished">Fehler beim Laden von %s: Private Schlüssel können nur bei der Erstellung deaktiviert werden</translation>
- </message>
- <message>
- <source>Error loading %s: Wallet corrupted</source>
- <translation type="unfinished">Fehler beim Laden von %s: Das Wallet ist beschädigt</translation>
- </message>
- <message>
- <source>Error loading %s: Wallet requires newer version of %s</source>
- <translation type="unfinished">Fehler beim Laden von %s: Das Wallet benötigt eine neuere Version von %s</translation>
- </message>
- <message>
- <source>Error loading block database</source>
- <translation type="unfinished">Fehler beim Laden der Blockdatenbank</translation>
- </message>
- <message>
- <source>Error opening block database</source>
- <translation type="unfinished">Fehler beim Öffnen der Blockdatenbank</translation>
- </message>
- <message>
- <source>Error reading configuration file: %s</source>
- <translation type="unfinished">Fehler beim Lesen der Konfigurationsdatei: %s</translation>
- </message>
- <message>
- <source>Error reading from database, shutting down.</source>
- <translation type="unfinished">Fehler beim Lesen der Datenbank, Ausführung wird beendet.</translation>
- </message>
- <message>
- <source>Error reading next record from wallet database</source>
- <translation type="unfinished">Fehler beim Lesen des nächsten Eintrags aus der Wallet Datenbank</translation>
- </message>
- <message>
- <source>Error starting db txn for wallet transactions removal</source>
- <translation type="unfinished">Fehler beim Starten der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
- </message>
- <message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
- </message>
- <message>
- <source>Error: Couldn't create cursor into database</source>
- <translation type="unfinished">Fehler: Konnte den Cursor in der Datenbank nicht erzeugen</translation>
- </message>
- <message>
- <source>Error: Disk space is low for %s</source>
- <translation type="unfinished">Fehler: Zu wenig Speicherplatz auf der Festplatte %s</translation>
- </message>
- <message>
- <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">Fehler: Prüfsumme der Speicherauszugsdatei stimmt nicht überein.
-Berechnet: %s, erwartet: %s</translation>
- </message>
- <message>
- <source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Fehler: Fehler beim Erstellen einer neuen watchonly Wallet</translation>
- </message>
- <message>
- <source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">Fehler: Schlüssel ist kein Hex: %s</translation>
- </message>
- <message>
- <source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Fehler: Wert ist kein Hex: %s</translation>
- </message>
- <message>
- <source>Error: Keypool ran out, please call keypoolrefill first</source>
- <translation type="unfinished">Fehler: Schlüsselspeicher ausgeschöpft, bitte zunächst keypoolrefill ausführen</translation>
- </message>
- <message>
- <source>Error: Missing checksum</source>
- <translation type="unfinished">Fehler: Fehlende Prüfsumme</translation>
- </message>
- <message>
- <source>Error: No %s addresses available.</source>
- <translation type="unfinished">Fehler: Keine %s Adressen verfügbar..</translation>
- </message>
- <message>
- <source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">Fehler: Diese Wallet verwendet bereits SQLite</translation>
- </message>
- <message>
- <source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Fehler: Diese Wallet ist bereits eine Deskriptor-Brieftasche</translation>
- </message>
- <message>
- <source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">Fehler: Lesen aller Datensätze in der Datenbank nicht möglich</translation>
- </message>
- <message>
- <source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</translation>
- </message>
- <message>
- <source>Error: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">Fehler: Kann Version %u nicht als uint32_t lesen.</translation>
- </message>
- <message>
- <source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">Fehler: Alle Datensätze in der Datenbank können nicht gelesen werden</translation>
- </message>
- <message>
- <source>Error: Unable to read wallet's best block locator record</source>
- <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht lesen.</translation>
- </message>
- <message>
- <source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Fehler: Watchonly-Adressbuchdaten können nicht entfernt werden</translation>
- </message>
- <message>
- <source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</translation>
- </message>
- <message>
- <source>Error: Unable to write solvable wallet best block locator record</source>
- <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
- </message>
- <message>
- <source>Error: Unable to write watchonly wallet best block locator record</source>
- <translation type="unfinished">Fehler: Konnte Nur-beobachten-Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
- </message>
- <message>
- <source>Error: address book copy failed for wallet %s</source>
- <translation type="unfinished">Fehler: Adressbuchkopie für Wallet %s fehlgeschlagen</translation>
- </message>
- <message>
- <source>Error: database transaction cannot be executed for wallet %s</source>
- <translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
- </message>
- <message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Fehler: Es konnte kein Port abgehört werden. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
- </message>
- <message>
- <source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">Fehler: Wallet konnte während der Initialisierung nicht erneut gescannt werden.</translation>
- </message>
- <message>
- <source>Failed to start indexes, shutting down..</source>
- <translation type="unfinished">Start der Indizes fehlgeschlagen, wird beendet..</translation>
- </message>
- <message>
- <source>Failed to verify database</source>
- <translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
- </message>
- <message>
- <source>Failure removing transaction: %s</source>
- <translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
- </message>
- <message>
- <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
- <translation type="unfinished">Der Gebührensatz (%s) ist niedriger als die Mindestgebührensatz (%s) Einstellung.</translation>
- </message>
- <message>
- <source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">Ignoriere doppeltes -wallet %s.</translation>
- </message>
- <message>
- <source>Importing…</source>
- <translation type="unfinished">Importiere...</translation>
- </message>
- <message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">Fehlerhafter oder kein Genesis-Block gefunden. Falsches Datenverzeichnis für das Netzwerk?</translation>
- </message>
- <message>
- <source>Initialization sanity check failed. %s is shutting down.</source>
- <translation type="unfinished">Initialisierungsplausibilitätsprüfung fehlgeschlagen. %s wird beendet.</translation>
- </message>
- <message>
- <source>Input not found or already spent</source>
- <translation type="unfinished">Eingabe nicht gefunden oder bereits ausgegeben</translation>
- </message>
- <message>
- <source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">Unzureichender dbcache für die Blocküberprüfung</translation>
- </message>
- <message>
- <source>Insufficient funds</source>
- <translation type="unfinished">Unzureichender Kontostand</translation>
- </message>
- <message>
- <source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">Ungültige -i2psam Adresse oder Hostname: '%s'</translation>
- </message>
- <message>
- <source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">Ungültige Onion-Adresse oder ungültiger Hostname: '%s'</translation>
- </message>
- <message>
- <source>Invalid -proxy address or hostname: '%s'</source>
- <translation type="unfinished">Ungültige Proxy-Adresse oder ungültiger Hostname: '%s'</translation>
- </message>
- <message>
- <source>Invalid P2P permission: '%s'</source>
- <translation type="unfinished">Ungültige P2P Genehmigung: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Ungültiger Betrag für %s=&lt;amount&gt;: '%s' (muss mindestens %ssein)</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Ungültiger Betrag für %s=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Ungültiger Betrag für -%s=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid netmask specified in -whitelist: '%s'</source>
- <translation type="unfinished">Ungültige Netzmaske angegeben in -whitelist: '%s'</translation>
- </message>
- <message>
- <source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Ungültiger Port angegeben in %s: '%s'</translation>
- </message>
- <message>
- <source>Invalid pre-selected input %s</source>
- <translation type="unfinished">Ungültige vorausgewählte Eingabe %s</translation>
- </message>
- <message>
- <source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">Das Abhören für eingehende Verbindungen ist fehlgeschlagen (Das Abhören hat Fehler %s zurückgegeben)</translation>
- </message>
- <message>
- <source>Loading P2P addresses…</source>
- <translation type="unfinished">Lade P2P-Adressen...</translation>
- </message>
- <message>
- <source>Loading banlist…</source>
- <translation type="unfinished">Lade Bannliste…</translation>
- </message>
- <message>
- <source>Loading block index…</source>
- <translation type="unfinished">Lade Block-Index...</translation>
- </message>
- <message>
- <source>Loading wallet…</source>
- <translation type="unfinished">Lade Wallet...</translation>
- </message>
- <message>
- <source>Missing amount</source>
- <translation type="unfinished">Fehlender Betrag</translation>
- </message>
- <message>
- <source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">Fehlende Auflösungsdaten zur Schätzung der Transaktionsgröße</translation>
- </message>
- <message>
- <source>Need to specify a port with -whitebind: '%s'</source>
- <translation type="unfinished">Angabe eines Ports benötigt für -whitebind: '%s'</translation>
- </message>
- <message>
- <source>No addresses available</source>
- <translation type="unfinished">Keine Adressen verfügbar</translation>
- </message>
- <message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">Nicht genügend Datei-Deskriptoren verfügbar.</translation>
- </message>
- <message>
- <source>Not found pre-selected input %s</source>
- <translation type="unfinished">Nicht gefundener vorausgewählter Input %s</translation>
- </message>
- <message>
- <source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Nicht auflösbare vorausgewählter Input %s</translation>
- </message>
- <message>
- <source>Prune cannot be configured with a negative value.</source>
- <translation type="unfinished">Kürzungsmodus kann nicht mit einem negativen Wert konfiguriert werden.</translation>
- </message>
- <message>
- <source>Prune mode is incompatible with -txindex.</source>
- <translation type="unfinished">Kürzungsmodus ist nicht mit -txindex kompatibel.</translation>
- </message>
- <message>
- <source>Pruning blockstore…</source>
- <translation type="unfinished">Kürze den Blockspeicher…</translation>
- </message>
- <message>
- <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
- <translation type="unfinished">Reduziere -maxconnections von %d zu %d, aufgrund von Systemlimitierungen.</translation>
- </message>
- <message>
- <source>Replaying blocks…</source>
- <translation type="unfinished">Spiele alle Blocks erneut ein…</translation>
- </message>
- <message>
- <source>Rescanning…</source>
- <translation type="unfinished">Wiederhole Scan...</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <translation type="unfinished">SQLite-Datenbank: Anweisung, die Datenbank zu verifizieren fehlgeschlagen: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <translation type="unfinished">SQLite-Datenbank: Anfertigung der Anweisung zum Verifizieren der Datenbank fehlgeschlagen: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to read database verification error: %s</source>
- <translation type="unfinished">Datenbank konnte nicht gelesen werden
-Verifikations-Error: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
- <translation type="unfinished">SQLiteDatabase: Unerwartete Anwendungs-ID. %u statt %u erhalten.</translation>
- </message>
- <message>
- <source>Section [%s] is not recognized.</source>
- <translation type="unfinished">Sektion [%s] ist nicht delegiert.</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">Signierung der Transaktion fehlgeschlagen</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" does not exist</source>
- <translation type="unfinished">Angegebenes Verzeichnis "%s" existiert nicht</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" is a relative path</source>
- <translation type="unfinished">Angegebenes Verzeichnis "%s" ist ein relativer Pfad</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" is not a directory</source>
- <translation type="unfinished">Angegebenes Verzeichnis "%s" ist kein Verzeichnis</translation>
- </message>
- <message>
- <source>Specified blocks directory "%s" does not exist.</source>
- <translation type="unfinished">Angegebener Blöcke-Ordner "%s" existiert nicht.</translation>
- </message>
- <message>
- <source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">Das angegebene Datenverzeichnis "%s" existiert nicht.</translation>
- </message>
- <message>
- <source>Starting network threads…</source>
- <translation type="unfinished">Starte Netzwerk-Threads...</translation>
- </message>
- <message>
- <source>The source code is available from %s.</source>
- <translation type="unfinished">Der Quellcode ist auf %s verfügbar.</translation>
- </message>
- <message>
- <source>The specified config file %s does not exist</source>
- <translation type="unfinished">Die angegebene Konfigurationsdatei %sexistiert nicht</translation>
- </message>
- <message>
- <source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">Der Transaktionsbetrag ist zu niedrig, um die Gebühr zu bezahlen.</translation>
- </message>
- <message>
- <source>The wallet will avoid paying less than the minimum relay fee.</source>
- <translation type="unfinished">Das Wallet verhindert Zahlungen, die die Mindesttransaktionsgebühr nicht berücksichtigen.</translation>
- </message>
- <message>
- <source>This is experimental software.</source>
- <translation type="unfinished">Dies ist experimentelle Software.</translation>
- </message>
- <message>
- <source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">Dies ist die kleinstmögliche Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
- </message>
- <message>
- <source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">Dies ist die Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
- </message>
- <message>
- <source>Transaction %s does not belong to this wallet</source>
- <translation type="unfinished">Transaktion %s gehört nicht zu dieser Brieftasche</translation>
- </message>
- <message>
- <source>Transaction amount too small</source>
- <translation type="unfinished">Transaktionsbetrag zu niedrig</translation>
- </message>
- <message>
- <source>Transaction amounts must not be negative</source>
- <translation type="unfinished">Transaktionsbeträge dürfen nicht negativ sein.</translation>
- </message>
- <message>
- <source>Transaction change output index out of range</source>
- <translation type="unfinished">Ausgangsindex der Transaktionsänderung außerhalb des Bereichs</translation>
- </message>
- <message>
- <source>Transaction must have at least one recipient</source>
- <translation type="unfinished">Die Transaktion muss mindestens einen Empfänger enthalten.</translation>
- </message>
- <message>
- <source>Transaction needs a change address, but we can't generate it.</source>
- <translation type="unfinished">Für die Transaktion wird eine neue Adresse benötigt, aber wir können sie nicht generieren.</translation>
- </message>
- <message>
- <source>Transaction too large</source>
- <translation type="unfinished">Transaktion zu groß</translation>
- </message>
- <message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Speicher kann für -maxsigcachesize: '%s' MiB nicht zugewiesen werden:</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">Kann auf diesem Computer nicht an %s binden (bind meldete Fehler %s)</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer. %s is probably already running.</source>
- <translation type="unfinished">Kann auf diesem Computer nicht an %s binden. Evtl. wurde %s bereits gestartet.</translation>
- </message>
- <message>
- <source>Unable to create the PID file '%s': %s</source>
- <translation type="unfinished">Erstellung der PID-Datei '%s': %s ist nicht möglich</translation>
- </message>
- <message>
- <source>Unable to find UTXO for external input</source>
- <translation type="unfinished">UTXO für externe Eingabe konnte nicht gefunden werden</translation>
- </message>
- <message>
- <source>Unable to generate initial keys</source>
- <translation type="unfinished">Initialschlüssel können nicht generiert werden</translation>
- </message>
- <message>
- <source>Unable to generate keys</source>
- <translation type="unfinished">Schlüssel können nicht generiert werden</translation>
- </message>
- <message>
- <source>Unable to open %s for writing</source>
- <translation type="unfinished">Unfähig %s zum Schreiben zu öffnen</translation>
- </message>
- <message>
- <source>Unable to parse -maxuploadtarget: '%s'</source>
- <translation type="unfinished">Kann -maxuploadtarget: '%s' nicht parsen</translation>
- </message>
- <message>
- <source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">Kann HTTP-Server nicht starten. Siehe Debug-Log für Details.</translation>
- </message>
- <message>
- <source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Die Wallet kann vor der Migration nicht entladen werden</translation>
- </message>
- <message>
- <source>Unknown -blockfilterindex value %s.</source>
- <translation type="unfinished">Unbekannter -blockfilterindex Wert %s.</translation>
- </message>
- <message>
- <source>Unknown address type '%s'</source>
- <translation type="unfinished">Unbekannter Adresstyp '%s'</translation>
- </message>
- <message>
- <source>Unknown change type '%s'</source>
- <translation type="unfinished">Unbekannter Änderungstyp '%s'</translation>
- </message>
- <message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">Unbekannter Netztyp in -onlynet angegeben: '%s'</translation>
- </message>
- <message>
- <source>Unknown new rules activated (versionbit %i)</source>
- <translation type="unfinished">Unbekannte neue Regeln aktiviert (Versionsbit %i)</translation>
- </message>
- <message>
- <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
- <translation type="unfinished">Nicht unterstützte globale Protokollierungsebene %s=%s. Gültige Werte: %s.</translation>
- </message>
- <message>
- <source>Wallet file creation failed: %s</source>
- <translation type="unfinished">Wallet Datei konnte nicht angelegt werden: %s</translation>
- </message>
- <message>
- <source>acceptstalefeeestimates is not supported on %s chain.</source>
- <translation type="unfinished">acceptstalefeeestimates wird auf der %s Chain nicht unterstützt.</translation>
- </message>
- <message>
- <source>Unsupported logging category %s=%s.</source>
- <translation type="unfinished">Nicht unterstützte Protokollkategorie %s=%s.</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
- <translation type="unfinished">Fehler: Konnte Nur-beobachten TX %s der Nur-beobachten-Wallet nicht hinzufügen.</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions. </source>
- <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden.</translation>
- </message>
- <message>
- <source>User Agent comment (%s) contains unsafe characters.</source>
- <translation type="unfinished">Der User Agent Kommentar (%s) enthält unsichere Zeichen.</translation>
- </message>
- <message>
- <source>Verifying blocks…</source>
- <translation type="unfinished">Überprüfe Blöcke...</translation>
- </message>
- <message>
- <source>Verifying wallet(s)…</source>
- <translation type="unfinished">Überprüfe Wallet(s)...</translation>
- </message>
- <message>
- <source>Wallet needed to be rewritten: restart %s to complete</source>
- <translation type="unfinished">Wallet musste neu geschrieben werden: starten Sie %s zur Fertigstellung neu</translation>
- </message>
- <message>
- <source>Settings file could not be read</source>
- <translation type="unfinished">Einstellungsdatei konnte nicht gelesen werden</translation>
- </message>
- <message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">Einstellungsdatei kann nicht geschrieben werden</translation>
- </message>
-</context>
+ </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_de_CH.ts b/src/qt/locale/bitcoin_de_CH.ts
index 12e648ff38..ffbc761ac1 100644
--- a/src/qt/locale/bitcoin_de_CH.ts
+++ b/src/qt/locale/bitcoin_de_CH.ts
@@ -184,6 +184,10 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Geben Sie die alte und die neue Wallet-Passphrase ein.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Weiter</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Beachten Sie, dass das Verschlüsseln Ihrer Wallet nicht komplett vor Diebstahl Ihrer Bitcoins durch Malware schützt, die Ihren Computer infiziert hat.</translation>
</message>
@@ -427,7 +431,11 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<numerusform>%n Jahre</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard-Wallet</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -451,6 +459,10 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">&amp;Minimieren</translation>
</message>
<message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Ändert die Passphrase, die für die Wallet-Verschlüsselung benutzt wird</translation>
+ </message>
+ <message>
<source>&amp;Send</source>
<translation type="unfinished">&amp;Senden</translation>
</message>
@@ -460,17 +472,93 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>&amp;Options…</source>
- <translation type="unfinished">weitere Möglichkeiten/Einstellungen </translation>
+ <translation type="unfinished">&amp;Optionen…</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">Wallet &amp;verschlüsseln…</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">Verschlüsselt die zu Ihrer Wallet gehörenden privaten Schlüssel</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">Wallet &amp;sichern…</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">Passphrase &amp;ändern…</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">&amp;Nachricht unterzeichnen…</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Nachrichten signieren, um den Besitz Ihrer Bitcoin-Adressen zu beweisen</translation>
</message>
<message>
<source>&amp;Verify message…</source>
- <translation type="unfinished">Nachricht bestätigen </translation>
+ <translation type="unfinished">Nachricht &amp;verifizieren…</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Nachrichten verifizieren, um sicherzustellen, dass diese mit den angegebenen Bitcoin-Adressen signiert wurden</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Lade PSBT aus Datei…</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Öffne &amp;URI…</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Schließe Wallet…</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Erstelle Wallet…</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Schließe alle Wallets…</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Datei</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Einstellungen</translation>
</message>
<message>
<source>&amp;Help</source>
<translation type="unfinished">&amp;Hilfe</translation>
</message>
<message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Registerkartenleiste</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Synchronisiere Headers (%1%)…</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Synchronisiere mit Netzwerk...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Indiziere Blöcke auf Datenträger...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Verarbeite Blöcke auf Datenträger...</translation>
+ </message>
+ <message>
<source>Connecting to peers…</source>
<translation type="unfinished">Verbinde mit Peers...</translation>
</message>
@@ -534,6 +622,50 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">STRG+Q</translation>
</message>
<message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Lade teilsignierte Bitcoin-Transaktion</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Lade PSBT aus Zwischenablage…</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">Lade teilsignierte Bitcoin-Transaktion aus Zwischenablage</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Knotenfenster</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Öffne Knotenkonsole für Fehlersuche und Diagnose</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">&amp;Versandadressen</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">&amp;Empfangsadressen</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">Öffne bitcoin: URI</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Wallet öffnen</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Eine Wallet öffnen</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Wallet schließen</translation>
+ </message>
+ <message>
<source>Restore Wallet…</source>
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
<translation type="unfinished">Wallet wiederherstellen...</translation>
@@ -568,10 +700,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Blende die Werte im Ãœbersichtsreiter aus</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Keine Wallets verfügbar</translation>
</message>
@@ -628,7 +756,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
<numerusform>%n aktive Verbindung zum Bitcoin-Netzwerk</numerusform>
- <numerusform>%n aktive Verbindung(en) zum Bitcoin-Netzwerk</numerusform>
+ <numerusform>%n aktive Verbindungen zum Bitcoin-Netzwerk</numerusform>
</translation>
</message>
<message>
@@ -652,6 +780,10 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Netzwerk Aktivität einschalten</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Synchronisiere Header (%1%)…</translation>
+ </message>
+ <message>
<source>Error creating wallet</source>
<translation type="unfinished">Fehler beim Erstellen der Wallet</translation>
</message>
@@ -972,10 +1104,6 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Wallet öffnen Warnung</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
- </message>
- <message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
<translation type="unfinished">Öffne Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
@@ -2099,6 +2227,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Anzahl der Verbindungen</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Lokale Adressen</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Netzwerk-Adressen, die dein Bitcoin-Node aktuell verwendet, um mit anderen Nodes zu kommunizieren.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Blockchain</translation>
</message>
@@ -2143,12 +2279,16 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
</message>
<message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">Die Transportschicht-Version: %1</translation>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Gegenstellen Reiter verstecken</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form, falls vorhanden.</translation>
+ <source>Ctrl+X</source>
+ <translation type="unfinished">Strg+X</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Die Transportschicht-Version: %1</translation>
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
@@ -2217,6 +2357,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">User-Agent</translation>
</message>
<message>
+ <source>Node window</source>
+ <translation type="unfinished">Knotenfenster</translation>
+ </message>
+ <message>
<source>Current block height</source>
<translation type="unfinished">Aktuelle Blockhöhe</translation>
</message>
@@ -2245,6 +2389,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Richtung/Typ</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Das Netzwerkprotokoll, über das diese Gegenstelle verbunden ist, ist: IPv4, IPv6, Onion, I2P oder CJDNS.</translation>
</message>
@@ -2457,6 +2605,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Netzwerkaktivität deaktiviert</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Keine</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Befehl wird ohne spezifizierte Wallet ausgeführt</translation>
</message>
@@ -3183,10 +3335,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Nachricht &amp;signieren</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Sie können Nachrichten/Vereinbarungen mit Hilfe Ihrer Adressen signieren, um zu beweisen, dass Sie Bitcoins empfangen können, die an diese Adressen überwiesen werden. Seien Sie vorsichtig und signieren Sie nichts Vages oder Willkürliches, um Ihre Indentität vor Phishingangriffen zu schützen. Signieren Sie nur vollständig-detaillierte Aussagen, mit denen Sie auch einverstanden sind.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Die Bitcoin-Adresse, mit der die Nachricht signiert wird</translation>
</message>
@@ -3271,10 +3419,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Bitte überprüfen Sie die Adresse und versuchen Sie es erneut.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Die eingegebene Adresse verweist nicht auf einen Schlüssel.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Wallet-Entsperrung wurde abgebrochen.</translation>
</message>
@@ -3840,11 +3984,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">PSBT kopiert</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">In die Zwischenablage kopiert </translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Signierung der Transaktion fehlgeschlagen.</translation>
</message>
@@ -3856,10 +3995,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<source>Can't display address</source>
<translation type="unfinished">Die Adresse kann nicht angezeigt werden</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3992,10 +4127,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Kein Format der Wallet-Datei angegeben. Um createfromdump zu nutzen, muss -format=&lt;format&gt; angegeben werden.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da %s ansonsten nicht ordnungsgemäß funktionieren wird.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Wenn sie %s nützlich finden, sind Helfer sehr gern gesehen. Besuchen Sie %s um mehr über das Softwareprojekt zu erfahren.</translation>
</message>
@@ -4105,10 +4236,6 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">-maxmempool muss mindestens %d MB betragen</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ein fataler interner Fehler ist aufgetreten, siehe debug.log für Details</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Kann Adresse in -%s nicht auflösen: '%s'</translation>
</message>
@@ -4227,7 +4354,8 @@ Please try running the latest software version.
<translation type="unfinished">Nicht erkannter Deskriptor gefunden. Beim laden vom Wallet %s
Die Wallet wurde möglicherweise in einer neueren Version erstellt.
-Bitte mit der neuesten Softwareversion versuchen.</translation>
+Bitte mit der neuesten Softwareversion versuchen.
+</translation>
</message>
<message>
<source>
@@ -4242,6 +4370,10 @@ Unable to restore backup of wallet.</source>
Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind darf nur für eingehende Verbindungen verwendet werden ("out" wurde übergeben)</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Blocküberprüfung wurde unterbrochen</translation>
</message>
@@ -4567,6 +4699,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Nicht auflösbare vorausgewählter Input %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Nur Richtung festgelegt, keine Genehmigungen: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Kürzungsmodus kann nicht mit einem negativen Wert konfiguriert werden.</translation>
</message>
@@ -4696,10 +4832,6 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Transaktion zu groß</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Speicher kann für -maxsigcachesize: '%s' MiB nicht zugewiesen werden:</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Kann auf diesem Computer nicht an %s binden (bind meldete Fehler %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_el.ts b/src/qt/locale/bitcoin_el.ts
index d0caab7330..a73d0a0b5c 100644
--- a/src/qt/locale/bitcoin_el.ts
+++ b/src/qt/locale/bitcoin_el.ts
@@ -2,6 +2,10 @@
<context>
<name>AddressBookPage</name>
<message>
+ <source>Create a new address</source>
+ <translation type="unfinished">ΔημιουÏγία νέας διεÏθυνσης </translation>
+ </message>
+ <message>
<source>&amp;New</source>
<translation type="unfinished">&amp;Îέo</translation>
</message>
@@ -86,6 +90,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Σφάλμα κατά την Ï€Ïοσπάθεια αποθήκευσης της λίστας διευθÏνσεων στο %1. ΠαÏακαλώ δοκιμάστε ξανά.</translation>
</message>
<message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">ΔιευθÏνσεις λήψης - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Αποτυχία εξαγωγής</translation>
</message>
@@ -168,6 +176,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Εισαγάγετε τον παλιό και νέο κωδικό Ï€Ïόσβασης σας για το ποÏτοφόλι.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Συνεχίστε</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Θυμίσου ότι το να κÏυπτογÏαφείς το ποÏτοφόλι σου δεν μποÏεί να Ï€Ïοστατέψει πλήÏως τα bitcoins σου από κλοπή από κακόβουλο λογισμικό που έχει μολÏνει τον υπολογιστή σου</translation>
</message>
@@ -393,7 +405,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n έτη</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">ΠÏοεπιλεγμένο ποÏτοφόλι</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -471,7 +487,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Αλλαγή της φÏάσης Ï€Ïόσβασης για την κÏυπτογÏάφηση του ποÏτοφολιοÏ</translation>
+ <translation type="unfinished">Αλλαγή του ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎºÏυπτογÏάφησης του ποÏτοφολιοÏ</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -688,11 +704,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">ΜεταφοÏά ΠοÏτοφολιοÏ</translation>
+ <translation type="unfinished">Μετεγκατάσταση ΠοÏτοφολιοÏ</translation>
</message>
<message>
<source>Migrate a wallet</source>
- <translation type="unfinished">ΜεταφοÏά ενός ποÏτοφολιοÏ</translation>
+ <translation type="unfinished">Μετεγκατάσταση ενός ποÏτοφολιοÏ</translation>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
@@ -707,10 +723,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ΑπόκÏυψη τιμών στην καÏτέλα Επισκόπησης</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">ΠÏοεπιλεγμένο ποÏτοφόλι</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Κανένα ποÏτοφόλι διαθέσιμο</translation>
</message>
@@ -762,8 +774,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>1%n ενεÏγές συνδέσεις στο δίκτυο Bitcoin.</numerusform>
- <numerusform>%n ενεÏγές συνδέσεις στο δίκτυο Bitcoin.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
<message>
@@ -1117,10 +1129,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">ΠÏοειδοποίηση ανοίγματος ποÏτοφολιοÏ</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">ΠÏοεπιλεγμένο ποÏτοφόλι</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Άνοιγμα ΠοÏτοφολιοÏ</translation>
@@ -2239,6 +2247,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Κατάλογος Δεδομένων</translation>
</message>
<message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">Για να καθοÏίσετε μια μη Ï€Ïοεπιλεγμένη θέση του καταλόγου δεδομένων, χÏησιμοποιήστε την επιλογή '%1'.</translation>
+ </message>
+ <message>
<source>Blocksdir</source>
<translation type="unfinished">Κατάλογος των Μπλοκς</translation>
</message>
@@ -2319,10 +2331,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ΜεταφοÏά</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Η συμβολοσειÏά αναγνωÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï Ï€ÎµÏιόδου σÏνδεσης BIP324 σε δεκαεξαδική μοÏφή, εάν υπάÏχει.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">ΑναγνωÏιστικό πεÏιόδου σÏνδεσης</translation>
</message>
@@ -2421,6 +2429,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Αδειες</translation>
</message>
<message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">Η κατεÏθυνση και ο Ï„Ïπος της ομότιμης σÏνδεσης: %1</translation>
+ </message>
+ <message>
<source>Direction/Type</source>
<translation type="unfinished">ΚατεÏθυνση/ΤÏπος</translation>
</message>
@@ -2568,7 +2580,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">επιλέξαμε τον ομότιμο για αναμετάδοση Ï…ÏˆÎ·Î»Î¿Ï ÎµÏÏους ζώνης</translation>
+ <translation type="unfinished">επιλέξαμε τον ομότιμο για Ï…ÏˆÎ·Î»Î¿Ï ÎµÏÏους ζώνης αναμετάδοση</translation>
</message>
<message>
<source>the peer selected us for high bandwidth relay</source>
@@ -2613,6 +2625,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Η δÏαστηÏιότητα δικτÏου είναι απενεÏγοποιημένη</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Κανένα</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Εκτέλεση εντολής χωÏίς ποÏτοφόλι</translation>
</message>
@@ -2784,7 +2800,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">ΠαÏάγει μια διεÏθυνση συμβατή με παλαιότεÏα ποÏτοφόλια.</translation>
+ <translation type="unfinished">ΔημιουÏγεί μια διεÏθυνση συμβατή με παλαιότεÏα ποÏτοφόλια.</translation>
</message>
<message>
<source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
@@ -3083,6 +3099,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Δη&amp;μιουÏγία ΑνυπόγÏαφου</translation>
</message>
<message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">ΔημιουÏγεί μια συναλλαγή Bitcoin με μεÏική υπογÏαφή (PSBT) για χÏήση με Ï€.χ. ένα ποÏτοφόλι%1 εκτός σÏνδεσης ή ένα ποÏτοφόλι Ï…Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î¼Î²Î±Ï„ÏŒ με το PSBT.</translation>
+ </message>
+ <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 Ï€Ïος το '%2'</translation>
</message>
@@ -3220,8 +3240,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
- <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Αναμένεται η έναÏξη επιβεβαίωσης εντός %n μπλοκ.</numerusform>
+ <numerusform>Αναμένεται η έναÏξη επιβεβαίωσης εντός %n μπλοκ.</numerusform>
</translation>
</message>
<message>
@@ -3284,6 +3304,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Το τέλος θα αφαιÏεθεί από το ποσό που αποστέλλεται. Ο παÏαλήπτης θα λάβει λιγότεÏα bitcoins από ÏŒ,τι εισάγετε στο πεδίο ποσό. Εάν επιλεγοÏν πολλοί παÏαλήπτες, το έξοδο διαιÏείται εξίσου.</translation>
</message>
<message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">Α&amp;φεÏέστε το τέλος από το ποσό</translation>
+ </message>
+ <message>
<source>Use available balance</source>
<translation type="unfinished">ΧÏησιμοποιήστε το διαθέσιμο υπόλοιπο</translation>
</message>
@@ -3322,10 +3346,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">&amp;ΥπογÏαφή ΜηνÏματος</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">ΜποÏείτε να υπογÏάψετε μηνÏματα/συμφωνίες με τις διευθÏνσεις σας για να αποδείξετε ότι μποÏείτε να λάβετε τα bitcoins που τους αποστέλλονται. ΠÏοσέξτε να μην υπογÏάψετε τίποτα ασαφές ή τυχαίο, καθώς οι επιθέσεις ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï "ψαÏέματος" ενδέχεται να σας εξαπατήσουν να υπογÏάψετε την ταυτότητά σας σε αυτοÏÏ‚. ΥπογÏάψτε μόνο πλήÏως λεπτομεÏείς δηλώσεις που συμφωνείτε.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">ΔιεÏθυνση Bitcoin που θα σταλεί το μήνυμα</translation>
</message>
@@ -3410,10 +3430,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Ελέγξτε τη διεÏθυνση και δοκιμάστε ξανά.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Η καταχωÏημένη διεÏθυνση δεν αναφέÏεται σε ένα κλειδί.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Το ξεκλείδωμα του ΠοÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î±ÎºÏ…Ïώθηκε.</translation>
</message>
@@ -3975,10 +3991,6 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Can't display address</source>
<translation type="unfinished">Αδυναμία Ï€Ïοβολής διεÏθυνσης</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">ΠÏοεπιλεγμένο ποÏτοφόλι</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4067,10 +4079,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Δεν δόθηκε φοÏμά αÏχείου ποÏτοφολιοÏ. Για τη χÏήση του createfromdump, Ï€Ïέπει να δοθεί -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Ελέγξτε ότι η ημεÏομηνία και η ÏŽÏα του υπολογιστή σας είναι σωστές! Αν το Ïολόι σας είναι λάθος, το %s δεν θα λειτουÏγήσει σωστά.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">ΠαÏακαλώ συμβάλλετε αν βÏείτε %s χÏήσιμο. Επισκεφθείτε το %s για πεÏισσότεÏες πληÏοφοÏίες σχετικά με το λογισμικό.</translation>
</message>
@@ -4107,6 +4115,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Αυτό είναι το τέλος συναλλαγής που μποÏείτε να πληÏώσετε όταν δεν υπάÏχουν εκτιμήσεις τελών.</translation>
</message>
<message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation type="unfinished">Το συνολικό μήκος της συμβολοσειÏάς έκδοσης δικτÏου (%i) υπεÏβαίνει το μέγιστο μήκος (%i). Μειώστε τον αÏιθμό ή το μέγεθος των Ï€Ïοϊόντων.</translation>
+ </message>
+ <message>
<source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
<translation type="unfinished">Δεν είναι δυνατή η επανάληψη των μπλοκ. Θα χÏειαστεί να ξαναφτιάξετε τη βάση δεδομένων χÏησιμοποιώντας το -reindex-chainstate.</translation>
</message>
@@ -4123,12 +4135,12 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ΠÏέπει να ξαναφτιάξετε τη βάση δεδομένων χÏησιμοποιώντας το -reindex για να επιστÏέψετε στη λειτουÏγία χωÏίς εκτÏπωση. Αυτό θα ξαναφοÏτώσει ολόκληÏο το blockchain</translation>
</message>
<message>
- <source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">-maxmempool Ï€Ïέπει να είναι τουλάχιστον %d MB</translation>
+ <source>%s is set very high!</source>
+ <translation type="unfinished">%s είναι Ï€Î¿Î»Ï Ï…ÏˆÎ·Î»Î®!</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">ΠÏοέκυψε ένα κÏίσιμο εσωτεÏικό σφάλμα. ΑνατÏέξτε στο debug.log για λεπτομέÏειες</translation>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation type="unfinished">-maxmempool Ï€Ïέπει να είναι τουλάχιστον %d MB</translation>
</message>
<message>
<source>Cannot resolve -%s address: '%s'</source>
@@ -4136,7 +4148,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">ΑδÏνατη η εγγÏαφή στον κατάλογο δεδομένων '%s'. Ελέγξτε τα δικαιώματα.</translation>
+ <translation type="unfinished">Δεν είναι δυνατή η εγγÏαφή στον κατάλογο δεδομένων '%s'. ελέγξτε τα δικαιώματα.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -4295,6 +4307,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Μη έγκυÏη άδεια P2P: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Μη έγκυÏο ποσό για -%s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
<translation type="unfinished">Μη έγκυÏη μάσκα δικτÏου που καθοÏίζεται στο -whitelist: '%s'</translation>
</message>
@@ -4471,6 +4487,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Άγνωστος Ï„Ïπος διεÏθυνσης '%s'</translation>
</message>
<message>
+ <source>Unknown change type '%s'</source>
+ <translation type="unfinished"> Άγνωστος Ï„Ïπος αλλαγής '%s'</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation type="unfinished">Έχει οÏιστεί άγνωστo δίκτυο στο -onlynet: '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_eo.ts b/src/qt/locale/bitcoin_eo.ts
index 6b8474cf76..4cda8f900b 100644
--- a/src/qt/locale/bitcoin_eo.ts
+++ b/src/qt/locale/bitcoin_eo.ts
@@ -301,7 +301,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n jaroj</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">defaÅ­lta monujo</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -477,10 +481,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Fermi ĉiujn monujojn</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">defaÅ­lta monujo</translation>
- </message>
- <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Monujo-Nomo</translation>
@@ -704,10 +704,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Malfermi monujon averto</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">defaÅ­lta monujo</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Malfermi la Monujon</translation>
@@ -1342,6 +1338,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Malekzili</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Neniu</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">Al</translation>
</message>
@@ -1722,10 +1722,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Bonvolu kontroli la adreson kaj reprovi.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La adreso, kiun vi enmetis, referencas neniun ŝlosilon.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">MalÅloso de monujo estas nuligita.</translation>
</message>
@@ -2057,11 +2053,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">Sendi Bitmonon</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">defaÅ­lta monujo</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts
index 9f3940b07e..9f4091eadd 100644
--- a/src/qt/locale/bitcoin_es.ts
+++ b/src/qt/locale/bitcoin_es.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Haz clic derecho para editar dirección o etiqueta</translation>
+ <translation type="unfinished">Hacer clic derecho para editar la dirección o etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -11,11 +11,11 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">&amp;Nuevo</translation>
+ <translation type="unfinished">&amp;Nueva</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copia la dirección actualmente seleccionada al portapapeles del sistema</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -129,7 +129,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Ingresa la frase de contraseña</translation>
+ <translation type="unfinished">Ingresar la frase de contraseña</translation>
</message>
<message>
<source>New passphrase</source>
@@ -137,7 +137,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Repite la nueva frase de contraseña</translation>
+ <translation type="unfinished">Repetir la nueva frase de contraseña</translation>
</message>
<message>
<source>Show passphrase</source>
@@ -184,6 +184,14 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<translation type="unfinished">Introduce la frase de contraseña antigua y la nueva para el monedero.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recuerda que cifrar tu monedero no garantiza la protección total de tus bitcoins contra robos si el equipo está infectado con malware.</translation>
</message>
@@ -406,7 +414,11 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">monedero predeterminado</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -484,7 +496,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Cambiar la frase de contraseña utilizada para el cifrado del monedero</translation>
+ <translation type="unfinished">Cambiar la contraseña utilizada para el cifrado del monedero</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -500,35 +512,23 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Cifrar monedero…</translation>
- </message>
- <message>
- <source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Cifrar las claves privadas de tu monedero</translation>
+ <translation type="unfinished">&amp;Cifrar monedero</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Respaldar monedero…</translation>
+ <translation type="unfinished">&amp;Copia de seguridad del monedero</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña…</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">Firmar &amp;mensaje…</translation>
- </message>
- <message>
- <source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Firmar mensajes con tus direcciones de Bitcoin para probar la propiedad</translation>
+ <translation type="unfinished">Firmar &amp;mensaje...</translation>
</message>
<message>
<source>&amp;Verify message…</source>
- <translation type="unfinished">&amp;Verificar mensaje…</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar mensajes para comprobar que fueron firmados con la dirección Bitcoin indicada</translation>
+ <translation type="unfinished">&amp;Verificar mensaje...</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
@@ -551,24 +551,12 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<translation type="unfinished">Cerrar todos los monederos...</translation>
</message>
<message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;Archivo</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <translation type="unfinished">&amp;Parámetros</translation>
- </message>
- <message>
<source>&amp;Help</source>
<translation type="unfinished">&amp;Ayuda</translation>
</message>
<message>
- <source>Tabs toolbar</source>
- <translation type="unfinished">Barra de pestañas</translation>
- </message>
- <message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -576,27 +564,27 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
- <translation type="unfinished">Indexando bloques en disco…</translation>
+ <translation type="unfinished">Indexando bloques en disco...</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Procesando bloques en disco…</translation>
+ <translation type="unfinished">Procesando bloques en disco...</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando con pares…</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Solicitar pagos (genera códigos QR y URI de tipo "bitcoin:")</translation>
+ <translation type="unfinished">Solicitar pagos (genera código QR y URI's de Bitcoin)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Muestra el listado de direcciones de envío y etiquetas utilizadas</translation>
+ <translation type="unfinished">Editar la lista de las direcciones y etiquetas almacenadas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Muestra el listado de direcciones de recepción y etiquetas utilizadas</translation>
+ <translation type="unfinished">Mostrar la lista de direcciones de envío y etiquetas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -605,8 +593,8 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Se ha procesado %n bloque del historial de transacciones.</numerusform>
- <numerusform>Se han procesado %n bloques del historial de transacciones.</numerusform>
+ <numerusform>Procesado %n bloque del historial de transacciones.</numerusform>
+ <numerusform>Procesado %n bloques del historial de transacciones.</numerusform>
</translation>
</message>
<message>
@@ -615,15 +603,15 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">Poniéndose al día…</translation>
+ <translation type="unfinished">Poniéndose al día...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">El último bloque recibido fue generado hace %1.</translation>
+ <translation type="unfinished">El último bloque recibido fue generado hace %1 horas.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Las transacciones posteriores aún no estarán visibles.</translation>
+ <translation type="unfinished">Las transacciones posteriores aún no son visibles.</translation>
</message>
<message>
<source>Warning</source>
@@ -635,7 +623,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">Al día</translation>
+ <translation type="unfinished">Actualizado al día </translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -647,27 +635,23 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Cargar una transacción de Bitcoin parcialmente firmada desde el portapapeles</translation>
+ <translation type="unfinished">Cargar una transacción de Bitcoin parcialmente firmada desde el Portapapeles</translation>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
- </message>
- <message>
- <source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Abrir la consola de depuración y diagnóstico de nodos</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de recepción</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Abrir un URI de tipo "bitcoin:"</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -716,10 +700,6 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<translation type="unfinished">Ocultar los valores de la ventana de previsualización</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Monedero predeterminado</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">No hay monederos disponibles</translation>
</message>
@@ -757,7 +737,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 cliente</translation>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -771,8 +751,8 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n conexión activa con la red Bitcoin.</numerusform>
- <numerusform>%n conexiones activas con la red Bitcoin.</numerusform>
+ <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -788,16 +768,16 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
- <translation type="unfinished">Desactivar la actividad de la red</translation>
+ <translation type="unfinished">Deshabilitar actividad de red</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">Habilitar la actividad de la red</translation>
+ <translation type="unfinished">Habilitar actividad de red</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -907,7 +887,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Tras la comisión:</translation>
+ <translation type="unfinished">Después de la comisión:</translation>
</message>
<message>
<source>Change:</source>
@@ -915,7 +895,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>(un)select all</source>
- <translation type="unfinished">(de)seleccionar todo</translation>
+ <translation type="unfinished">(de)selecionar todo</translation>
</message>
<message>
<source>Tree mode</source>
@@ -931,11 +911,11 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Received with label</source>
- <translation type="unfinished">Recibido con etiqueta</translation>
+ <translation type="unfinished">Recibido con dirección</translation>
</message>
<message>
<source>Received with address</source>
- <translation type="unfinished">Recibido con dirección</translation>
+ <translation type="unfinished">Recibido con etiqueta</translation>
</message>
<message>
<source>Date</source>
@@ -971,11 +951,11 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
- <translation type="unfinished">&amp;Desbloquear importe no gastado</translation>
+ <translation type="unfinished">&amp;Desbloquear lo no gastado</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -987,7 +967,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar tras comisión</translation>
+ <translation type="unfinished">Copiar después de la comisión</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -1011,7 +991,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">cambio de %1 (%2)</translation>
+ <translation type="unfinished">cambia desde %1 (%2)</translation>
</message>
<message>
<source>(change)</source>
@@ -1032,7 +1012,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Create wallet failed</source>
- <translation type="unfinished">Error al crear monedero</translation>
+ <translation type="unfinished">Fallo al crear monedero</translation>
</message>
<message>
<source>Create wallet warning</source>
@@ -1076,11 +1056,11 @@ If this wallet contains any watchonly scripts, a new wallet will be created whic
If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
- <translation type="unfinished">La migración del monedero lo convertirá en uno o más monederos basados en descriptores. Será necesario realizar una nueva copia de seguridad del monedero.
+ <translation type="unfinished">La migración del monedero lo convertirá en uno o más monederos basados en descriptores. Será necesario realizar una nuevo respaldo del monedero.
Si este monedero contiene scripts solo de observación, se creará un nuevo monedero que los contenga.
Si este monedero contiene scripts solucionables pero no de observación, se creará un nuevo monedero diferente que los contenga.
-El proceso de migración creará una copia de seguridad del monedero antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de este monedero. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restaurar monedero".</translation>
+El proceso de migración creará un respaldo del monedero antes de migrar. Este archivo de respaldo se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de este monedero. En el caso de una migración incorrecta, el respaldo puede restaurarse con la funcionalidad "Restaurar monedero".</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -1092,7 +1072,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">La migración del monedero "%1" se realizó correctamente.</translation>
+ <translation type="unfinished">La migración del monedero "%1" se ha realizado correctamente.</translation>
</message>
<message>
<source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
@@ -1122,10 +1102,6 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
<translation type="unfinished">Advertencia al abrir monedero</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">monedero predeterminado</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir monedero</translation>
@@ -1303,7 +1279,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>Could not unlock wallet.</source>
- <translation type="unfinished">No se pudo desbloquear el monedero.</translation>
+ <translation type="unfinished">No se ha podido desbloquear el monedero.</translation>
</message>
<message>
<source>New key generation failed.</source>
@@ -1362,11 +1338,11 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Se almacenará al menos %1 GB de datos en este directorio, que aumentará con el tiempo.</translation>
+ <translation type="unfinished">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Se almacenará aproximadamente %1 GB de datos en este directorio.</translation>
+ <translation type="unfinished">Se almacenarán aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1853,7 +1829,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>The configuration file could not be opened.</source>
- <translation type="unfinished">El archivo de configuración no se pudo abrir.</translation>
+ <translation type="unfinished">El archivo de configuración no se ha podido abrir.</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -2230,10 +2206,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Para especificar una localización personalizada del directorio de datos, usa la opción "%1".</translation>
</message>
<message>
- <source>Blocksdir</source>
- <translation type="unfinished">Directorio de bloques</translation>
- </message>
- <message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
<translation type="unfinished">Para especificar una localización personalizada del directorio de bloques, usa la opción "%1". </translation>
</message>
@@ -2254,6 +2226,14 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2302,6 +2282,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2310,10 +2294,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Identificador de sesión</translation>
</message>
@@ -2389,7 +2369,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>Current block height</source>
@@ -2420,6 +2400,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Sentido/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">El protocolo de red de este par está conectado a través de: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2450,7 +2434,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<message>
<source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
<extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">Tiempo transcurrido desde que se recibió de este par una nueva transacción aceptada en la mempool.</translation>
+ <translation type="unfinished">Tiempo transcurrido desde que se recibió de este par una nueva transacción aceptada en el mempool.</translation>
</message>
<message>
<source>Last Send</source>
@@ -2612,6 +2596,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
@@ -2694,7 +2682,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">Mensaje opcional para agregar a la solicitud de pago, el cual será mostrado cuando la solicitud esté abierta. Nota: el mensaje no se enviará con el pago a través de la red de Bitcoin.</translation>
+ <translation type="unfinished">Mensaje opcional para adjuntar a la solicitud de pago, que se mostrará cuando se abra la solicitud. Nota: Este mensaje no se enviará con el pago a través de la red de Bitcoin.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
@@ -2702,11 +2690,11 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">Usa este formulario para solicitar un pago. Todos los campos son &lt;b&gt;opcional&lt;/b&gt;.</translation>
+ <translation type="unfinished">Usa este formulario para solicitar pagos. Todos los campos son &lt;b&gt;opcionales&lt;/b&gt;.</translation>
</message>
<message>
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
- <translation type="unfinished">Un importe opcional para solicitar. Deje esto vacío o en cero para no solicitar una cantidad específica.</translation>
+ <translation type="unfinished">Un importe opcional para solicitar. Déjalo vacío o ingresa cero para no solicitar un importe específico.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
@@ -2714,7 +2702,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
- <translation type="unfinished">Mensaje opcional asociado a la solicitud de pago que podría ser presentado al remitente </translation>
+ <translation type="unfinished">Un mensaje opcional que se adjunta a la solicitud de pago y que puede mostrarse al remitente.</translation>
</message>
<message>
<source>&amp;Create new receiving address</source>
@@ -2786,7 +2774,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>Could not unlock wallet.</source>
- <translation type="unfinished">No se pudo desbloquear el monedero.</translation>
+ <translation type="unfinished">No se ha podido desbloquear el monedero.</translation>
</message>
<message>
<source>Could not generate new %1 address</source>
@@ -2891,7 +2879,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>automatically selected</source>
- <translation type="unfinished">Seleccionado automaticamente</translation>
+ <translation type="unfinished">Seleccionado automáticamente</translation>
</message>
<message>
<source>Insufficient funds!</source>
@@ -2999,7 +2987,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Confirmation time target:</source>
- <translation type="unfinished">Objetivo de tiempo de confirmación</translation>
+ <translation type="unfinished">Objetivo de tiempo de confirmación:</translation>
</message>
<message>
<source>Enable Replace-By-Fee</source>
@@ -3039,7 +3027,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar tras comisión</translation>
+ <translation type="unfinished">Copiar después de la comisión</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -3203,7 +3191,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">Se encontró una dirección duplicada: las direcciones solo se deben usar una vez.</translation>
+ <translation type="unfinished">Se ha encontrado una dirección duplicada: las direcciones solo se deben usar una vez.</translation>
</message>
<message>
<source>Transaction creation failed!</source>
@@ -3273,7 +3261,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The amount to send in the selected unit</source>
- <translation type="unfinished">El importe que se enviará en la unidad seleccionada</translation>
+ <translation type="unfinished">El importe que se enviará en la unidad seleccionada.</translation>
</message>
<message>
<source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
@@ -3293,7 +3281,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
- <translation type="unfinished">Ingresar una etiqueta para esta dirección a fin de agregarla a la lista de direcciones utilizadas</translation>
+ <translation type="unfinished">Ingresar una etiqueta para esta dirección a fin de agregarla a la lista de direcciones utilizadas.</translation>
</message>
<message>
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
@@ -3322,8 +3310,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">&amp;Firmar mensaje</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3410,8 +3398,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Revisa la dirección e intenta de nuevo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La dirección introducida no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3423,7 +3411,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation type="unfinished">No se dispone de la clave privada para la dirección introducida.</translation>
+ <translation type="unfinished">La clave privada para la dirección ingresada no está disponible.</translation>
</message>
<message>
<source>Message signing failed.</source>
@@ -3435,7 +3423,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The signature could not be decoded.</source>
- <translation type="unfinished">La firma no pudo decodificarse.</translation>
+ <translation type="unfinished">La firma no ha podido decodificarse.</translation>
</message>
<message>
<source>Please check the signature and try again.</source>
@@ -3458,7 +3446,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>SplashScreen</name>
<message>
<source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(presione la tecla q para apagar y continuar después)</translation>
+ <translation type="unfinished">(Presionar q para apagar y seguir luego)</translation>
</message>
<message>
<source>press q to shutdown</source>
@@ -3470,7 +3458,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<message>
<source>conflicted with a transaction with %1 confirmations</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
- <translation type="unfinished">Hay un conflicto con una transacción de %1 confirmaciones.</translation>
+ <translation type="unfinished">Hay un conflicto con una transacción con %1 confirmaciones</translation>
</message>
<message>
<source>0/unconfirmed, in memory pool</source>
@@ -3637,7 +3625,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>TransactionDescDialog</name>
<message>
<source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Esta ventana muestra información detallada sobre la transacción</translation>
+ <translation type="unfinished">Este panel muestra una descripción detallada de la transacción</translation>
</message>
<message>
<source>Details for %1</source>
@@ -3688,19 +3676,19 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Received with</source>
- <translation type="unfinished">Recibido con</translation>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Received from</source>
- <translation type="unfinished">Recibido de</translation>
+ <translation type="unfinished">Recibida de</translation>
</message>
<message>
<source>Sent to</source>
- <translation type="unfinished">Enviado a</translation>
+ <translation type="unfinished">Enviada a</translation>
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
</message>
<message>
<source>watch-only</source>
@@ -3767,15 +3755,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Received with</source>
- <translation type="unfinished">Recibido con</translation>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Sent to</source>
- <translation type="unfinished">Enviado a</translation>
+ <translation type="unfinished">Enviada a</translation>
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
</message>
<message>
<source>Other</source>
@@ -3807,7 +3795,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Copiar &amp;ID de la transacción</translation>
+ <translation type="unfinished">Copiar &amp;identificador de transacción</translation>
</message>
<message>
<source>Copy &amp;raw transaction</source>
@@ -3849,7 +3837,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmado</translation>
+ <translation type="unfinished">Confirmada</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3872,12 +3860,16 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Dirección</translation>
</message>
<message>
+ <source>ID</source>
+ <translation type="unfinished">Identificador</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Error al exportar</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
- <translation type="unfinished">Ocurrió un error al intentar guardar el historial de transacciones en %1.</translation>
+ <translation type="unfinished">Ha ocurrido un error al intentar guardar el historial de transacciones en %1.</translation>
</message>
<message>
<source>Exporting Successful</source>
@@ -3924,7 +3916,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">El archivo TBPF debe ser más pequeño de 100 MiB</translation>
+ <translation type="unfinished">El archivo de la TBPF debe ser inferior a 100 MiB</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
@@ -3939,11 +3931,11 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Fee bump error</source>
- <translation type="unfinished">Error de incremento de la comisión</translation>
+ <translation type="unfinished">Error de incremento de comisión</translation>
</message>
<message>
<source>Increasing transaction fee failed</source>
- <translation type="unfinished">Ha fallado el incremento de la comisión de transacción.</translation>
+ <translation type="unfinished">Fallo al incrementar la comisión de transacción</translation>
</message>
<message>
<source>Do you want to increase the fee?</source>
@@ -3972,32 +3964,31 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Can't draft transaction.</source>
- <translation type="unfinished">No se pudo preparar la transacción.</translation>
+ <translation type="unfinished">No se puede crear un borrador de la transacción.</translation>
</message>
<message>
<source>PSBT copied</source>
<translation type="unfinished">TBPF copiada </translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
- <translation type="unfinished">No puede firmar la transacción.</translation>
+ <translation type="unfinished">No se puede firmar la transacción.</translation>
</message>
<message>
<source>Could not commit transaction</source>
- <translation type="unfinished">No se pudo confirmar la transacción</translation>
+ <translation type="unfinished">No se ha podido confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">monedero predeterminado</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -4048,11 +4039,11 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s corrupto. Intenta utilizar la herramienta del monedero de Bitcoin para rescatar o restaurar una copia de seguridad.</translation>
+ <translation type="unfinished">%s corrupto. Intenta utilizar la herramienta del monedero de Bitcoin para rescatar o restaurar un respaldo.</translation>
</message>
<message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
+ <translation type="unfinished">%s no ha podido validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que ha permitido que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se ha dejado el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que ha causado este error.</translation>
</message>
<message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
@@ -4096,15 +4087,15 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">Error: la versión del archivo volcado no es compatible. Esta versión del monedero de Bitcoin solo admite archivos de volcado de la versión 1. Se obtuvo un archivo de volcado con la versión %s.</translation>
+ <translation type="unfinished">Error: la versión del archivo volcado no es compatible. Esta versión del monedero de Bitcoin solo admite archivos de volcado de la versión 1. Se ha obtenido un archivo de volcado con la versión %s.</translation>
</message>
<message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
- <translation type="unfinished">Error: los monederos heredados solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32".</translation>
+ <translation type="unfinished">Error: Los monederos de tipo "legacy" solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32".</translation>
</message>
<message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Error: No se pueden producir descriptores para este monedero tipo "legacy". Asegúrate de proporcionar la frase de contraseña del monedero si está encriptada.</translation>
+ <translation type="unfinished">Error: No se pueden producir descriptores para este monedero de tipo "legacy". Asegúrate de proporcionar la frase de contraseña del monedero si está encriptada.</translation>
</message>
<message>
<source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
@@ -4112,7 +4103,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
- <translation type="unfinished">Archivo peers.dat inválido o corrupto (%s). Si crees que se trata de un error, infórmalo a %s. Como alternativa, puedes quitar el archivo %s (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo en el siguiente inicio.</translation>
+ <translation type="unfinished">Archivo "peers.dat" inválido o corrupto (%s). Si crees que se trata de un error, infórmalo a %s. Como alternativa, puedes quitar el archivo %s (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo en el siguiente inicio.</translation>
</message>
<message>
<source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
@@ -4120,7 +4111,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se proporcionó ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
+ <translation type="unfinished">No se ha proporcionado ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
@@ -4131,10 +4122,6 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
<translation type="unfinished">No se ha proporcionado el formato de archivo del monedero. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Verifica que la fecha y hora del equipo sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4168,7 +4155,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
- <translation type="unfinished">Este error podría ocurrir si el monedero no se cerró correctamente y se cargó por última vez usando una compilación con una versión más reciente de Berkeley DB. Si es así, usa el software que cargó por última vez este monedero.</translation>
+ <translation type="unfinished">Este error podría ocurrir si el monedero no se ha cerrado correctamente y se ha cargado por última vez usando una compilación con una versión más reciente de Berkeley DB. Si es así, usa el software que ha cargado por última vez este monedero.</translation>
</message>
<message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
@@ -4188,7 +4175,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
- <translation type="unfinished">La longitud total de la cadena de versión de red (%i) supera la longitud máxima (%i). Reduce el número o tamaño de uacomments .</translation>
+ <translation type="unfinished">La longitud total de la cadena de versión de red (%i) supera la longitud máxima (%i). Reduce el número o tamaño de uacomments.</translation>
</message>
<message>
<source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
@@ -4196,11 +4183,11 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">Se proporcionó un formato de monedero desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
+ <translation type="unfinished">Se ha proporcionado un formato de monedero desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
</message>
<message>
<source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
- <translation type="unfinished">El nivel de registro de la categoría específica no es compatible: %1$s=%2$s. Se esperaba %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %3$s. Niveles de registro válidos: %4 $s.</translation>
+ <translation type="unfinished">El nivel de registro específico de la categoría no es compatible: %1$s=%2$s. Se esperaba %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %3$s. Niveles de registro válidos: %4 $s.</translation>
</message>
<message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
@@ -4243,10 +4230,6 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
<translation type="unfinished">-maxmempool debe ser por lo menos de %d MB.</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ocurrió un error interno grave. Consulta debug.log para obtener más información.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
@@ -4260,11 +4243,11 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
+ <translation type="unfinished">No se puede escribir en el directorio de datos '%s'; verificar permisos.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">La configuración de %s es demasiado alta. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
+ <translation type="unfinished">El valor de %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -4276,7 +4259,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
- <translation type="unfinished">Error al leer %s. Todas las claves se leyeron correctamente, pero es probable que falten los datos de la transacción o metadatos de direcciones, o bien que sean incorrectos.</translation>
+ <translation type="unfinished">Error al leer %s. Todas las claves se han leído correctamente, pero es probable que falten los datos de la transacción o metadatos de direcciones, o bien que sean incorrectos.</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
@@ -4292,17 +4275,31 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
- <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
+ <translation type="unfinished">No se ha podido calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
+ </message>
+ <message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se ha podido eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</translation>
</message>
<message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
+ <translation type="unfinished">No se ha podido cambiar el nombre del archivo "peers.dat" inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
<message>
<source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
<translation type="unfinished">Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el vaciado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el vaciado del archivo para deshacer al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
</message>
@@ -4311,22 +4308,38 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas.</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable.</translation>
</message>
<message>
<source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
- <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero el proxy para conectarse con la red Tor está explícitamente prohibido: -onion=0.</translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero el proxy para conectar con la red Tor está explícitamente prohibido: -onion=0.</translation>
</message>
<message>
<source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
- <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero no se proporciona el proxy para conectarse con la red Tor: no se indican -proxy, -onion ni -listenonion.</translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero no se proporciona el proxy para conectar con la red Tor: no se indican -proxy, -onion ni -listenonion.</translation>
</message>
<message>
<source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam.</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas del monedero supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</translation>
</message>
@@ -4340,18 +4353,18 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
- <translation type="unfinished">No se validó la instantánea de la UTXO. Reinicia para reanudar la descarga normal del bloque inicial o intenta cargar una instantánea diferente.</translation>
+ <translation type="unfinished">No se ha validado la instantánea de la UTXO. Reinicia para reanudar la descarga normal del bloque inicial o intenta cargar una instantánea diferente.</translation>
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará la mempool.</translation>
+ <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará el mempool.</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
- <translation type="unfinished">Se encontró una entrada inesperada tipo "legacy" en el monedero basado en descriptores. Cargando monedero %s
+ <translation type="unfinished">Se ha encontrado una entrada inesperada tipo "legacy" en el monedero basado en descriptores. Cargando monedero %s
Es posible que el monedero haya sido manipulado o creado con malas intenciones.
</translation>
@@ -4362,13 +4375,17 @@ Es posible que el monedero haya sido manipulado o creado con malas intenciones.
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">Se encontró un descriptor desconocido. Cargando monedero %s.
+ <translation type="unfinished">Se ha encontrado un descriptor desconocido. Cargando monedero %s.
El monedero se podría haber creado con una versión más reciente.
Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora del ordenador parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj del ordenador, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4378,11 +4395,23 @@ No se puede limpiar la migración fallida</translation>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
-No se puede restaurar la copia de seguridad del monedero.</translation>
+No se puede restaurar el respaldo del monedero.</translation>
+ </message>
+ <message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ha ocurrido un error interno grave. Consulta debug.log para obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se han encontrado datos assumeutxo para el blockhash indicado "%s".</translation>
</message>
<message>
<source>Block verification was interrupted</source>
- <translation type="unfinished">Se interrumpió la verificación de bloques</translation>
+ <translation type="unfinished">Se ha interrumpido la verificación de bloques</translation>
</message>
<message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
@@ -4393,20 +4422,24 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se ha encontrado un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
- <translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
+ <translation type="unfinished">Se ha detectado que la base de datos de bloques está dañada.</translation>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">No se pudo encontrar el archivo asmap %s</translation>
+ <translation type="unfinished">No se ha podido encontrar el archivo asmap %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
- <translation type="unfinished">No se pudo analizar el archivo asmap %s</translation>
+ <translation type="unfinished">No se ha podido analizar el archivo asmap %s</translation>
</message>
<message>
<source>Disk space is too low!</source>
- <translation type="unfinished">¡El espacio en el disco es demasiado pequeño!</translation>
+ <translation type="unfinished">¡El espacio en disco es demasiado pequeño!</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
@@ -4421,6 +4454,10 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Error al confirmar transacción de la base de datos para eliminar transacciones del monedero</translation>
</message>
@@ -4434,7 +4471,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error initializing wallet database environment %s!</source>
- <translation type="unfinished">Error al inicializar el entorno de la base de datos del monedero %s</translation>
+ <translation type="unfinished">Error al inicializar el entorno de la base de datos del monedero %s</translation>
</message>
<message>
<source>Error loading %s</source>
@@ -4482,7 +4519,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
- <translation type="unfinished">Error: No se pudo crear el cursor en la base de datos</translation>
+ <translation type="unfinished">Error: No se ha podido crear el cursor en la base de datos</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
@@ -4494,19 +4531,19 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Error: No se puede crear un monedero solo de observación</translation>
+ <translation type="unfinished">Error: No se ha podido crear un monedero solo de observación</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió una clave que no es hexadecimal (%s)</translation>
+ <translation type="unfinished">Error: Se ha recibido una clave que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió un valor que no es hexadecimal (%s)</translation>
+ <translation type="unfinished">Error: Se ha recibido un valor que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
- <translation type="unfinished">Error: El pool de claves se agotó. Invoca keypoolrefill primero.</translation>
+ <translation type="unfinished">Error: El pool de claves se ha agotado. Invoca keypoolrefill primero.</translation>
</message>
<message>
<source>Error: Missing checksum</source>
@@ -4514,7 +4551,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
- <translation type="unfinished">Error: No hay direcciones %s disponibles .</translation>
+ <translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
@@ -4569,10 +4606,22 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para el monedero %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">No se ha podido conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se ha podido desconectar el bloque.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se ha podido leer el bloque.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Error al rescanear el monedero durante la inicialización</translation>
</message>
@@ -4585,6 +4634,22 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se ha podido escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Error al eliminar la transacción: %s</translation>
</message>
@@ -4602,7 +4667,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">El bloque génesis es incorrecto o no se encontró. ¿El directorio de datos es incorrecto para la red?</translation>
+ <translation type="unfinished">El bloque génesis es incorrecto o no se ha encontrado. ¿El directorio de datos es incorrecto para la red?</translation>
</message>
<message>
<source>Initialization sanity check failed. %s is shutting down.</source>
@@ -4610,7 +4675,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Input not found or already spent</source>
- <translation type="unfinished">Entrada no encontrada o ya gastada</translation>
+ <translation type="unfinished">La entrada no se ha encontrado o ya se ha gastado</translation>
</message>
<message>
<source>Insufficient dbcache for block verification</source>
@@ -4662,7 +4727,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">Fallo en la escucha para conexiones entrantes (la escucha devolvió el error %s)</translation>
+ <translation type="unfinished">Fallo en la escucha para conexiones entrantes (la escucha ha devuelto el error %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -4681,6 +4746,10 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Cargando monedero...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta el importe</translation>
</message>
@@ -4702,13 +4771,17 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
- <translation type="unfinished">La entrada preseleccionada no se encontró %s</translation>
+ <translation type="unfinished">La entrada preseleccionada no se ha encontrado %s</translation>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
<translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4753,6 +4826,18 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se ha hecho eco de la dirección.</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se ha hecho eco de una dirección inesperada: %s.</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante ha devuelto un error: %s.</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
@@ -4781,6 +4866,18 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s.</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s.</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s.</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
@@ -4790,13 +4887,17 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">El importe de la transacción es muy pequeño para pagar la comisión</translation>
+ <translation type="unfinished">El importe de la transacción es demasiado pequeño para pagar la comisión</translation>
</message>
<message>
<source>The wallet will avoid paying less than the minimum relay fee.</source>
<translation type="unfinished">El monedero evitará pagar menos que la comisión mínima de retransmisión. </translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4837,12 +4938,8 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Transacción demasiado grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">No se puede establecer un enlace a %s en este equipo (bind devolvió el error %s)</translation>
+ <translation type="unfinished">No se puede establecer un enlace a %s en este equipo (bind ha devuelto el error %s)</translation>
</message>
<message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
@@ -4901,6 +4998,10 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
</message>
@@ -4942,11 +5043,11 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Settings file could not be read</source>
- <translation type="unfinished">El archivo de configuración no puede leerse</translation>
+ <translation type="unfinished">El archivo de configuración no pudo leerse</translation>
</message>
<message>
<source>Settings file could not be written</source>
- <translation type="unfinished">El archivo de configuración no puede escribirse</translation>
+ <translation type="unfinished">El archivo de configuración no ha podido escribirse</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts
index 0f4dda3755..419d9a0437 100644
--- a/src/qt/locale/bitcoin_es_CL.ts
+++ b/src/qt/locale/bitcoin_es_CL.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copiar la dirección actualmente seleccionada al sistema de portapapeles</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -177,6 +177,14 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Introducir la vieja contraseña y la nueva contraseña para la billetera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recuerda que codificando tu billetera no garantiza mantener a salvo tus bitcoins en caso de tener virus en el computador.</translation>
</message>
@@ -264,7 +272,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <translation type="unfinished">Se ha producido un error interno. 1%1 Se intentará continuar de manera segura. Este es un error inesperado que se puede reportar como se describe a continuación.</translation>
+ <translation type="unfinished">Se ha producido un error interno. %1 Se intentará continuar de manera segura. Este es un error inesperado que se puede reportar como se describe a continuación.</translation>
</message>
</context>
<context>
@@ -281,7 +289,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 todavía no ha terminado de forma segura...</translation>
</message>
<message>
<source>unknown</source>
@@ -390,7 +398,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera predeterminada</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -487,20 +499,32 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Encripta las claves privadas que pertenecen a tu billetera</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Copia de seguridad del monedero</translation>
+ </message>
+ <message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Firmar &amp;mensaje...</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">Firme mensajes con sus direcciones de Bitcoin para demostrar que los posee</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Verificar mensaje...</translation>
+ </message>
+ <message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
<translation type="unfinished">Verifique los mensajes para asegurarse de que fueron firmados con las direcciones de Bitcoin especificadas</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar PSBT desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar PSBT desde el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -516,7 +540,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">Cerrar todos los monederos...</translation>
+ <translation type="unfinished">Cerrar Todos los Monederos...</translation>
</message>
<message>
<source>&amp;File</source>
@@ -536,7 +560,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -552,7 +576,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -614,28 +638,24 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Cargar PSBT desde el &amp;portapapeles...</translation>
</message>
<message>
- <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Cargar una transacción de Bitcoin parcialmente firmada desde el portapapeles</translation>
- </message>
- <message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Abrir consola de depuración y diagnóstico de nodo</translation>
+ <translation type="unfinished">Abrir la consola de depuración y diagnóstico del nodo</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de recepción</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Bitcoin: abrir URI</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -661,7 +681,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Cerrar todos los monederos</translation>
+ <translation type="unfinished">Cerrar todas las billeteras</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -676,30 +696,18 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Muestre el mensaje de ayuda %1 para obtener una lista con posibles opciones de línea de comandos de Bitcoin</translation>
</message>
<message>
- <source>&amp;Mask values</source>
- <translation type="unfinished">&amp;Ocultar valores</translation>
- </message>
- <message>
- <source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Ocultar los valores en la pestaña de vista general</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Monederos no disponibles</translation>
</message>
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Datos de la billetera</translation>
+ <translation type="unfinished">Datos del monedero </translation>
</message>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Cargar copia de seguridad de billetera</translation>
+ <translation type="unfinished">Cargar copia de seguridad del monedero</translation>
</message>
<message>
<source>Restore Wallet</source>
@@ -709,7 +717,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre del monedero</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
<source>&amp;Window</source>
@@ -729,20 +737,20 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">M&amp;ostrar</translation>
+ <translation type="unfinished">&amp;Mostrar</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n conexiones activas con la red Bitcoin</numerusform>
- <numerusform>%n conexiones activas con la red Bitcoin </numerusform>
+ <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de Bitcoin.</numerusform>
</translation>
</message>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">Hacer clic para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -752,7 +760,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
- <translation type="unfinished">Deshabilitar actividad de red</translation>
+ <translation type="unfinished">Desactivar la actividad de la red</translation>
</message>
<message>
<source>Enable network activity</source>
@@ -761,7 +769,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -821,11 +829,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">La generación de la clave HD está &lt;b&gt; activada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La generación de la clave HD está &lt;b&gt; activada &lt;/b&gt;</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">La generación de la clave HD está &lt;b&gt; desactivada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La generación de la clave HD está &lt;b&gt; desactivada &lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -833,11 +841,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">La billetera está &lt;b&gt; encriptada &lt;/ b&gt; y actualmente &lt;b&gt; desbloqueada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt; encriptada &lt;/b&gt; y actualmente &lt;b&gt; desbloqueada &lt;/b&gt;</translation>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">La billetera está &lt;b&gt; encriptada &lt;/ b&gt; y actualmente está &lt;b&gt; bloqueada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt; encriptada &lt;/b&gt; y actualmente está &lt;b&gt; bloqueada &lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -935,7 +943,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">B&amp;loquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -1032,7 +1040,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Estas seguro de wue deseas migrar la billetera 1 %1 1 ?</translation>
+ <translation type="unfinished">Estas seguro de wue deseas migrar la billetera &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
<message>
<source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
@@ -1082,10 +1090,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Advertencia sobre crear monedero</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir billetera</translation>
@@ -2158,6 +2162,14 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2175,7 +2187,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Wallet: </source>
- <translation type="unfinished">Monedero:</translation>
+ <translation type="unfinished">Monedero: </translation>
</message>
<message>
<source>&amp;Reset</source>
@@ -2202,6 +2214,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Seleccione un par para ver información detallada.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2210,10 +2226,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Identificador de sesión</translation>
</message>
@@ -2289,7 +2301,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>Current block height</source>
@@ -2316,6 +2328,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">El protocolo de red mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2504,6 +2520,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Actividad de red deshabilitada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
@@ -2589,7 +2609,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">Use este formulario para solicitar pagos. Todos los campos son &lt;b&gt; opcionales &lt;/ b&gt;.</translation>
+ <translation type="unfinished">Use este formulario para solicitar pagos. Todos los campos son &lt;b&gt; opcionales &lt;/b&gt;.</translation>
</message>
<message>
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
@@ -2850,7 +2870,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">Entradas...</translation>
+ <translation type="unfinished">Entradas…</translation>
</message>
<message>
<source>Choose…</source>
@@ -3180,8 +3200,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">&amp;Firmar Mensaje</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puedes firmar los mensajes con tus direcciones para demostrar que las posees. Ten cuidado de no firmar cualquier cosa vaga, ya que los ataques de phishing pueden tratar de engañarte firmando tu identidad a través de ellos. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3264,8 +3284,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Por favor, revisa la dirección e intenta nuevamente.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La dirección ingresada no corresponde a una llave válida.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3825,9 +3845,8 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">PSBT copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3838,12 +3857,12 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -3863,7 +3882,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Datos de la billetera</translation>
+ <translation type="unfinished">Datos del monedero </translation>
</message>
<message>
<source>Backup Failed</source>
@@ -3977,10 +3996,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se proporcionó el formato de archivo de billetera. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Verifica que la fecha y hora de la computadora sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4089,10 +4104,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">-maxmempool debe ser por lo menos de %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ocurrió un error interno grave. Consulta debug.log para obtener más información.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">No se puede resolver -%s direccion: '%s'</translation>
</message>
@@ -4105,10 +4116,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">La configuración de %s es demasiado alta. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
@@ -4141,6 +4148,12 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se ha podido eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -4149,6 +4162,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/O.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/O.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
</message>
@@ -4157,6 +4178,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable</translation>
</message>
@@ -4173,6 +4202,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas del monedero supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar una cantidad menor o consolidar manualmente las UTXO de la billetera.</translation>
</message>
@@ -4215,6 +4252,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora del ordenador parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj del ordenador, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4227,10 +4268,26 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ha ocurrido un error interno grave. Consulta debug.log para obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se han encontrado datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se ha encontrado un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Corrupción de base de datos de bloques detectada.</translation>
</message>
@@ -4259,6 +4316,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
</message>
@@ -4408,10 +4469,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">No se ha podido conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se ha podido desconectar el bloque.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Ha fallado la escucha en todos los puertos. Usa -listen=0 si desea esto.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se ha podido leer el bloque.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
@@ -4424,6 +4497,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se ha podido escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
</message>
@@ -4520,6 +4609,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta la cantidad</translation>
</message>
@@ -4548,6 +4641,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Entrada preseleccionada no solucionable %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4592,6 +4689,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante ha devuelto un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Firma de transacción fallida</translation>
</message>
@@ -4620,6 +4729,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente esta disponible desde %s.</translation>
</message>
@@ -4636,6 +4757,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La billetera no permitirá pagar menos que la fee de transmisión mínima (relay fee).</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4676,10 +4801,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Transacción muy grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">No es posible conectar con %s en este sistema (bind ha devuelto el error %s)</translation>
</message>
@@ -4740,6 +4861,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_CO.ts b/src/qt/locale/bitcoin_es_CO.ts
index 9ff4e9234f..14fbc9d056 100644
--- a/src/qt/locale/bitcoin_es_CO.ts
+++ b/src/qt/locale/bitcoin_es_CO.ts
@@ -51,7 +51,7 @@
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Elige la dirección con la que se recibirán monedas</translation>
+ <translation type="unfinished">Elige la dirección en la que se recibirán monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -65,7 +65,7 @@
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Estas son tus direcciones de Bitcoin para recibir pagos. Usa el botón "Crear nueva dirección de recepción" en la pestaña "Recibir" para crear nuevas direcciones.
-Solo es posible firmar con direcciones de tipo legacy.</translation>
+Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -184,6 +184,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Ingresa la antigua frase de contraseña y la nueva frase de contraseña para la billetera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recuerda que encriptar tu billetera no garantiza la protección total contra el robo de tus bitcoins si la computadora está infectada con malware.</translation>
</message>
@@ -225,7 +233,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto tiene éxito, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
+ <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto es correcto, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -259,7 +267,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<name>BitcoinApplication</name>
<message>
<source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">El archivo de configuración %1 puede estar corrupto o no ser válido.</translation>
+ <translation type="unfinished">El archivo de configuración %1 puede estar dañado o no ser válido.</translation>
</message>
<message>
<source>Runaway exception</source>
@@ -292,7 +300,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 aún no se cerró de forma segura...</translation>
</message>
<message>
<source>unknown</source>
@@ -401,7 +409,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera predeterminada</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -434,7 +446,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Show information about %1</source>
- <translation type="unfinished">Mostrar Información sobre %1</translation>
+ <translation type="unfinished">Mostrar información sobre %1</translation>
</message>
<message>
<source>About &amp;Qt</source>
@@ -491,7 +503,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Options…</source>
- <translation type="unfinished">&amp;Opciones…</translation>
+ <translation type="unfinished">&amp;Opciones...</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
@@ -499,15 +511,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Encriptar las claves privadas que pertenecen a la billetera</translation>
+ <translation type="unfinished">Encriptar las llaves privadas que pertenecen a tu billetera</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera...</translation>
+ <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
</message>
<message>
<source>Sign &amp;message…</source>
@@ -515,7 +527,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Firmar mensajes con tus direcciones de Bitcoin para demostrar que te pertenecen</translation>
+ <translation type="unfinished">Firmar un mensaje para provar que usted es dueño de esta dirección</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -523,11 +535,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar mensajes para asegurarte de que estén firmados con direcciones de Bitcoin concretas</translation>
+ <translation type="unfinished">Verificar mensajes comprobando que están firmados con direcciones Bitcoin concretas</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar TBPF desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar TBPF desde el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -535,11 +547,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Cerrar billetera...</translation>
+ <translation type="unfinished">Cerrar Billetera...</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Crear billetera...</translation>
+ <translation type="unfinished">Crear Billetera...</translation>
</message>
<message>
<source>Close All Wallets…</source>
@@ -563,7 +575,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -579,7 +591,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -587,11 +599,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de envío usadas</translation>
+ <translation type="unfinished">Mostrar la lista de direcciones de envío y etiquetas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de recepción usadas</translation>
+ <translation type="unfinished">Mostrar la lista de direcciones de recepción y etiquetas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -618,7 +630,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Las transacciones posteriores aún no están visibles.</translation>
+ <translation type="unfinished">Las transacciones posteriores aún no estarán visibles.</translation>
</message>
<message>
<source>Warning</source>
@@ -658,7 +670,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de destino</translation>
+ <translation type="unfinished">&amp;Direcciones de recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
@@ -708,11 +720,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Ocultar los valores en la pestaña "Vista general"</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
+ <translation type="unfinished">Ocultar los valores en la pestaña de vista general</translation>
</message>
<message>
<source>No wallets available</source>
@@ -736,7 +744,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre de la billetera</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
<source>&amp;Window</source>
@@ -752,7 +760,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 cliente</translation>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -942,7 +950,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmada</translation>
+ <translation type="unfinished">Confirmado</translation>
</message>
<message>
<source>Copy amount</source>
@@ -1117,10 +1125,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Advertencia al abrir billetera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir billetera</translation>
@@ -1357,11 +1361,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Se almacenará al menos %1 GB de información en este directorio, que aumentará con el tiempo.</translation>
+ <translation type="unfinished">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Se almacenará aproximadamente %1 GB de información en este directorio.</translation>
+ <translation type="unfinished">Se almacenarán aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -2221,10 +2225,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de datos, usa la opción "%1".</translation>
</message>
<message>
- <source>Blocksdir</source>
- <translation type="unfinished">Directorio de bloques</translation>
- </message>
- <message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de bloques, usa la opción "%1".</translation>
</message>
@@ -2245,6 +2245,14 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2293,6 +2301,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2301,10 +2313,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Identificador de sesión</translation>
</message>
@@ -2411,6 +2419,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">El protocolo de red mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2603,6 +2615,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin ninguna billetera</translation>
</message>
@@ -3068,7 +3084,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>%1 to '%2'</source>
- <translation type="unfinished">%1 a '%2'</translation>
+ <translation type="unfinished">%1 a "%2"</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -3288,7 +3304,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Un mensaje que se adjuntó al bitcoin: URI que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
+ <translation type="unfinished">Un mensaje adjunto al URI de tipo "bitcoin:" que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
</message>
</context>
<context>
@@ -3313,8 +3329,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">&amp;Firmar mensaje</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3401,8 +3417,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Revisa la dirección e intenta de nuevo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La dirección ingresada no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3498,7 +3514,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Source</source>
- <translation type="unfinished">Fuente</translation>
+ <translation type="unfinished">Origen</translation>
</message>
<message>
<source>Generated</source>
@@ -3919,7 +3935,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">El archivo TBPF debe ser más pequeño de 100 MiB</translation>
+ <translation type="unfinished">El archivo de la TBPF debe ser más pequeño de 100 MiB</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
@@ -3974,9 +3990,8 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">TBPF copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3987,12 +4002,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -4126,10 +4141,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se proporcionó el formato de archivo de billetera. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Verifica que la fecha y hora de la computadora sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4238,10 +4249,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">-maxmempool debe ser por lo menos de %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ocurrió un error interno grave. Consulta debug.log para obtener más información.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
@@ -4254,10 +4261,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">El valor establecido para %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
@@ -4290,6 +4293,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se pudo eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -4298,6 +4307,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
</message>
@@ -4306,6 +4323,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable</translation>
</message>
@@ -4322,6 +4347,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Falló el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas de la billetera supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
</message>
@@ -4364,6 +4397,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora de la computadora parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj de la computadora, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4376,6 +4413,18 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ha ocurrido un error interno grave. Consulta debug.log para obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se encontraron datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
@@ -4388,6 +4437,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se encontró un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
</message>
@@ -4416,6 +4469,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
</message>
@@ -4564,10 +4621,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">No se pudo conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se pudo desconectar el bloque.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se pudo leer el bloque.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
@@ -4580,6 +4649,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se pudo escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Error al eliminar la transacción: %s</translation>
</message>
@@ -4676,6 +4761,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta el importe</translation>
</message>
@@ -4704,6 +4793,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4748,6 +4841,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante ha devuelto un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
@@ -4776,6 +4881,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
@@ -4792,6 +4909,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La billetera evitará pagar menos que la comisión mínima de retransmisión.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4832,10 +4953,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Transacción demasiado grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">No se puede establecer un enlace a %s en esta computadora (bind devolvió el error %s)</translation>
</message>
@@ -4896,6 +5013,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
</message>
@@ -4913,7 +5034,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: Could not add watchonly tx %s to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción %s a la billetera solo de observación.</translation>
+ <translation type="unfinished">Error: No se puede agregar la transacción solo de observación %s a la billetera solo de observación</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts
index c8342ad3bc..47008084b8 100644
--- a/src/qt/locale/bitcoin_es_DO.ts
+++ b/src/qt/locale/bitcoin_es_DO.ts
@@ -51,7 +51,7 @@
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Elige la dirección con la que se recibirán monedas</translation>
+ <translation type="unfinished">Elige la dirección en la que se recibirán monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -184,6 +184,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Ingresa la antigua frase de contraseña y la nueva frase de contraseña para la billetera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recuerda que encriptar tu billetera no garantiza la protección total contra el robo de tus bitcoins si la computadora está infectada con malware.</translation>
</message>
@@ -225,7 +233,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto tiene éxito, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
+ <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto es correcto, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -259,7 +267,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<name>BitcoinApplication</name>
<message>
<source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">El archivo de configuración %1 puede estar corrupto o no ser válido.</translation>
+ <translation type="unfinished">El archivo de configuración %1 puede estar dañado o no ser válido.</translation>
</message>
<message>
<source>Runaway exception</source>
@@ -292,7 +300,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 aún no se cerró de forma segura...</translation>
</message>
<message>
<source>unknown</source>
@@ -401,7 +409,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -490,16 +502,12 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">&amp;Recibir</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">&amp;Opciones…</translation>
- </message>
- <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Encriptar billetera…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Encriptar las claves privadas que pertenecen a la billetera</translation>
+ <translation type="unfinished">Encriptar las llaves privadas que pertenecen a tu billetera</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -507,7 +515,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
</message>
<message>
<source>Sign &amp;message…</source>
@@ -515,7 +523,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Firmar mensajes con tus direcciones de Bitcoin para demostrar que te pertenecen</translation>
+ <translation type="unfinished">Firma mensajes con tus direcciones Bitcoin para probar que eres dueño de ellas</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -523,11 +531,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar mensajes para asegurarte de que estén firmados con direcciones de Bitcoin concretas</translation>
+ <translation type="unfinished">Verificar mensajes para asegurar que estaban firmados con direcciones Bitcoin especificas</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar TBPF desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar TBPF desde el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -555,7 +563,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">&amp;Ayuda</translation>
+ <translation type="unfinished">A&amp;yuda</translation>
</message>
<message>
<source>Tabs toolbar</source>
@@ -563,7 +571,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -579,34 +587,34 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Solicitar pagos (genera códigos QR y URI de tipo "bitcoin:")</translation>
+ <translation type="unfinished">Solicitar pagos (genera codigo QR y URL's de Bitcoin)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de envío usadas</translation>
+ <translation type="unfinished">Mostrar la lista de direcciones de envío y etiquetas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de recepción usadas</translation>
+ <translation type="unfinished">Muestra la lista de direcciones de recepción y etiquetas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Opciones de línea de comandos</translation>
+ <translation type="unfinished">Opciones de línea de comandos</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Se procesó %n bloque del historial de transacciones.</numerusform>
- <numerusform>Se procesaron %n bloques del historial de transacciones.</numerusform>
+ <numerusform>%n bloque procesado del historial de transacciones.</numerusform>
+ <numerusform>%n bloques procesados del historial de transacciones.</numerusform>
</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 atrás</translation>
+ <translation type="unfinished">%1 detrás</translation>
</message>
<message>
<source>Catching up…</source>
@@ -614,11 +622,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">El último bloque recibido se generó hace %1.</translation>
+ <translation type="unfinished">El último bloque recibido fue generado hace %1 hora(s).</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Las transacciones posteriores aún no están visibles.</translation>
+ <translation type="unfinished">Transacciones después de esta no serán visibles todavía.</translation>
</message>
<message>
<source>Warning</source>
@@ -630,7 +638,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">Actualizado</translation>
+ <translation type="unfinished">Al día</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -641,10 +649,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Cargar TBPF desde el &amp;portapapeles...</translation>
</message>
<message>
- <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Cargar una transacción de Bitcoin parcialmente firmada desde el portapapeles</translation>
- </message>
- <message>
<source>Node window</source>
<translation type="unfinished">Ventana del nodo</translation>
</message>
@@ -654,15 +658,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de destino</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Abrir un URI de tipo "bitcoin:"</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -670,11 +674,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">Abrir una billetera</translation>
+ <translation type="unfinished">Abrir una cartera</translation>
</message>
<message>
<source>Close wallet</source>
- <translation type="unfinished">Cerrar billetera</translation>
+ <translation type="unfinished">Cerrar cartera</translation>
</message>
<message>
<source>Restore Wallet…</source>
@@ -699,22 +703,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Migrar una billetera</translation>
</message>
<message>
- <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Mostrar el mensaje de ayuda %1 para obtener una lista de las posibles opciones de línea de comandos de Bitcoin</translation>
- </message>
- <message>
- <source>&amp;Mask values</source>
- <translation type="unfinished">&amp;Ocultar valores</translation>
- </message>
- <message>
- <source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Ocultar los valores en la pestaña "Vista general"</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">No hay billeteras disponibles</translation>
</message>
@@ -736,23 +724,19 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre de la billetera</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;Ventana</translation>
</message>
<message>
- <source>Zoom</source>
- <translation type="unfinished">Acercar</translation>
- </message>
- <message>
<source>Main Window</source>
<translation type="unfinished">Ventana principal</translation>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 cliente</translation>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -767,13 +751,13 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
<numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
- <numerusform>%n conexiones activas con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de Bitcoin.</numerusform>
</translation>
</message>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">Hacer clic para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -792,7 +776,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -902,7 +886,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Después de la comisión:</translation>
+ <translation type="unfinished">Después de tasas:</translation>
</message>
<message>
<source>Change:</source>
@@ -910,19 +894,19 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>(un)select all</source>
- <translation type="unfinished">(des)marcar todos</translation>
+ <translation type="unfinished">(de)seleccionar todo</translation>
</message>
<message>
<source>Tree mode</source>
- <translation type="unfinished">Modo árbol</translation>
+ <translation type="unfinished">Modo de árbol</translation>
</message>
<message>
<source>List mode</source>
- <translation type="unfinished">Modo lista</translation>
+ <translation type="unfinished">Modo de lista</translation>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Importe</translation>
+ <translation type="unfinished">Monto</translation>
</message>
<message>
<source>Received with label</source>
@@ -942,11 +926,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmada</translation>
+ <translation type="unfinished">Confirmado</translation>
</message>
<message>
<source>Copy amount</source>
- <translation type="unfinished">Copiar importe</translation>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -966,7 +950,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -982,7 +966,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar después de la comisión</translation>
+ <translation type="unfinished">Copiar después de aplicar donación</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -998,7 +982,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished">Puede variar +/- %1 satoshi(s) por entrada.</translation>
+ <translation type="unfinished">Puede variar en +/- %1 satoshi(s) por entrada.</translation>
</message>
<message>
<source>(no label)</source>
@@ -1006,7 +990,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">cambio desde %1 (%2)</translation>
+ <translation type="unfinished">Enviar desde %1 (%2)</translation>
</message>
<message>
<source>(change)</source>
@@ -1031,7 +1015,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Create wallet warning</source>
- <translation type="unfinished">Advertencia al crear la billetera</translation>
+ <translation type="unfinished">Advertencia de crear billetera</translation>
</message>
<message>
<source>Can't list signers</source>
@@ -1117,10 +1101,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Advertencia al abrir billetera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir billetera</translation>
@@ -1357,11 +1337,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Se almacenará al menos %1 GB de información en este directorio, que aumentará con el tiempo.</translation>
+ <translation type="unfinished">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Se almacenará aproximadamente %1 GB de información en este directorio.</translation>
+ <translation type="unfinished">Se almacenarán aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -2221,10 +2201,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de datos, usa la opción "%1".</translation>
</message>
<message>
- <source>Blocksdir</source>
- <translation type="unfinished">Directorio de bloques</translation>
- </message>
- <message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de bloques, usa la opción "%1".</translation>
</message>
@@ -2245,6 +2221,14 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2293,6 +2277,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2301,10 +2289,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Identificador de sesión</translation>
</message>
@@ -2411,6 +2395,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">El protocolo de red mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2603,6 +2591,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin ninguna billetera</translation>
</message>
@@ -3022,7 +3014,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy amount</source>
- <translation type="unfinished">Copiar importe</translation>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
<source>Copy fee</source>
@@ -3030,7 +3022,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar después de la comisión</translation>
+ <translation type="unfinished">Copiar después de aplicar donación</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -3288,7 +3280,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Un mensaje que se adjuntó al bitcoin: URI que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
+ <translation type="unfinished">Un mensaje adjunto al URI de tipo "bitcoin:" que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
</message>
</context>
<context>
@@ -3313,8 +3305,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">&amp;Firmar mensaje</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3401,8 +3393,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Revisa la dirección e intenta de nuevo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La dirección ingresada no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3498,7 +3490,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Source</source>
- <translation type="unfinished">Fuente</translation>
+ <translation type="unfinished">Origen</translation>
</message>
<message>
<source>Generated</source>
@@ -3613,7 +3605,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Importe</translation>
+ <translation type="unfinished">Monto</translation>
</message>
<message>
<source>true</source>
@@ -3974,9 +3966,8 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">TBPF copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3987,12 +3978,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -4126,10 +4117,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se proporcionó el formato de archivo de billetera. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Verifica que la fecha y hora de la computadora sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4238,10 +4225,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">-maxmempool debe ser por lo menos de %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ocurrió un error interno grave. Consulta debug.log para obtener más información.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
@@ -4254,10 +4237,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">El valor establecido para %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
@@ -4290,6 +4269,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se pudo eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -4298,6 +4283,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
</message>
@@ -4306,6 +4299,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable</translation>
</message>
@@ -4322,6 +4323,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas de la billetera supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
</message>
@@ -4364,6 +4373,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora de la computadora parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj de la computadora, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4376,6 +4389,18 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ha ocurrido un error interno grave. Consulta debug.log para obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se encontraron datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
@@ -4388,6 +4413,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se encontró un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
</message>
@@ -4416,6 +4445,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
</message>
@@ -4564,10 +4597,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">No se pudo conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se pudo desconectar el bloque.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se pudo leer el bloque.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
@@ -4580,6 +4625,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se pudo escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Error al eliminar la transacción: %s</translation>
</message>
@@ -4676,6 +4737,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta el importe</translation>
</message>
@@ -4704,6 +4769,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4748,6 +4817,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante devolvió un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
@@ -4776,6 +4857,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
@@ -4792,6 +4885,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La billetera evitará pagar menos que la comisión mínima de retransmisión.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4832,10 +4929,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Transacción demasiado grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">No se puede establecer un enlace a %s en esta computadora (bind devolvió el error %s)</translation>
</message>
@@ -4896,6 +4989,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
</message>
@@ -4913,7 +5010,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: Could not add watchonly tx %s to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción %s a la billetera solo de observación.</translation>
+ <translation type="unfinished">Error: No se puede agregar la transacción solo de observación %s a la billetera solo de observación</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
diff --git a/src/qt/locale/bitcoin_es_MX.ts b/src/qt/locale/bitcoin_es_MX.ts
index ee6865bbd7..c487b7b32f 100644
--- a/src/qt/locale/bitcoin_es_MX.ts
+++ b/src/qt/locale/bitcoin_es_MX.ts
@@ -3,11 +3,12 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">0xB006A7c1B9639BE87461Ee9 0xB006A7c1B9639BE87461Ee9</translation>
+ <translation type="unfinished">Right-click to edit address or label
+Click-derecho para editar direccion o nivel</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">0xB006A7c1B9639BE87461Ee9 0xB006A7c1B9639BE87461Ee9</translation>
+ <translation type="unfinished">Crea una nueva dirección </translation>
</message>
<message>
<source>&amp;New</source>
@@ -15,7 +16,75 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copiar la dirección actualmente seleccionada al portapapeles del sistema</translation>
+ <translation type="unfinished">Copie la direccion seleccionada actualmente en el portapapeles del sistema</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">&amp;copia</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">Borre la direccion seleccionada actualmente de la lista</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">introduzca la dirección o etiqueta para buscar</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Exportar </translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Borrar</translation>
+ </message>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Escoja la direccion a la que va enviar monedas tambien</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">Eliga la direccion para recibir monedas con</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
+ <translation type="unfinished">Esta es tu direccion para enviar pagos con Bitcoin. Siempre revisa la cantidad y la direccion correcta de monedas antes de enviar.</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
+Signing is only possible with addresses of the type 'legacy'.</source>
+ <translation type="unfinished">Esta es la direccion de Bitcoin para recibir pagos. Usa el botton ‘Crea nueva direccion de pagos’ en la pestaña crear nueva direccion.
+la entrada solo es posible con las direcciones del tipo ‘legacy’</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation type="unfinished">&amp;Copiar dirección </translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation type="unfinished">Copiar &amp;Etiqueta</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">&amp;Editar </translation>
+ </message>
+ <message>
+ <source>Export Address List</source>
+ <translation type="unfinished">Exportar la lista de direccion</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Archivo separado de comas</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">Se ha producido un error al intentar guardar la lista de direcciones en %1. Por favor, inténtelo de nuevo.</translation>
</message>
<message>
<source>Sending addresses - %1</source>
@@ -23,25 +92,100 @@
</message>
<message>
<source>Receiving addresses - %1</source>
- <translation type="unfinished">Recepción de direcciones - %1</translation>
+ <translation type="unfinished">Recibiendo direcciones - %1</translation>
</message>
- </context>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Error en la transportación.</translation>
+ </message>
+</context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta.</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Dirección </translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(Sin etiqueta)</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation type="unfinished">Diálogo de frase de contraseña</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation type="unfinished">Introduzca la frase de contraseña</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation type="unfinished">Nueva frase de contraseña</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation type="unfinished">Repetir nueva frase de contraseña</translation>
+ </message>
+ <message>
+ <source>Show passphrase</source>
+ <translation type="unfinished">Mostrar frase de contraseña</translation>
+ </message>
+ <message>
<source>Encrypt wallet</source>
- <translation type="unfinished">Encrypt wallet jesus daniel</translation>
+ <translation type="unfinished">cartera encriptada</translation>
+ </message>
+ <message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">Esta operación necesita la frase de contraseña de su billetera para desbloquear la billetera.</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">Cartera desbloqueda</translation>
+ </message>
+ <message>
+ <source>Change passphrase</source>
+ <translation type="unfinished">Cambiar frase de contraseña</translation>
+ </message>
+ <message>
+ <source>Confirm wallet encryption</source>
+ <translation type="unfinished">Confirmar el cifrado de la cartera</translation>
+ </message>
+ <message>
+ <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
+ <translation type="unfinished">Advertencia: Si cifras tu billetera y pierdes tu frase de contraseña,podrias 1 PERDER TODS TUS BITCOINS 1 !</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">¿Estás seguro de que quieres cifrar tu cartera?</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation type="unfinished">Cartera encriptada</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">Introduzca la frase de contraseña antigua y la nueva frase de contraseña para la cartera.</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">Recuerde que el cifrado de su billetera no puede proteger completamente sus bitcoins de ser robados por el malware que infecta su ordenador.</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
- <source>Default system font "%1"</source>
- <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
- </message>
- <message>
- <source>Custom…</source>
- <translation type="unfinished">Personalizada...</translation>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 todavía no ha terminado de forma segura...</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
@@ -85,33 +229,160 @@
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Cambiar la contraseña usada para la encriptación de la cartera</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Encriptar billetera…</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">Cifre las claves privadas que pertenecen a su billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Firmar &amp;mensaje...</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Firme mensajes con sus direcciones de Bitcoin para demostrar que los posee</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Verificar mensaje...</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Verifique los mensajes para asegurarse de que se firmaron con direcciones de Bitcoin especificadas.</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Cargar PSBT desde el archivo...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Abrir &amp;URI…</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Cerrar Billetera</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Crear Billetera</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Cerrar todas las carteras</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Archivo</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Configuraciones</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Ayuda</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Pestañas</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Sincronizando cabeceras (%1%) ...</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Sincronizando con la red...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Indexando bloques en disco...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Procesando bloques en disco...</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>%n bloque procesado del historial de transacciones.</numerusform>
+ <numerusform>%n bloques procesados del historial de transacciones.</numerusform>
</translation>
</message>
<message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Cargar PSBT desde el &amp;portapapeles...</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Abrir Cartera</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Abrir una cartera</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Cerrar cartera</translation>
</message>
<message>
- <source>Migrate a wallet</source>
- <translation type="unfinished">Migrar una billetera</translation>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Restaurar billetera…</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Restaurar una billetera desde un archivo de copia de seguridad</translation>
+ </message>
+ <message>
+ <source>No wallets available</source>
+ <translation type="unfinished">Monederos no disponibles</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Datos del monedero </translation>
</message>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Cargar copia de seguridad de billetera</translation>
+ <translation type="unfinished">Cargar copia de seguridad del monedero</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
- <source>Restore Wallet</source>
- <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">Restaurar billetera</translation>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Ventana</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">Ventana principal</translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -119,7 +390,7 @@
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">M&amp;ostrar</translation>
+ <translation type="unfinished">&amp;Mostrar</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -130,157 +401,127 @@
</translation>
</message>
<message>
- <source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
- <source>Error creating wallet</source>
- <translation type="unfinished">Error al crear billetera</translation>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">Mostrar pestaña de pares</translation>
</message>
<message>
- <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">No se puede crear una nueva billetera, el software se compiló sin soporte sqlite (requerido para billeteras descriptivas)</translation>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Desactivar la actividad de la red</translation>
</message>
<message>
- <source>Warning: %1</source>
- <translation type="unfinished">Advertencia: %1</translation>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Habilitar actividad de red</translation>
</message>
<message>
- <source>Date: %1
-</source>
- <translation type="unfinished">Fecha: %1
-</translation>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
- <source>Amount: %1
-</source>
- <translation type="unfinished">Importe: %1
-</translation>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Clave privada &lt;b&gt;deshabilitada&lt;/b&gt;</translation>
</message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
<message>
- <source>Wallet: %1
-</source>
- <translation type="unfinished">Billetera: %1
-</translation>
+ <source>After Fee:</source>
+ <translation type="unfinished">Después de la comisión:</translation>
</message>
<message>
- <source>Type: %1
-</source>
- <translation type="unfinished">Tipo: %1
-</translation>
+ <source>Change:</source>
+ <translation type="unfinished">Cambio:</translation>
</message>
<message>
- <source>Label: %1
-</source>
- <translation type="unfinished">Etiqueta: %1
-</translation>
+ <source>(un)select all</source>
+ <translation type="unfinished">(des)marcar todos</translation>
</message>
<message>
- <source>Address: %1
-</source>
- <translation type="unfinished">Dirección: %1
-</translation>
+ <source>Tree mode</source>
+ <translation type="unfinished">Modo arbol</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation type="unfinished">Transacción enviada</translation>
+ <source>List mode</source>
+ <translation type="unfinished">Modo de lista</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation type="unfinished">Transacción recibida</translation>
+ <source>Amount</source>
+ <translation type="unfinished">Importe</translation>
</message>
<message>
- <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">Clave privada &lt;b&gt;deshabilitada&lt;/b&gt;</translation>
+ <source>Received with label</source>
+ <translation type="unfinished">Recibido con etiqueta</translation>
</message>
<message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">La billetera está &lt;b&gt;cifrada&lt;/b&gt; y actualmente &lt;b&gt;desbloqueda&lt;/b&gt;</translation>
+ <source>Received with address</source>
+ <translation type="unfinished">Recibido con etiqueta</translation>
</message>
<message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">La billetera está &lt;b&gt;cifrada&lt;/b&gt; y actualmente &lt;b&gt;bloqueda&lt;/b&gt;</translation>
- </message>
- </context>
-<context>
- <name>CoinControlDialog</name>
- <message>
- <source>Coin Selection</source>
- <translation type="unfinished">Selección de monedas</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">Cantidad:</translation>
+ <source>Date</source>
+ <translation type="unfinished">Fecha</translation>
</message>
<message>
- <source>Amount:</source>
- <translation type="unfinished">Importe:</translation>
+ <source>Confirmations</source>
+ <translation type="unfinished">Confirmaciones</translation>
</message>
<message>
- <source>Fee:</source>
- <translation type="unfinished">Comisión:</translation>
+ <source>Confirmed</source>
+ <translation type="unfinished">Confirmada</translation>
</message>
- </context>
-<context>
- <name>MigrateWalletActivity</name>
<message>
- <source>Migrate wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <source>Copy amount</source>
+ <translation type="unfinished">Copiar importe</translation>
</message>
<message>
- <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</translation>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Copiar dirección</translation>
</message>
<message>
- <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
-If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
-If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
-
-The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
- <translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
-Si esta billetera contiene scripts solo de lectura, se creará una nueva billetera que los contenga.
-Si esta billetera contiene scripts solucionables pero no de lectura, se creará una nueva billetera diferente que los contenga.
-
-El proceso de migración creará una copia de seguridad de la billetera antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restore Wallet" (Restaurar billetera).</translation>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Copiar &amp;etiqueta</translation>
</message>
<message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Copiar &amp;importe</translation>
</message>
<message>
- <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <translation type="unfinished">Migrando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">Copiar &amp;identificador de transacción e índice de salidas</translation>
</message>
<message>
- <source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
</message>
<message>
- <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">&amp;Desbloquear importe no gastado</translation>
</message>
<message>
- <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
+ <source>Copy quantity</source>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
- <source>Migration failed</source>
- <translation type="unfinished">Migración errónea</translation>
+ <source>Copy fee</source>
+ <translation type="unfinished">Tarifa de copia</translation>
</message>
<message>
- <source>Migration Successful</source>
- <translation type="unfinished">Migración correcta</translation>
+ <source>Copy after fee</source>
+ <translation type="unfinished">Copiar después de la tarifa</translation>
</message>
-</context>
-<context>
- <name>CreateWalletDialog</name>
<message>
- <source>You are one step away from creating your new wallet!</source>
- <translation type="unfinished">Estás a un paso de crear tu nueva billetera.</translation>
+ <source>Copy bytes</source>
+ <translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Please provide a name and, if desired, enable any advanced options</source>
- <translation type="unfinished">Escribe un nombre y, si lo deseas, activa las opciones avanzadas.</translation>
+ <source>Copy change</source>
+ <translation type="unfinished">Copiar cambio</translation>
</message>
</context>
<context>
@@ -316,66 +557,48 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
</context>
<context>
- <name>OptionsDialog</name>
- <message>
- <source>Font in the Overview tab: </source>
- <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
- </message>
- </context>
-<context>
- <name>PSBTOperationsDialog</name>
- <message>
- <source>Sends %1 to %2</source>
- <translation type="unfinished">Envía %1 a %2</translation>
- </message>
- </context>
-<context>
<name>RPCConsole</name>
<message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">Versión de la capa de transporte: %1</translation>
- </message>
- <message>
- <source>Transport</source>
- <translation type="unfinished">Transporte</translation>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
</message>
<message>
- <source>Session ID</source>
- <translation type="unfinished">Identificador de sesión</translation>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
</message>
<message>
- <source>detecting: peer could be v1 or v2</source>
- <extracomment>Explanatory text for "detecting" transport type.</extracomment>
- <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</translation>
</message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
<message>
- <source>v1: unencrypted, plaintext transport protocol</source>
- <extracomment>Explanatory text for v1 transport type.</extracomment>
- <translation type="unfinished">v1: protocolo de transporte de texto simple sin cifrar</translation>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta.</translation>
</message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
<message>
- <source>v2: BIP324 encrypted transport protocol</source>
- <extracomment>Explanatory text for v2 transport type.</extracomment>
- <translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
+ <source>Copy quantity</source>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
- <source>Node window - [%1]</source>
- <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ <source>Copy amount</source>
+ <translation type="unfinished">Copiar importe</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
- <source>Quantity:</source>
- <translation type="unfinished">Cantidad:</translation>
+ <source>Copy after fee</source>
+ <translation type="unfinished">Copiar después de la tarifa</translation>
</message>
<message>
- <source>%1 from wallet '%2'</source>
- <translation type="unfinished">%1 desde monedero '%2'</translation>
+ <source>Copy change</source>
+ <translation type="unfinished">Copiar cambio</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
@@ -386,6 +609,17 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
</context>
<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
+ </message>
+ </context>
+<context>
<name>TransactionDesc</name>
<message numerus="yes">
<source>matures in %n more block(s)</source>
@@ -395,64 +629,187 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</translation>
</message>
<message>
- <source>%1 (Certificate was not verified)</source>
- <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
+ <source>Amount</source>
+ <translation type="unfinished">Importe</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta.</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionView</name>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Archivo separado de comas</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta.</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Dirección </translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Error en la transportación.</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletModel</name>
+ <message>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
+ </message>
+ <message>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Exportar </translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Datos del monedero </translation>
</message>
</context>
<context>
<name>bitcoin-core</name>
<message>
- <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
- <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se ha podido eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/O.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/O.</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas del monedero supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora del ordenador parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj del ordenador, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ha ocurrido un error interno grave. Consulta debug.log para obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se han encontrado datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se ha encontrado un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">No se ha podido conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se ha podido desconectar el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se ha podido leer el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se ha podido escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
</message>
<message>
- <source>Error committing db txn for wallet transactions removal</source>
- <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
</message>
<message>
- <source>Error starting db txn for wallet transactions removal</source>
- <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
</message>
<message>
- <source>Error: Unable to read wallet's best block locator record</source>
- <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
</message>
<message>
- <source>Error: Unable to write solvable wallet best block locator record</source>
- <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
</message>
<message>
- <source>Error: Unable to write watchonly wallet best block locator record</source>
- <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
</message>
<message>
- <source>Error: address book copy failed for wallet %s</source>
- <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
- </translation>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
</message>
<message>
- <source>Error: database transaction cannot be executed for wallet %s</source>
- <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante ha devuelto un error: %s</translation>
</message>
<message>
- <source>Failure removing transaction: %s</source>
- <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
</message>
<message>
- <source>Transaction %s does not belong to this wallet</source>
- <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
</message>
<message>
- <source>Wallet file creation failed: %s</source>
- <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
- <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions. </source>
- <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_SV.ts b/src/qt/locale/bitcoin_es_SV.ts
index 82e4242654..75fe65e2b2 100644
--- a/src/qt/locale/bitcoin_es_SV.ts
+++ b/src/qt/locale/bitcoin_es_SV.ts
@@ -51,7 +51,7 @@
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Elige la dirección con la que se recibirán monedas</translation>
+ <translation type="unfinished">Elige la dirección en la que se recibirán monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -184,6 +184,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Ingresa la antigua frase de contraseña y la nueva frase de contraseña para la billetera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recuerda que encriptar tu billetera no garantiza la protección total contra el robo de tus bitcoins si la computadora está infectada con malware.</translation>
</message>
@@ -225,7 +233,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto tiene éxito, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
+ <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto es correcto, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -259,7 +267,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<name>BitcoinApplication</name>
<message>
<source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">El archivo de configuración %1 puede estar corrupto o no ser válido.</translation>
+ <translation type="unfinished">El archivo de configuración %1 puede estar dañado o no ser válido.</translation>
</message>
<message>
<source>Runaway exception</source>
@@ -292,7 +300,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 aún no se cerró de forma segura...</translation>
</message>
<message>
<source>unknown</source>
@@ -401,7 +409,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -490,16 +502,12 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">&amp;Recibir</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">&amp;Opciones…</translation>
- </message>
- <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Encriptar billetera…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Encriptar las claves privadas que pertenecen a la billetera</translation>
+ <translation type="unfinished">Encriptar las llaves privadas que pertenecen a tu billetera</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -507,7 +515,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
</message>
<message>
<source>Sign &amp;message…</source>
@@ -515,19 +523,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Firmar mensajes con tus direcciones de Bitcoin para demostrar que te pertenecen</translation>
+ <translation type="unfinished">Firmar un mensaje para provar que usted es dueño de esta dirección</translation>
</message>
<message>
<source>&amp;Verify message…</source>
<translation type="unfinished">&amp;Verificar mensaje...</translation>
</message>
<message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar mensajes para asegurarte de que estén firmados con direcciones de Bitcoin concretas</translation>
- </message>
- <message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar TBPF desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar TBPF desde el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -546,24 +550,12 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Cerrar todas las billeteras...</translation>
</message>
<message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;Archivo</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <translation type="unfinished">&amp;Configuración</translation>
- </message>
- <message>
<source>&amp;Help</source>
- <translation type="unfinished">&amp;Ayuda</translation>
- </message>
- <message>
- <source>Tabs toolbar</source>
- <translation type="unfinished">Barra de pestañas</translation>
+ <translation type="unfinished">A&amp;yuda</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -579,19 +571,19 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Solicitar pagos (genera códigos QR y URI de tipo "bitcoin:")</translation>
+ <translation type="unfinished">Solicitar pagos (genera código QR y URI's de Bitcoin)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de envío usadas</translation>
+ <translation type="unfinished">Editar la lista de las direcciones y etiquetas almacenadas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de recepción usadas</translation>
+ <translation type="unfinished">Muestra la lista de direcciones de recepción y etiquetas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -600,37 +592,29 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Se procesó %n bloque del historial de transacciones.</numerusform>
- <numerusform>Se procesaron %n bloques del historial de transacciones.</numerusform>
+ <numerusform>%n bloque procesado del historial de transacciones.</numerusform>
+ <numerusform>%n bloques procesados del historial de transacciones.</numerusform>
</translation>
</message>
<message>
- <source>%1 behind</source>
- <translation type="unfinished">%1 atrás</translation>
- </message>
- <message>
<source>Catching up…</source>
<translation type="unfinished">Poniéndose al día...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">El último bloque recibido se generó hace %1.</translation>
+ <translation type="unfinished">El último bloque recibido fue generado hace %1</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Las transacciones posteriores aún no están visibles.</translation>
+ <translation type="unfinished">Las transacciones posteriores aún no son visibles.</translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished">Advertencia</translation>
</message>
<message>
- <source>Information</source>
- <translation type="unfinished">Información</translation>
- </message>
- <message>
<source>Up to date</source>
- <translation type="unfinished">Actualizado</translation>
+ <translation type="unfinished">Actualizado al día </translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -641,10 +625,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Cargar TBPF desde el &amp;portapapeles...</translation>
</message>
<message>
- <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Cargar una transacción de Bitcoin parcialmente firmada desde el portapapeles</translation>
- </message>
- <message>
<source>Node window</source>
<translation type="unfinished">Ventana del nodo</translation>
</message>
@@ -654,15 +634,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de destino</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Abrir un URI de tipo "bitcoin:"</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -670,11 +650,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">Abrir una billetera</translation>
+ <translation type="unfinished">Abrir una cartera</translation>
</message>
<message>
<source>Close wallet</source>
- <translation type="unfinished">Cerrar billetera</translation>
+ <translation type="unfinished">Cerrar cartera</translation>
</message>
<message>
<source>Restore Wallet…</source>
@@ -699,22 +679,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Migrar una billetera</translation>
</message>
<message>
- <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Mostrar el mensaje de ayuda %1 para obtener una lista de las posibles opciones de línea de comandos de Bitcoin</translation>
- </message>
- <message>
- <source>&amp;Mask values</source>
- <translation type="unfinished">&amp;Ocultar valores</translation>
- </message>
- <message>
- <source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Ocultar los valores en la pestaña "Vista general"</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">No hay billeteras disponibles</translation>
</message>
@@ -736,23 +700,19 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre de la billetera</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;Ventana</translation>
</message>
<message>
- <source>Zoom</source>
- <translation type="unfinished">Acercar</translation>
- </message>
- <message>
<source>Main Window</source>
<translation type="unfinished">Ventana principal</translation>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 cliente</translation>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -767,13 +727,13 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
<numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
- <numerusform>%n conexiones activas con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de Bitcoin.</numerusform>
</translation>
</message>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">Hacer clic para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -792,7 +752,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -914,15 +874,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Tree mode</source>
- <translation type="unfinished">Modo árbol</translation>
+ <translation type="unfinished">Modo arbol</translation>
</message>
<message>
<source>List mode</source>
- <translation type="unfinished">Modo lista</translation>
+ <translation type="unfinished">Modo de lista</translation>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Importe</translation>
+ <translation type="unfinished">Monto</translation>
</message>
<message>
<source>Received with label</source>
@@ -930,7 +890,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Received with address</source>
- <translation type="unfinished">Recibido con dirección</translation>
+ <translation type="unfinished">Recibido con etiqueta</translation>
</message>
<message>
<source>Date</source>
@@ -946,7 +906,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Copy amount</source>
- <translation type="unfinished">Copiar importe</translation>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -966,7 +926,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -978,11 +938,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Copy fee</source>
- <translation type="unfinished">Copiar comisión</translation>
+ <translation type="unfinished">Tarifa de copia</translation>
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar después de la comisión</translation>
+ <translation type="unfinished">Copiar después de la tarifa</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -998,7 +958,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished">Puede variar +/- %1 satoshi(s) por entrada.</translation>
+ <translation type="unfinished">Puede variar en +/- %1 satoshi(s) por entrada.</translation>
</message>
<message>
<source>(no label)</source>
@@ -1006,7 +966,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">cambio desde %1 (%2)</translation>
+ <translation type="unfinished">Cambio desde %1 (%2)</translation>
</message>
<message>
<source>(change)</source>
@@ -1031,7 +991,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Create wallet warning</source>
- <translation type="unfinished">Advertencia al crear la billetera</translation>
+ <translation type="unfinished">Advertencia de crear billetera</translation>
</message>
<message>
<source>Can't list signers</source>
@@ -1117,10 +1077,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Advertencia al abrir billetera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir billetera</translation>
@@ -1357,11 +1313,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Se almacenará al menos %1 GB de información en este directorio, que aumentará con el tiempo.</translation>
+ <translation type="unfinished">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Se almacenará aproximadamente %1 GB de información en este directorio.</translation>
+ <translation type="unfinished">Se almacenarán aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -2221,10 +2177,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de datos, usa la opción "%1".</translation>
</message>
<message>
- <source>Blocksdir</source>
- <translation type="unfinished">Directorio de bloques</translation>
- </message>
- <message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de bloques, usa la opción "%1".</translation>
</message>
@@ -2245,6 +2197,14 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2293,6 +2253,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2301,10 +2265,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Identificador de sesión</translation>
</message>
@@ -2411,6 +2371,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">El protocolo de red mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2603,6 +2567,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin ninguna billetera</translation>
</message>
@@ -3030,7 +2998,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar después de la comisión</translation>
+ <translation type="unfinished">Copiar después de la tarifa</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -3288,7 +3256,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Un mensaje que se adjuntó al bitcoin: URI que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
+ <translation type="unfinished">Un mensaje adjunto al URI de tipo "bitcoin:" que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
</message>
</context>
<context>
@@ -3313,8 +3281,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">&amp;Firmar mensaje</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3401,8 +3369,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Revisa la dirección e intenta de nuevo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La dirección ingresada no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3498,7 +3466,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Source</source>
- <translation type="unfinished">Fuente</translation>
+ <translation type="unfinished">Origen</translation>
</message>
<message>
<source>Generated</source>
@@ -3613,7 +3581,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Importe</translation>
+ <translation type="unfinished">Monto</translation>
</message>
<message>
<source>true</source>
@@ -3974,9 +3942,8 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">TBPF copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3987,12 +3954,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -4126,10 +4093,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se proporcionó el formato de archivo de billetera. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Verifica que la fecha y hora de la computadora sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4238,10 +4201,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">-maxmempool debe ser por lo menos de %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ocurrió un error interno grave. Consulta debug.log para obtener más información.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
@@ -4254,10 +4213,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">El valor establecido para %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
@@ -4290,6 +4245,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se pudo eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -4298,6 +4259,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
</message>
@@ -4306,6 +4275,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable</translation>
</message>
@@ -4322,6 +4299,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Falló el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas de la billetera supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
</message>
@@ -4364,6 +4349,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora de la computadora parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj de la computadora, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4376,6 +4365,18 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ha ocurrido un error interno grave. Consulta debug.log para obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se encontraron datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
@@ -4388,6 +4389,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se encontró un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
</message>
@@ -4416,6 +4421,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
</message>
@@ -4564,10 +4573,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">No se pudo conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se pudo desconectar el bloque.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se pudo leer el bloque.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
@@ -4580,6 +4601,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se pudo escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Error al eliminar la transacción: %s</translation>
</message>
@@ -4676,6 +4713,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta el importe</translation>
</message>
@@ -4704,6 +4745,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4748,6 +4793,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante devolvió un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
@@ -4776,6 +4833,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
@@ -4792,6 +4861,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La billetera evitará pagar menos que la comisión mínima de retransmisión.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4832,10 +4905,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Transacción demasiado grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">No se puede establecer un enlace a %s en esta computadora (bind devolvió el error %s)</translation>
</message>
@@ -4896,6 +4965,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
</message>
@@ -4913,7 +4986,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: Could not add watchonly tx %s to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción %s a la billetera solo de observación.</translation>
+ <translation type="unfinished">Error: No se puede agregar la transacción solo de observación %s a la billetera solo de observación</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
diff --git a/src/qt/locale/bitcoin_es_VE.ts b/src/qt/locale/bitcoin_es_VE.ts
index 681cd65b41..5ffa866afd 100644
--- a/src/qt/locale/bitcoin_es_VE.ts
+++ b/src/qt/locale/bitcoin_es_VE.ts
@@ -51,7 +51,7 @@
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Elige la dirección con la que se recibirán monedas</translation>
+ <translation type="unfinished">Elige la dirección en la que se recibirán monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -184,6 +184,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Ingresa la antigua frase de contraseña y la nueva frase de contraseña para la billetera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recuerda que encriptar tu billetera no garantiza la protección total contra el robo de tus bitcoins si la computadora está infectada con malware.</translation>
</message>
@@ -225,7 +233,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto tiene éxito, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
+ <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto es correcto, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -259,7 +267,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<name>BitcoinApplication</name>
<message>
<source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">El archivo de configuración %1 puede estar corrupto o no ser válido.</translation>
+ <translation type="unfinished">El archivo de configuración %1 puede estar dañado o no ser válido.</translation>
</message>
<message>
<source>Runaway exception</source>
@@ -292,7 +300,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 aún no se cerró de forma segura...</translation>
</message>
<message>
<source>unknown</source>
@@ -401,7 +409,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -490,16 +502,12 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">&amp;Recibir</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">&amp;Opciones…</translation>
- </message>
- <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Encriptar billetera…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Encriptar las claves privadas que pertenecen a la billetera</translation>
+ <translation type="unfinished">Encriptar las llaves privadas que pertenecen a tu billetera</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -507,7 +515,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
</message>
<message>
<source>Sign &amp;message…</source>
@@ -515,7 +523,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Firmar mensajes con tus direcciones de Bitcoin para demostrar que te pertenecen</translation>
+ <translation type="unfinished">Firmar mensajes con sus direcciones Bitcoin para demostrar la propiedad</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -523,11 +531,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar mensajes para asegurarte de que estén firmados con direcciones de Bitcoin concretas</translation>
+ <translation type="unfinished">Verificar mensajes comprobando que están firmados con direcciones Bitcoin concretas</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar TBPF desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar TBPF desde el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -555,7 +563,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">&amp;Ayuda</translation>
+ <translation type="unfinished">A&amp;yuda</translation>
</message>
<message>
<source>Tabs toolbar</source>
@@ -563,7 +571,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -579,29 +587,29 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Solicitar pagos (genera códigos QR y URI de tipo "bitcoin:")</translation>
+ <translation type="unfinished">Solicitar pagos (genera codigo QR y URL's de Bitcoin)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de envío usadas</translation>
+ <translation type="unfinished">Mostrar la lista de direcciones de envío y etiquetas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de recepción usadas</translation>
+ <translation type="unfinished">Muestra la lista de direcciones de recepción y etiquetas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Opciones de línea de comandos</translation>
+ <translation type="unfinished">&amp;Opciones de linea de comando</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Se procesó %n bloque del historial de transacciones.</numerusform>
- <numerusform>Se procesaron %n bloques del historial de transacciones.</numerusform>
+ <numerusform>%n bloque procesado del historial de transacciones.</numerusform>
+ <numerusform>%n bloques procesados del historial de transacciones.</numerusform>
</translation>
</message>
<message>
@@ -614,7 +622,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">El último bloque recibido se generó hace %1.</translation>
+ <translation type="unfinished">El último bloque recibido fue generado hace %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
@@ -622,7 +630,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Advertencia</translation>
+ <translation type="unfinished">Aviso</translation>
</message>
<message>
<source>Information</source>
@@ -641,10 +649,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Cargar TBPF desde el &amp;portapapeles...</translation>
</message>
<message>
- <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Cargar una transacción de Bitcoin parcialmente firmada desde el portapapeles</translation>
- </message>
- <message>
<source>Node window</source>
<translation type="unfinished">Ventana del nodo</translation>
</message>
@@ -654,15 +658,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de destino</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Abrir un URI de tipo "bitcoin:"</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -670,7 +674,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">Abrir una billetera</translation>
+ <translation type="unfinished">Abrir una cartera</translation>
</message>
<message>
<source>Close wallet</source>
@@ -699,22 +703,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Migrar una billetera</translation>
</message>
<message>
- <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Mostrar el mensaje de ayuda %1 para obtener una lista de las posibles opciones de línea de comandos de Bitcoin</translation>
- </message>
- <message>
- <source>&amp;Mask values</source>
- <translation type="unfinished">&amp;Ocultar valores</translation>
- </message>
- <message>
- <source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Ocultar los valores en la pestaña "Vista general"</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">No hay billeteras disponibles</translation>
</message>
@@ -736,23 +724,19 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre de la billetera</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;Ventana</translation>
</message>
<message>
- <source>Zoom</source>
- <translation type="unfinished">Acercar</translation>
- </message>
- <message>
<source>Main Window</source>
<translation type="unfinished">Ventana principal</translation>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 cliente</translation>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -767,13 +751,13 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
<numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
- <numerusform>%n conexiones activas con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de Bitcoin.</numerusform>
</translation>
</message>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">Hacer clic para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -792,7 +776,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -902,7 +886,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Después de la comisión:</translation>
+ <translation type="unfinished">Después de tasas:</translation>
</message>
<message>
<source>Change:</source>
@@ -910,11 +894,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>(un)select all</source>
- <translation type="unfinished">(des)marcar todos</translation>
+ <translation type="unfinished">(des)selecciona todos</translation>
</message>
<message>
<source>Tree mode</source>
- <translation type="unfinished">Modo árbol</translation>
+ <translation type="unfinished">Modo arbol</translation>
</message>
<message>
<source>List mode</source>
@@ -922,7 +906,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Importe</translation>
+ <translation type="unfinished">Cantidad</translation>
</message>
<message>
<source>Received with label</source>
@@ -942,11 +926,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmada</translation>
+ <translation type="unfinished">Confirmado</translation>
</message>
<message>
<source>Copy amount</source>
- <translation type="unfinished">Copiar importe</translation>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -966,7 +950,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -982,7 +966,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar después de la comisión</translation>
+ <translation type="unfinished">Copiar después de la tarifa</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -1006,7 +990,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">cambio desde %1 (%2)</translation>
+ <translation type="unfinished">Cambio desde %1 (%2)</translation>
</message>
<message>
<source>(change)</source>
@@ -1031,7 +1015,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Create wallet warning</source>
- <translation type="unfinished">Advertencia al crear la billetera</translation>
+ <translation type="unfinished">Advertencia de crear billetera</translation>
</message>
<message>
<source>Can't list signers</source>
@@ -1117,10 +1101,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Advertencia al abrir billetera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir billetera</translation>
@@ -1357,11 +1337,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Se almacenará al menos %1 GB de información en este directorio, que aumentará con el tiempo.</translation>
+ <translation type="unfinished">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Se almacenará aproximadamente %1 GB de información en este directorio.</translation>
+ <translation type="unfinished">Se almacenarán aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -2221,10 +2201,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de datos, usa la opción "%1".</translation>
</message>
<message>
- <source>Blocksdir</source>
- <translation type="unfinished">Directorio de bloques</translation>
- </message>
- <message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de bloques, usa la opción "%1".</translation>
</message>
@@ -2245,6 +2221,14 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2293,6 +2277,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2301,10 +2289,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Identificador de sesión</translation>
</message>
@@ -2411,6 +2395,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">El protocolo de red mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2603,6 +2591,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin ninguna billetera</translation>
</message>
@@ -3022,7 +3014,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy amount</source>
- <translation type="unfinished">Copiar importe</translation>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
<source>Copy fee</source>
@@ -3030,7 +3022,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar después de la comisión</translation>
+ <translation type="unfinished">Copiar después de la tarifa</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -3288,7 +3280,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Un mensaje que se adjuntó al bitcoin: URI que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
+ <translation type="unfinished">Un mensaje adjunto al URI de tipo "bitcoin:" que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
</message>
</context>
<context>
@@ -3313,8 +3305,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">&amp;Firmar mensaje</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3401,8 +3393,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Revisa la dirección e intenta de nuevo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La dirección ingresada no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3498,7 +3490,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Source</source>
- <translation type="unfinished">Fuente</translation>
+ <translation type="unfinished">Origen</translation>
</message>
<message>
<source>Generated</source>
@@ -3613,7 +3605,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Importe</translation>
+ <translation type="unfinished">Cantidad</translation>
</message>
<message>
<source>true</source>
@@ -3974,9 +3966,8 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">TBPF copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3987,12 +3978,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -4126,10 +4117,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se proporcionó el formato de archivo de billetera. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Verifica que la fecha y hora de la computadora sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4238,10 +4225,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">-maxmempool debe ser por lo menos de %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ocurrió un error interno grave. Consulta debug.log para obtener más información.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
@@ -4254,10 +4237,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">El valor establecido para %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
@@ -4290,6 +4269,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se pudo eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -4298,6 +4283,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
</message>
@@ -4306,6 +4299,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable</translation>
</message>
@@ -4322,6 +4323,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Falló el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas de la billetera supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
</message>
@@ -4364,6 +4373,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora de la computadora parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj de la computadora, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4376,6 +4389,18 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ha ocurrido un error interno grave. Consulta debug.log para obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se encontraron datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
@@ -4388,6 +4413,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se encontró un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
</message>
@@ -4416,6 +4445,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
</message>
@@ -4564,10 +4597,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">No se pudo conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se pudo desconectar el bloque.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se pudo leer el bloque.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
@@ -4580,6 +4625,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se pudo escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Error al eliminar la transacción: %s</translation>
</message>
@@ -4676,6 +4737,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta el importe</translation>
</message>
@@ -4704,6 +4769,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4748,6 +4817,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante devolvió un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
@@ -4776,6 +4857,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
@@ -4792,6 +4885,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La billetera evitará pagar menos que la comisión mínima de retransmisión.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4832,10 +4929,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Transacción demasiado grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">No se puede establecer un enlace a %s en esta computadora (bind devolvió el error %s)</translation>
</message>
@@ -4896,6 +4989,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
</message>
@@ -4913,7 +5010,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: Could not add watchonly tx %s to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción %s a la billetera solo de observación.</translation>
+ <translation type="unfinished">Error: No se puede agregar la transacción solo de observación %s a la billetera solo de observación</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts
index 8ffd068e5c..a23c1ffdd9 100644
--- a/src/qt/locale/bitcoin_et.ts
+++ b/src/qt/locale/bitcoin_et.ts
@@ -1468,10 +1468,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Palun kontrolli aadressi ja proovi uuesti.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Sisestatud aadress ei viita võtmele.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Rahakoti lahtilukustamine on katkestatud.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_eu.ts b/src/qt/locale/bitcoin_eu.ts
index 78cac641f0..d3ed81efdd 100644
--- a/src/qt/locale/bitcoin_eu.ts
+++ b/src/qt/locale/bitcoin_eu.ts
@@ -310,7 +310,11 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Diruzorro lehenetsia</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -582,10 +586,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Diruzorro guztiak itxi</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Diruzorro lehenetsia</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ez dago diru-zorrorik eskura</translation>
</message>
@@ -860,10 +860,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Diruzorroa irekitzen abisua</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Diruzorro lehenetsia</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Diruzorroa zabaldu</translation>
@@ -2157,11 +2153,7 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<source>PSBT copied</source>
<translation type="unfinished">PSBT kopiatua</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Diruzorro lehenetsia</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts
index 2c83bc082f..43b82049e1 100644
--- a/src/qt/locale/bitcoin_fa.ts
+++ b/src/qt/locale/bitcoin_fa.ts
@@ -3,113 +3,43 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">برای ویرایش آدرس یا برچسب زدن کلیک ‌راست کنید</translation>
+ <translation type="unfinished">برای ویرایش آدرس یا لیبل کلیک راست کنید</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">یک آدرس جدید ایجاد کنید</translation>
+ <translation type="unfinished">آدرس جدید بسازید</translation>
</message>
<message>
- <source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">کپی آدرسی که اکنون انتخاب کردید در کلیپ بورد سیستم</translation>
- </message>
- <message>
- <source>Receiving addresses - %1</source>
- <translation type="unfinished">آدرس‌های گیرنده - %1</translation>
- </message>
- </context>
-<context>
- <name>AskPassphraseDialog</name>
- <message>
- <source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">کی٠پول شما در حال رمزگذاری ست.</translation>
- </message>
- <message>
- <source>Your wallet is now encrypted. </source>
- <translation type="unfinished">کی٠پول شما اکنون رمزگذاری شد.</translation>
- </message>
- <message>
- <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">مهم: پشتیبان گیری قبلی Ú©Ù‡ از پرونده کی٠پول خود انجام داده اید باید با پرونده کی٠پول رمزگذاری شده تازه ایجاد شده جایگزین شود. به دلایل امنیتی ØŒ به محض شروع استÙاده از کی٠پول رمزگذاری شده جدید ØŒ پشتیبان گیری قبلی از پرونده کی٠پول رمزگذاری نشده Ùایده ای نخواهد داشت.
- </translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation type="unfinished">رمزگذاری کی٠پول انجام نشد
- </translation>
+ <source>&amp;New</source>
+ <translation type="unfinished">جدید</translation>
</message>
<message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">رمزگذاری کی٠پول به دلیل خطای داخلی انجام نشد. کی٠پول شما رمزگذاری نشده است.
- </translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation type="unfinished">رمزهای واردشده تطابق ندارند.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation type="unfinished">باز کردن Ù‚ÙÙ„ کی٠پول انجام نشد
- </translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">عبارت عبور وارد شده برای رمزگشایی کی٠پول نادرست است.
- </translation>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">آدرس انتخاب شده را در حاÙظه سیستم ذخیره کنید</translation>
</message>
<message>
- <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">عبارت عبور وارد شده برای رمزگشایی کی٠پول نادرست است. این شامل یک کاراکتر تهی (به معنی صÙر بایت) است. اگر عبارت عبور را در نسخه ای از این نرم اÙزار Ú©Ù‡ قدیمی تر نسخه 25.0 است تنظیم کرده اید ØŒ لطÙا عبارت را تا آنجایی Ú©Ù‡ اولین کاراکتر تهی قرار دارد امتحان کنید ( خود کاراکتر تهی را درج نکنید ) Ùˆ دوباره امتحان کنید. اگر این کار موÙقیت آمیز بود ØŒ لطÙا یک عبارت عبور جدید تنظیم کنید تا دوباره به این مشکل بر نخورید.</translation>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">هم اÙزایی</translation>
</message>
<message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">هشدار: کلید کلاه Ù‚ÙÙ„ روشن است!
- </translation>
- </message>
-</context>
-<context>
- <name>BanTableModel</name>
- <message>
- <source>IP/Netmask</source>
- <translation type="unfinished">آی پی/نت ماسک</translation>
+ <source>C&amp;lose</source>
+ <translation type="unfinished">بستن</translation>
</message>
<message>
- <source>Banned Until</source>
- <translation type="unfinished">مسدودشده تا</translation>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">آدرس انتخاب شده را از لیست پاک کنید</translation>
</message>
-</context>
+ </context>
<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">Ùایل تنظیمات %1 ممکن است خراب یا نامعتبر باشد.</translation>
- </message>
- <message>
- <source>Runaway exception</source>
- <translation type="unfinished">استثناء Ùراری (این استثناء نشان دهنده این است Ú©Ù‡ هسته بیتکوین نتوانست چیزی را در Ú©ÛŒÙ(والت) بنویسد.)</translation>
- </message>
- <message>
- <source>Internal error</source>
- <translation type="unfinished">مشکل داخلی</translation>
- </message>
+ <name>AskPassphraseDialog</name>
<message>
- <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <translation type="unfinished">یک ارور داخلی رخ داده است. %1 تلاش خواهد کرد تا با امنیت ادامه دهد. این یک باگ غیر منتظره است که میتواند به صورت شرح شده در زیر این متن گزارش شود.</translation>
+ <source>Back</source>
+ <translation type="unfinished">بازگشت</translation>
</message>
-</context>
+ </context>
<context>
<name>QObject</name>
<message>
- <source>Do you want to reset settings to default values, or to abort without making changes?</source>
- <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">آیا Ù…ÛŒ خواهید تنظیمات را به مقادیر پیش Ùرض بازنشانی کنید یا بدون ایجاد تغییرات لغو کنید؟</translation>
- </message>
- <message>
- <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
- <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
- <translation type="unfinished">یک خطای مرگبار رخ داد. بررسی کنید Ú©Ù‡ Ùایل تنظیمات قابل نوشتن باشد یا سعی کنید با -nosettings اجرا کنید.</translation>
- </message>
- <message>
<source>Error: %1</source>
<translation type="unfinished">خطا: %1</translation>
</message>
@@ -118,8 +48,12 @@
<translation type="unfinished">%1 هنوز به صورت ایمن بیرون نرÙته است...</translation>
</message>
<message>
- <source>unknown</source>
- <translation type="unfinished">ناشناس</translation>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">تعبیه شده%1</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">سÙارشی...</translation>
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
@@ -244,6 +178,11 @@
<source>%1 GB</source>
<translation type="unfinished">%1 گیگابایت</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">کی٠پول پیش Ùرض
+ </translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -308,7 +247,7 @@
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">پراکسی &lt;br&gt;Ùعال شده است: %1&lt;/br&gt;</translation>
+ <translation type="unfinished">پراکسی &lt;b&gt;Ùعال&lt;/b&gt; شده است: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -332,10 +271,6 @@
<translation type="unfinished">دریاÙت</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">گزینه ها...</translation>
- </message>
- <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">رمزنگاری کی٠پول</translation>
</message>
@@ -417,14 +352,6 @@
<translation type="unfinished">در حال پردازش بلوکها روی دیسک..</translation>
</message>
<message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">در حال اتصال به همتاهای شبکه(Ù¾ÛŒÙر ها)...</translation>
- </message>
- <message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">درخواست پرداخت (ساخت کد QR و بیت‌کوین: URIs)</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation type="unfinished">نمایش لیست آدرس‌ها Ùˆ لیبل‌های ارسالی استÙاده شده</translation>
</message>
@@ -439,7 +366,7 @@
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>سابقه تراکنش بلوک(های) %n پردازش شد.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
</translation>
</message>
<message>
@@ -518,28 +445,10 @@
<translation type="unfinished">بازیابی کی٠پول…</translation>
</message>
<message>
- <source>Restore a wallet from a backup file</source>
- <extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">بازیابی یک کی٠پول از یک Ùایل پشتیبان</translation>
- </message>
- <message>
<source>Close all wallets</source>
<translation type="unfinished">همه‌ی کی٠پول‌ها را ببند</translation>
</message>
<message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">انتقال کی٠پول</translation>
- </message>
- <message>
- <source>Migrate a wallet</source>
- <translation type="unfinished">انتقال یک کی٠پول</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">کی٠پول پیش Ùرض
- </translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">هیچ کی٠پولی در دسترس نمی باشد</translation>
</message>
@@ -554,11 +463,6 @@
<translation type="unfinished">بارگیری پشتیبان‌گیری کی٠پول</translation>
</message>
<message>
- <source>Restore Wallet</source>
- <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">بازیابی کی٠پول</translation>
- </message>
- <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">نام کی٠پول</translation>
@@ -587,7 +491,7 @@
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n اتصال(های) Ùعال به شبکه بیت کوین.</numerusform>
</translation>
</message>
<message>
@@ -615,126 +519,63 @@
<translation type="unfinished">پیش‌همگام‌سازی سرصÙحه‌ها (%1%)…</translation>
</message>
<message>
- <source>Error creating wallet</source>
- <translation type="unfinished">خطا در ایجاد کی٠پول</translation>
- </message>
- <message>
- <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">نمی‌توان کی٠پول جدیدی ایجاد کرد، نرم‌اÙزار بدون پشتیبانی sqlite کامپایل شده است (برای کی٠پول‌های توصیÙ‌گر این ویژگی لازم است)</translation>
- </message>
- <message>
<source>Error: %1</source>
<translation type="unfinished">خطا: %1</translation>
</message>
<message>
- <source>Warning: %1</source>
- <translation type="unfinished">هشدار: %1</translation>
- </message>
- <message>
- <source>Date: %1
-</source>
- <translation type="unfinished">تاریخ: %1
-</translation>
- </message>
- <message>
- <source>Amount: %1
-</source>
- <translation type="unfinished">مبلغ: %1
-</translation>
- </message>
- <message>
- <source>Wallet: %1
-</source>
- <translation type="unfinished">کی٠پول: %1
-</translation>
- </message>
- <message>
- <source>Type: %1
-</source>
- <translation type="unfinished">نوع: %1
-</translation>
- </message>
- <message>
- <source>Label: %1
-</source>
- <translation type="unfinished">برچسب: %1
-</translation>
- </message>
- <message>
- <source>Address: %1
-</source>
- <translation type="unfinished">آدرس: %1
-</translation>
- </message>
- <message>
- <source>Sent transaction</source>
- <translation type="unfinished">تراکنش ارسالی</translation>
- </message>
- <message>
- <source>Incoming transaction</source>
- <translation type="unfinished">تراکنش دریاÙتی</translation>
- </message>
- <message>
- <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">تولید کلید HD &lt;b&gt;Ùعال است&lt;/b&gt;</translation>
- </message>
- <message>
- <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">تولید کلید HD &lt;b&gt; غیر Ùعال است&lt;/b&gt;</translation>
- </message>
- <message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
<translation type="unfinished">کلید خصوصی &lt;b&gt;غیر Ùعال &lt;/b&gt;</translation>
</message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
<message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">کی٠پول است &lt;b&gt; رمزگذاری شده &lt;/b&gt; Ùˆ در حال حاضر &lt;b&gt; تÙسیر شده است &lt;/b&gt;
- </translation>
+ <source>After Fee:</source>
+ <translation type="unfinished">بعد از احتساب کارمزد</translation>
</message>
<message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">کی٠پول است &lt;b&gt; رمزگذاری شده &lt;/b&gt; Ùˆ در حال حاضر &lt;b&gt; تÙسیر شده &lt;/b&gt;
- </translation>
+ <source>Change:</source>
+ <translation type="unfinished">تغییر</translation>
</message>
<message>
- <source>Original message:</source>
- <translation type="unfinished">پیام اصلی:</translation>
+ <source>(un)select all</source>
+ <translation type="unfinished">(عدم)انتخاب همه</translation>
</message>
-</context>
-<context>
- <name>CoinControlDialog</name>
<message>
- <source>Coin Selection</source>
- <translation type="unfinished">انتخاب سکه
- </translation>
+ <source>Tree mode</source>
+ <translation type="unfinished">حالت درختی</translation>
</message>
<message>
- <source>Quantity:</source>
- <translation type="unfinished">مقدار</translation>
+ <source>List mode</source>
+ <translation type="unfinished">حالت لیستی</translation>
</message>
<message>
- <source>Bytes:</source>
- <translation type="unfinished">بایت ها:</translation>
+ <source>Amount</source>
+ <translation type="unfinished">میزان وجه:</translation>
</message>
<message>
- <source>Amount:</source>
- <translation type="unfinished">میزان وجه:</translation>
+ <source>Received with label</source>
+ <translation type="unfinished">دریاÙت شده با برچسب</translation>
</message>
<message>
- <source>Fee:</source>
- <translation type="unfinished">هزینه</translation>
+ <source>Received with address</source>
+ <translation type="unfinished">دریاÙت شده با آدرس</translation>
</message>
<message>
- <source>After Fee:</source>
- <translation type="unfinished">بعد از احتساب کارمزد</translation>
+ <source>Date</source>
+ <translation type="unfinished">تاریخ</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">تغییر</translation>
+ <source>Confirmations</source>
+ <translation type="unfinished">تاییدیه</translation>
</message>
<message>
- <source>List mode</source>
- <translation type="unfinished">حالت لیستی</translation>
+ <source>Confirmed</source>
+ <translation type="unfinished">تایید شده</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation type="unfinished">کپی مقدار</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -785,6 +626,10 @@
<translation type="unfinished">(Ù‚ÙÙ„ شده است %1)</translation>
</message>
<message>
+ <source>(no label)</source>
+ <translation type="unfinished">(بدون لیبل)</translation>
+ </message>
+ <message>
<source>change from %1 (%2)</source>
<translation type="unfinished">تغییر از %1 (%2)</translation>
</message>
@@ -841,453 +686,43 @@
<context>
<name>MigrateWalletActivity</name>
<message>
- <source>Migrate wallet</source>
- <translation type="unfinished">انتقال کی٠پول</translation>
- </message>
- <message>
- <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">آیا برای انتقال کی٠پول مطمئن هستید &lt;i&gt;%1&lt;/i&gt;؟</translation>
- </message>
- <message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">انتقال کی٠پول</translation>
- </message>
- <message>
- <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <translation type="unfinished">در حال انتقال کی٠پول &lt;b&gt;%1&lt;/b&gt;... </translation>
- </message>
- <message>
- <source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">کی٠پول '%1' با موÙقیت منتقل گردید.</translation>
- </message>
- <message>
- <source>Migration failed</source>
- <translation type="unfinished">انتقال موÙÙ‚ نبود</translation>
- </message>
- <message>
- <source>Migration Successful</source>
- <translation type="unfinished">انتقال موÙÙ‚ بود</translation>
- </message>
-</context>
-<context>
- <name>OpenWalletActivity</name>
- <message>
- <source>Open wallet failed</source>
- <translation type="unfinished">بازکردن کی٠پول به مشکل خورده است</translation>
- </message>
- <message>
- <source>Open wallet warning</source>
- <translation type="unfinished">هشدار باز کردن کی٠پول</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">کی٠پول پیش Ùرض
- </translation>
- </message>
- <message>
- <source>Open Wallet</source>
- <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">کی٠پول را باز کنید
- </translation>
- </message>
- <message>
- <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">در حال باز کردن کی٠پول &lt;b&gt;%1&lt;/b&gt;</translation>
- </message>
-</context>
-<context>
- <name>RestoreWalletActivity</name>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">بازیابی کی٠پول</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">بازیابی کی٠پول &lt;b&gt;%1&lt;/b&gt; ...</translation>
- </message>
- <message>
- <source>Restore wallet failed</source>
- <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">بازیابی کی٠پول انجام نشد</translation>
- </message>
- <message>
- <source>Restore wallet warning</source>
- <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">هشدار بازیابی کی٠پول</translation>
- </message>
- <message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">بازیابی پیام کی٠پول</translation>
- </message>
-</context>
-<context>
- <name>WalletController</name>
- <message>
- <source>Close wallet</source>
- <translation type="unfinished">کی٠پول را ببندید</translation>
- </message>
- <message>
- <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">آیا برای بستن کی٠پول مطمئن هستید&lt;i&gt; %1 &lt;/i&gt; ؟</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">همه‌ی کی٠پول‌ها را ببند</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">اسکریپت های Watchonly با موÙقیت به کی٠پول '%1' منتقل گردیدند.</translation>
</message>
</context>
<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>Create Wallet</source>
- <translation type="unfinished">ایجاد کی٠پول
- </translation>
- </message>
- <message>
- <source>You are one step away from creating your new wallet!</source>
- <translation type="unfinished">تنها یک قدم با ایجاد کی٠پول جدیدتان Ùاصله دارید!</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <translation type="unfinished">نام کی٠پول</translation>
- </message>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">کی٠پول</translation>
- </message>
- <message>
- <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">کی٠پول را رمز نگاری نمائید. کی٠پول با کلمات رمز دلخواه شما رمز نگاری خواهد شد</translation>
- </message>
- <message>
- <source>Encrypt Wallet</source>
- <translation type="unfinished">رمز نگاری کی٠پول</translation>
- </message>
- <message>
- <source>Advanced Options</source>
- <translation type="unfinished">گزینه‌های پیشرÙته</translation>
- </message>
- <message>
- <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">غیر Ùعال کردن کلیدهای خصوصی برای این کی٠پول. کی٠پول هایی با کلید های خصوصی غیر Ùعال هیچ کلید خصوصی نداشته Ùˆ نمیتوانند HD داشته باشند Ùˆ یا کلید های خصوصی دارد شدنی داشته باشند. این کی٠پول ها صرÙاً برای رصد مناسب هستند.</translation>
- </message>
- <message>
- <source>Disable Private Keys</source>
- <translation type="unfinished">غیر Ùعال کردن کلیدهای خصوصی</translation>
- </message>
- <message>
- <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">یک کی٠پول خالی درست کنید. کی٠پول های خالی در ابتدا کلید یا اسکریپت خصوصی ندارند. کلیدها و آدرسهای خصوصی می توانند وارد شوند یا بذر HD را می توان بعداً تنظیم نمود.</translation>
- </message>
- <message>
- <source>Make Blank Wallet</source>
- <translation type="unfinished">ساخت کی٠پول خالی</translation>
- </message>
- <message>
- <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
- <translation type="unfinished">از یک دستگاه دیگر مانند کی٠پول سخت‌اÙزاری برای ورود استÙاده کنید. در ابتدا امضاکنندهٔ جانبی اسکریپت را در ترجیحات کی٠پول پیکربندی کنید.</translation>
- </message>
- <message>
- <source>External signer</source>
- <translation type="unfinished">امضاکنندهٔ جانبی</translation>
- </message>
- <message>
- <source>Create</source>
- <translation type="unfinished">ایجاد</translation>
- </message>
- <message>
- <source>Compiled without external signing support (required for external signing)</source>
- <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">تدوین شده بدون حمایت از امضای خارجی (نیازمند امضای خارجی)</translation>
- </message>
-</context>
-<context>
- <name>EditAddressDialog</name>
- <message>
- <source>Edit Address</source>
- <translation type="unfinished">ویرایش آدرس</translation>
- </message>
- <message>
- <source>&amp;Label</source>
- <translation type="unfinished">برچسب</translation>
- </message>
- <message>
- <source>The label associated with this address list entry</source>
- <translation type="unfinished">برچسب مرتبط با لیست آدرس ورودی</translation>
- </message>
- <message>
- <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">برچسب مرتبط با لیست آدرس ورودی Ù…ÛŒ باشد. این Ù…ÛŒ تواند Ùقط برای آدرس های ارسالی اصلاح شود.</translation>
- </message>
- <message>
- <source>&amp;Address</source>
- <translation type="unfinished">آدرس</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">آدرس ارسالی جدید</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation type="unfinished">ویرایش آدرس دریاÙتی</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation type="unfinished">ویرایش آدرس ارسالی</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">آدرس وارد شده "%1" آدرس معتبر بیت کوین نیست.</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book with label "%2".</source>
- <translation type="unfinished">آدرس وارد شده "%1" در حال حاظر در دÙترچه آدرس ها موجود است با برچسب "%2" .</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">نمیتوان کی٠پول را باز کرد.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation type="unfinished">تولید کلید جدید به خطا انجامید.</translation>
- </message>
-</context>
-<context>
- <name>FreespaceChecker</name>
- <message>
- <source>A new data directory will be created.</source>
- <translation type="unfinished">پوشه داده جدید ساخته خواهد شد</translation>
- </message>
- <message>
- <source>name</source>
- <translation type="unfinished">نام</translation>
- </message>
- <message>
- <source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">مسیر داده شده موجود است و به یک پوشه اشاره نمی‌کند.</translation>
- </message>
- <message>
- <source>Cannot create data directory here.</source>
- <translation type="unfinished">نمی توانید Ùهرست داده را در اینجا ایجاد کنید.
- </translation>
- </message>
-</context>
-<context>
<name>Intro</name>
- <message>
- <source>Bitcoin</source>
- <translation type="unfinished">بیت کوین</translation>
- </message>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform>%n گیگابایت Ùضای موجود</numerusform>
+ <numerusform>%n GB of space available</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform>(از %n گیگابایت مورد نیاز)</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(%n گیگابایت برای زنجیره کامل مورد نیاز است)</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
</translation>
</message>
- <message>
- <source>Choose data directory</source>
- <translation type="unfinished">دایرکتوری داده را انتخاب کنید</translation>
- </message>
- <message>
- <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">حداقل %1 گیگابایت اطلاعات در این شاخه ذخیره خواهد شد، Ú©Ù‡ به مرور زمان اÙزایش خواهد یاÙت.</translation>
- </message>
- <message>
- <source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">تقریبا %1 گیگابایت داده در این شاخه ذخیره خواهد شد.</translation>
- </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform>(برای بازیابی نسخه‌های پشتیبان %n روز (های) قدیمی کاÙÛŒ است)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
</translation>
</message>
- <message>
- <source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished">کی٠پول هم در همین دایرکتوری ذخیره می‌شود.</translation>
- </message>
- <message>
- <source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">خطا: نمی‌توان پوشه‌ای برای داده‌ها در «%1» ایجاد کرد.</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">خطا</translation>
- </message>
- <message>
- <source>Welcome</source>
- <translation type="unfinished">خوش آمدید</translation>
- </message>
- <message>
- <source>Welcome to %1.</source>
- <translation type="unfinished">به %1 خوش آمدید.</translation>
- </message>
- <message>
- <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">از آنجا که اولین مرتبه این برنامه اجرا می‌شود، شما می‌توانید محل ذخیره داده‌های %1 را انتخاب نمایید.</translation>
- </message>
- <message>
- <source>Limit block chain storage to</source>
- <translation type="unfinished">محدود Ú©Ù† حاÙظه زنجیره بلوک را به</translation>
- </message>
- <message>
- <source> GB</source>
- <translation type="unfinished">گیگابایت</translation>
- </message>
- <message>
- <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">وقتی تأیید را کلیک می‌کنید، %1 شروع به دانلود و پردازش زنجیره بلاک %4 کامل (%2 گیگابایت) می‌کند که با اولین تراکنش‌ها در %3 شروع می‌شود که %4 در ابتدا راه‌اندازی می شود.</translation>
- </message>
- <message>
- <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">اگر تصمیم بگیرید Ú©Ù‡ Ùضای ذخیره سازی زنجیره بلوک (هرس) را محدود کنید ØŒ داده های تاریخی باید بارگیری Ùˆ پردازش شود ØŒ اما اگر آن را حذ٠کنید ØŒ اگر شما دیسک Ú©Ù… استÙاده کنید.
- </translation>
- </message>
- <message>
- <source>Use the default data directory</source>
- <translation type="unfinished">از Ùهرست داده شده پیش استÙاده کنید
- </translation>
- </message>
- <message>
- <source>Use a custom data directory:</source>
- <translation type="unfinished">از یک Ùهرست داده سÙارشی استÙاده کنید:</translation>
- </message>
-</context>
-<context>
- <name>HelpMessageDialog</name>
- <message>
- <source>version</source>
- <translation type="unfinished">نسخه</translation>
- </message>
- <message>
- <source>About %1</source>
- <translation type="unfinished">حدود %1</translation>
- </message>
- <message>
- <source>Command-line options</source>
- <translation type="unfinished">گزینه های خط-Ùرمان</translation>
- </message>
-</context>
-<context>
- <name>ShutdownWindow</name>
- <message>
- <source>%1 is shutting down…</source>
- <translation type="unfinished">%1 در حال خاموش شدن است</translation>
- </message>
- <message>
- <source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">تا پیش از بسته شدن این پنجره کامپیوتر خود را خاموش نکنید.</translation>
- </message>
-</context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">Ùرم</translation>
- </message>
- <message>
- <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">معاملات اخیر ممکن است هنوز قابل مشاهده نباشند ، بنابراین ممکن است موجودی کی٠پول شما نادرست باشد. به محض اینکه همگام سازی کی٠پول شما با شبکه بیت کوین به پایان رسید ، این اطلاعات درست خواهد بود ، همانطور که در زیر توضیح داده شده است.
- </translation>
- </message>
- <message>
- <source>Number of blocks left</source>
- <translation type="unfinished">تعداد بلوک‌های باقیمانده</translation>
- </message>
- <message>
- <source>Unknown…</source>
- <translation type="unfinished">ناشناخته</translation>
- </message>
- <message>
- <source>calculating…</source>
- <translation type="unfinished">در حال رایانش</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">زمان آخرین بلوک</translation>
- </message>
- <message>
- <source>Progress</source>
- <translation type="unfinished">پیشرÙت</translation>
- </message>
- <message>
- <source>Progress increase per hour</source>
- <translation type="unfinished">سرعت اÙزایش پیشرÙت بر ساعت</translation>
- </message>
- <message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">زمان تقریبی باقی‌مانده تا همگام شدن</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">پنهان کردن</translation>
- </message>
- <message>
- <source>Esc</source>
- <translation type="unfinished">خروج</translation>
- </message>
- <message>
- <source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">ناشناخته. هماهنگ‌سازی سربرگ‌ها (%1، %2%) </translation>
- </message>
- <message>
- <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">ناشناس. پیش‌همگام‌سازی سرصÙحه‌ها (%1ØŒ %2% )…</translation>
- </message>
-</context>
-<context>
- <name>OpenURIDialog</name>
- <message>
- <source>URI:</source>
- <translation type="unfinished">آدرس:</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">استÙاده از آدرس کلیپ بورد</translation>
- </message>
-</context>
+ </context>
<context>
<name>OptionsDialog</name>
<message>
- <source>Options</source>
- <translation type="unfinished">گزینه ها</translation>
- </message>
- <message>
- <source>&amp;Main</source>
- <translation type="unfinished">&amp;اصلی</translation>
- </message>
- <message>
- <source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">اجرای خودکار %1 بعد زمان ورود به سیستم.</translation>
- </message>
- <message>
- <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Ùعال کردن هرس به طور قابل توجهی Ùضای دیسک مورد نیاز برای ذخیره تراکنش ها را کاهش Ù…ÛŒ دهد. همه بلوک ها هنوز به طور کامل تأیید شده اند. برای برگرداندن این تنظیم نیاز به بارگیری مجدد Ú©Ù„ بلاک چین است.</translation>
- </message>
- <message>
- <source>Size of &amp;database cache</source>
- <translation type="unfinished">اندازه کش پایگاه داده.</translation>
- </message>
- <message>
- <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">مسیر کامل به یک %1 اسکریپت سازگار ( مانند C:\Downloads\hwi.exe یا /Users/you/Downloads/hwi.py ) اخطار: بداÙزار میتواند بیتکوین های شما را به سرقت ببرد!</translation>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Ùونت در برگه Ú©Ù„ÛŒ:</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
@@ -1780,925 +1215,46 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;ذخیره کردن تصویر...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;کپی کردن image</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">URL ایجاد شده خیلی طولانی است. سعی کنید طول برچسب و یا پیام را کمتر کنید.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">خطا در تبدیل نشانی اینترنتی به صورت کد QR.</translation>
- </message>
- <message>
- <source>QR code support not available.</source>
- <translation type="unfinished">پستیبانی از QR کد در دسترس نیست.</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">ذحیره کردن Qr Code</translation>
- </message>
- <message>
- <source>PNG Image</source>
- <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
- <translation type="unfinished">عکس PNG</translation>
- </message>
-</context>
-<context>
<name>RPCConsole</name>
<message>
- <source>N/A</source>
- <translation type="unfinished">موجود نیست</translation>
- </message>
- <message>
- <source>Client version</source>
- <translation type="unfinished">ویرایش کنسول RPC</translation>
- </message>
- <message>
- <source>&amp;Information</source>
- <translation type="unfinished">&amp;اطلاعات</translation>
- </message>
- <message>
- <source>General</source>
- <translation type="unfinished">عمومی</translation>
- </message>
- <message>
- <source>Datadir</source>
- <translation type="unfinished">پوشه داده Datadir</translation>
- </message>
- <message>
- <source>Blocksdir</source>
- <translation type="unfinished">Ùولدر بلاکها</translation>
- </message>
- <message>
- <source>Startup time</source>
- <translation type="unfinished">زمان آغاز به کار</translation>
- </message>
- <message>
- <source>Network</source>
- <translation type="unfinished">شبکه</translation>
- </message>
- <message>
- <source>Name</source>
- <translation type="unfinished">نام</translation>
- </message>
- <message>
- <source>Number of connections</source>
- <translation type="unfinished">تعداد اتصال</translation>
- </message>
- <message>
- <source>Block chain</source>
- <translation type="unfinished">زنجیره مجموعه تراکنش ها</translation>
- </message>
- <message>
- <source>Memory Pool</source>
- <translation type="unfinished">استخر حاÙظه</translation>
- </message>
- <message>
- <source>Current number of transactions</source>
- <translation type="unfinished">تعداد تراکنش ها در حال حاضر</translation>
- </message>
- <message>
- <source>Memory usage</source>
- <translation type="unfinished">استÙاده از حاÙظه
- </translation>
- </message>
- <message>
- <source>Wallet: </source>
- <translation type="unfinished">کی٠پول:</translation>
- </message>
- <message>
- <source>(none)</source>
- <translation type="unfinished">(هیچ کدام)</translation>
- </message>
- <message>
- <source>&amp;Reset</source>
- <translation type="unfinished">&amp;ریست کردن</translation>
- </message>
- <message>
- <source>Received</source>
- <translation type="unfinished">دریاÙت شد</translation>
- </message>
- <message>
<source>Sent</source>
<translation type="unfinished">Ùرستاده شد</translation>
</message>
<message>
- <source>&amp;Peers</source>
- <translation type="unfinished">&amp;همتاها</translation>
- </message>
- <message>
- <source>Banned peers</source>
- <translation type="unfinished">همتاهای بن شده</translation>
- </message>
- <message>
- <source>Select a peer to view detailed information.</source>
- <translation type="unfinished">انتخاب همتا یا جÙت برای جزییات اطلاعات</translation>
- </message>
- <message>
- <source>Transport</source>
- <translation type="unfinished">جابه‌جایی</translation>
- </message>
- <message>
- <source>Version</source>
- <translation type="unfinished">نسخه</translation>
- </message>
- <message>
- <source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">اگرچه ما تراکنش ها را به این همتا بازپخش کنیم.</translation>
- </message>
- <message>
- <source>Transaction Relay</source>
- <translation type="unfinished">بازپخش تراکنش </translation>
- </message>
- <message>
- <source>Starting Block</source>
- <translation type="unfinished">بلاک اولیه</translation>
- </message>
- <message>
- <source>Synced Blocks</source>
- <translation type="unfinished">بلاک‌های همگام‌سازی‌ شده</translation>
- </message>
- <message>
- <source>Last Transaction</source>
- <translation type="unfinished">آخرین معامله</translation>
- </message>
- <message>
- <source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">سیستم خودمختار نگاشت شده برای متنوع سازی انتخاب همتا استÙاده Ù…ÛŒ شود.
- </translation>
- </message>
- <message>
- <source>Whether we relay addresses to this peer.</source>
- <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished"> ما آدرس‌ها را به این همتا ارسال می‌کنیم.</translation>
- </message>
- <message>
- <source>Address Relay</source>
- <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">رله آدرس</translation>
- </message>
- <message>
- <source>Addresses Processed</source>
- <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">آدرس ها پردازش شد</translation>
- </message>
- <message>
- <source>Addresses Rate-Limited</source>
- <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">آدرس ها با نرخ محدود</translation>
- </message>
- <message>
- <source>User Agent</source>
- <translation type="unfinished">نماینده کاربر</translation>
- </message>
- <message>
<source>Node window</source>
<translation type="unfinished">پنجره گره</translation>
</message>
- <message>
- <source>Current block height</source>
- <translation type="unfinished">ارتÙاع Ùعلی بلوک</translation>
- </message>
- <message>
- <source>Decrease font size</source>
- <translation type="unfinished">کاهش دادن اندازه Ùونت</translation>
- </message>
- <message>
- <source>Increase font size</source>
- <translation type="unfinished">اÙزایش دادن اندازه Ùونت</translation>
- </message>
- <message>
- <source>Direction/Type</source>
- <translation type="unfinished">مسیر/نوع </translation>
- </message>
- <message>
- <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">پروتکل شبکه در این همتا از طریق:IPv4, IPv6, Onion, I2P, or CJDNS متصل است.</translation>
- </message>
- <message>
- <source>Services</source>
- <translation type="unfinished">خدمات</translation>
- </message>
- <message>
- <source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">رله بلوک Ùشرده BIP152 با پهنای باند بالا: %1</translation>
- </message>
- <message>
- <source>High Bandwidth</source>
- <translation type="unfinished">پهنای باند بالا</translation>
- </message>
- <message>
- <source>Connection Time</source>
- <translation type="unfinished">زمان اتصال</translation>
- </message>
- <message>
- <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
- <translation type="unfinished">زمان سپری شده از زمان دریاÙت یک بلوک جدید Ú©Ù‡ بررسی‌های اعتبار اولیه را از این همتا دریاÙت کرده است.</translation>
- </message>
- <message>
- <source>Last Block</source>
- <translation type="unfinished">بلوک قبلی</translation>
- </message>
- <message>
- <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
- <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">زمان سپری شده از زمانی Ú©Ù‡ یک تراکنش جدید در مجموعه ما از این همتا دریاÙت شده است.</translation>
- </message>
- <message>
- <source>Last Send</source>
- <translation type="unfinished">آخرین ارسال</translation>
- </message>
- <message>
- <source>Last Receive</source>
- <translation type="unfinished">آخرین دریاÙت</translation>
- </message>
- <message>
- <source>Ping Time</source>
- <translation type="unfinished">مدت زمان پینگ</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">انتظار پینگ</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">حداقل پینگ</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">زمان آخرین بلوک</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished">&amp;بازکردن</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">&amp;کنسول</translation>
- </message>
- <message>
- <source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;شلوغی شبکه</translation>
- </message>
- <message>
- <source>Totals</source>
- <translation type="unfinished">جمع کل ها</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">Ùایل٠لاگ٠اشکال زدایی</translation>
- </message>
- <message>
- <source>Clear console</source>
- <translation type="unfinished">پاک کردن کنسول</translation>
- </message>
- <message>
- <source>In:</source>
- <translation type="unfinished">به یا داخل:</translation>
- </message>
- <message>
- <source>Out:</source>
- <translation type="unfinished">خارج شده:</translation>
- </message>
- <message>
- <source>Inbound: initiated by peer</source>
- <extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">ورودی: توسط همتا آغاز شد</translation>
- </message>
- <message>
- <source>Outbound Full Relay: default</source>
- <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">خروجی کامل رله : پیش Ùرض</translation>
- </message>
- <message>
- <source>Outbound Block Relay: does not relay transactions or addresses</source>
- <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">رله بلوک خروجی: تراکنش ها یا آدرس ها را انتقال نمی دهد</translation>
- </message>
- <message>
- <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
- <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">راهنمای خروجی: با استÙاده از گزینه های پیکربندی RPC %1 یا %2/%3 اضاÙÙ‡ شده است</translation>
- </message>
- <message>
- <source>Outbound Feeler: short-lived, for testing addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">حسگر خروجی: کوتاه مدت، برای آزمایش آدرس ها</translation>
- </message>
- <message>
- <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">واکشی آدرس خروجی: کوتاه مدت، برای درخواست آدرس</translation>
- </message>
- <message>
- <source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">ما همتا را برای رله با پهنای باند بالا انتخاب کردیم</translation>
- </message>
- <message>
- <source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">همتا ما را برای رله با پهنای باند بالا انتخاب کرد</translation>
- </message>
- <message>
- <source>no high bandwidth relay selected</source>
- <translation type="unfinished">رله با پهنای باند بالا انتخاب نشده است</translation>
- </message>
- <message>
- <source>Ctrl++</source>
- <extracomment>Main shortcut to increase the RPC console font size.</extracomment>
- <translation type="unfinished">Ctrl + +</translation>
- </message>
- <message>
- <source>Ctrl+=</source>
- <extracomment>Secondary shortcut to increase the RPC console font size.</extracomment>
- <translation type="unfinished">Ctrl + =</translation>
- </message>
- <message>
- <source>Ctrl+-</source>
- <extracomment>Main shortcut to decrease the RPC console font size.</extracomment>
- <translation type="unfinished">Ctrl + -</translation>
- </message>
- <message>
- <source>Ctrl+_</source>
- <extracomment>Secondary shortcut to decrease the RPC console font size.</extracomment>
- <translation type="unfinished">Ctrl + _</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <extracomment>Context menu action to copy the address of a peer.</extracomment>
- <translation type="unfinished">تکثیر نشانی</translation>
- </message>
- <message>
- <source>&amp;Disconnect</source>
- <translation type="unfinished">&amp;قطع شدن</translation>
- </message>
- <message>
- <source>1 &amp;hour</source>
- <translation type="unfinished">1 &amp;ساعت</translation>
- </message>
- <message>
- <source>1 d&amp;ay</source>
- <translation type="unfinished">1 روز</translation>
- </message>
- <message>
- <source>1 &amp;week</source>
- <translation type="unfinished">1 &amp;Ù‡Ùته</translation>
- </message>
- <message>
- <source>1 &amp;year</source>
- <translation type="unfinished">1 &amp;سال</translation>
- </message>
- <message>
- <source>&amp;Copy IP/Netmask</source>
- <extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
- <translation type="unfinished">&amp;کپی IP/Netmask</translation>
- </message>
- <message>
- <source>&amp;Unban</source>
- <translation type="unfinished">&amp;خارج کردن از بن</translation>
- </message>
- <message>
- <source>Network activity disabled</source>
- <translation type="unfinished">Ùعالیت شبکه غیر Ùعال شد</translation>
- </message>
- <message>
- <source>Executing command without any wallet</source>
- <translation type="unfinished">اجرای دستور بدون کی٠پول</translation>
- </message>
- <message>
- <source>Executing…</source>
- <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
- <translation type="unfinished">در حال اجرا...</translation>
- </message>
- <message>
- <source>(peer: %1)</source>
- <translation type="unfinished">(همتا: %1)</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation type="unfinished">بله</translation>
- </message>
- <message>
- <source>No</source>
- <translation type="unfinished">خیر</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">به</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">از</translation>
- </message>
- <message>
- <source>Ban for</source>
- <translation type="unfinished">بن یا بن شده برای</translation>
- </message>
- <message>
- <source>Never</source>
- <translation type="unfinished">هرگز</translation>
- </message>
- <message>
- <source>Unknown</source>
- <translation type="unfinished">ناشناس یا نامعلوم</translation>
- </message>
-</context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>&amp;Amount:</source>
- <translation type="unfinished">میزان وجه:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">برچسب:</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">پیام:</translation>
- </message>
- <message>
- <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">یک پیام اختیاری برای پیوست به درخواست پرداخت ، که با باز شدن درخواست نمایش داده می شود. توجه: پیام با پرداخت از طریق شبکه بیت کوین ارسال نمی شود.
- </translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address.</source>
- <translation type="unfinished">یک برچسب اختیاری برای ارتباط با آدرس دریاÙت کننده جدید.
- </translation>
- </message>
- <message>
- <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">برای درخواست پرداخت از این Ùرم استÙاده کنید. همه زمینه ها &lt;b&gt; اختیاری &lt;/b&gt;.
- </translation>
- </message>
- <message>
- <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
- <translation type="unfinished">مبلغ اختیاری برای درخواست این را خالی یا صÙر بگذارید تا مبلغ مشخصی درخواست نشود.
- </translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">یک برچسب اختیاری برای ارتباط با آدرس دریاÙت کننده جدید (استÙاده شده توسط شما برای شناسایی Ùاکتور). همچنین به درخواست پرداخت پیوست Ù…ÛŒ شود.
- </translation>
- </message>
- <message>
- <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
- <translation type="unfinished">پیام اختیاری Ú©Ù‡ به درخواست پرداخت پیوست شده Ùˆ ممکن است برای Ùرستنده نمایش داده شود.
- </translation>
- </message>
- <message>
- <source>&amp;Create new receiving address</source>
- <translation type="unfinished">&amp; ایجاد آدرس دریاÙت جدید
- </translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">پاک کردن تمامی گزینه های این Ùرم</translation>
- </message>
- <message>
- <source>Clear</source>
- <translation type="unfinished">پاک کردن</translation>
- </message>
- <message>
- <source>Requested payments history</source>
- <translation type="unfinished">تاریخچه پرداخت های درخواست شده</translation>
- </message>
- <message>
- <source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">نمایش درخواست انتخاب شده (همانند دوبار کلیک کردن بر روی ورودی)
- </translation>
- </message>
- <message>
- <source>Show</source>
- <translation type="unfinished">نمایش</translation>
- </message>
- <message>
- <source>Remove the selected entries from the list</source>
- <translation type="unfinished">حذ٠ورودی های انتخاب‌شده از لیست</translation>
- </message>
- <message>
- <source>Remove</source>
- <translation type="unfinished">حذÙ</translation>
- </message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">کپی کردن &amp;آدرس URL</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">تکثیر نشانی</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">تکثیر برچسب</translation>
- </message>
- <message>
- <source>Copy &amp;message</source>
- <translation type="unfinished">کپی &amp;پیام </translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">روگرÙت Ù…&amp;قدار</translation>
- </message>
- <message>
- <source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">به دلیل کارمزد زیاد Ùˆ محاÙظت کمتر در برابر خطای تایپی پیشنهاد نمی‌شود</translation>
- </message>
- <message>
- <source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">آدرس سازگار با Ú©ÛŒÙ‌پول‌های قدیمی‌تر تولید می‌کند</translation>
- </message>
- <message>
- <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">یک آدرس سگویت بومی (BIP-173) ایجاد کنید.
-برخی از کی٠پول های قدیمی از آن پشتیبانی نمی کنند.</translation>
- </message>
- <message>
- <source>Bech32m (Taproot)</source>
- <translation type="unfinished">Bech32m (تپ‌روت)</translation>
- </message>
- <message>
- <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m(BIP-350) یک آپدیت برای Bech32 است، پشتیبانی کی٠پول هنوز محدود شده است.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">نمیتوان کی٠پول را باز کرد.</translation>
- </message>
</context>
<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Request payment to …</source>
- <translation type="unfinished">درخواست پرداخت به </translation>
- </message>
- <message>
- <source>Address:</source>
- <translation type="unfinished">آدرس‌ها:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">میزان وجه:</translation>
- </message>
- <message>
- <source>Label:</source>
- <translation type="unfinished">برچسب:</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">پیام:</translation>
- </message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">کپی کردن &amp;آدرس URL</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">کپی آدرس</translation>
- </message>
- <message>
- <source>&amp;Verify</source>
- <translation type="unfinished">&amp;تایید کردن</translation>
- </message>
- <message>
- <source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">این آدرس را در صÙحه کی٠پول سخت اÙزاری تأیید کنید</translation>
- </message>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;ذخیره کردن تصویر...</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation type="unfinished">اطلاعات پرداخت</translation>
- </message>
- <message>
- <source>Request payment to %1</source>
- <translation type="unfinished">درخواست پرداخت به %1</translation>
- </message>
-</context>
-<context>
<name>RecentRequestsTableModel</name>
<message>
- <source>Message</source>
- <translation type="unfinished">پیام</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation type="unfinished">(بدون پیام)</translation>
+ <source>(no label)</source>
+ <translation type="unfinished">(برچسبی ندارد)</translation>
</message>
- <message>
- <source>(no amount requested)</source>
- <translation type="unfinished">(هیچ درخواست پرداخت وجود ندارد)</translation>
- </message>
- <message>
- <source>Requested</source>
- <translation type="unfinished">درخواست شده</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation type="unfinished">سکه های ارسالی</translation>
- </message>
- <message>
- <source>Coin Control Features</source>
- <translation type="unfinished">ویژگی های کنترل سکه
- </translation>
- </message>
- <message>
- <source>automatically selected</source>
- <translation type="unfinished">به صورت خودکار انتخاب شده</translation>
- </message>
- <message>
- <source>Insufficient funds!</source>
- <translation type="unfinished">وجوه ناکاÙÛŒ</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">مقدار</translation>
- </message>
- <message>
- <source>Bytes:</source>
- <translation type="unfinished">بایت ها:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">میزان وجه:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">هزینه</translation>
- </message>
- <message>
- <source>After Fee:</source>
- <translation type="unfinished">بعد از احتساب کارمزد</translation>
- </message>
- <message>
- <source>Change:</source>
- <translation type="unfinished">تغییر</translation>
- </message>
- <message>
- <source>Custom change address</source>
- <translation type="unfinished">تغییر آدرس مخصوص</translation>
- </message>
- <message>
- <source>Transaction Fee:</source>
- <translation type="unfinished">کارمزد تراکنش:</translation>
- </message>
- <message>
- <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">استÙاده از Fallbackfee Ù…ÛŒ تواند منجر به ارسال تراکنشی شود Ú©Ù‡ تأیید آن چندین ساعت یا روز (یا هرگز) طول Ù…ÛŒ کشد. هزینه خود را به صورت دستی انتخاب کنید یا صبر کنید تا زنجیره کامل را تأیید کنید.</translation>
- </message>
- <message>
- <source>Warning: Fee estimation is currently not possible.</source>
- <translation type="unfinished">هشدار:تخمین کارمزد در حال حاضر امکان پذیر نیست.</translation>
- </message>
- <message>
- <source>per kilobyte</source>
- <translation type="unfinished">به ازای هر کیلوبایت</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">پنهان کردن</translation>
- </message>
- <message>
- <source>Recommended:</source>
- <translation type="unfinished">پیشنهاد شده:</translation>
- </message>
- <message>
- <source>Custom:</source>
- <translation type="unfinished">سÙارشی:</translation>
- </message>
- <message>
- <source>Send to multiple recipients at once</source>
- <translation type="unfinished">ارسال همزمان به گیرنده های متعدد</translation>
- </message>
- <message>
- <source>Add &amp;Recipient</source>
- <translation type="unfinished">اضاÙÙ‡ کردن &amp;گیرنده</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">پاک کردن تمامی گزینه های این Ùرم</translation>
- </message>
- <message>
- <source>Inputs…</source>
- <translation type="unfinished">ورودی ها</translation>
- </message>
- <message>
- <source>Choose…</source>
- <translation type="unfinished">انتخاب کنید...</translation>
- </message>
- <message>
- <source>Hide transaction fee settings</source>
- <translation type="unfinished">تنظیمات مخÙÛŒ کردن کارمزد عملیات</translation>
- </message>
- <message>
- <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
-
-Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">مشخص کردن هزینه کارمزد مخصوص به ازای کیلوبایت(1,000 بایت) حجم مجازی تراکنش
-
-توجه: از آن جایی Ú©Ù‡ کارمزد بر اساس هر بایت محاسبه Ù…ÛŒ شود,هزینه کارمزد"100 ساتوشی بر کیلو بایت"برای تراکنش با حجم 500 بایت مجازی (نص٠1 کیلوبایت) کارمزد Ùقط اندازه 50 ساتوشی خواهد بود.</translation>
- </message>
- <message>
- <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">(مقداردهی کارمزد هوشمند هنوز شروع نشده است.این کارمزد معمولا به اندازه چند بلاک طول میکشد...)</translation>
- </message>
- <message>
- <source>Confirmation time target:</source>
- <translation type="unfinished">هد٠زمانی تایید شدن:</translation>
- </message>
- <message>
- <source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Ùعال کردن جایگذاری دوباره از کارمزد</translation>
- </message>
- <message>
- <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">با Replace-By-Fee (BIP-125) Ù…ÛŒ توانید هزینه معامله را پس از ارسال آن اÙزایش دهید. بدون این ØŒ ممکن است هزینه بیشتری برای جبران اÙزایش خطر تاخیر در معامله پیشنهاد شود.
- </translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">پاک کردن همه</translation>
- </message>
- <message>
- <source>Balance:</source>
- <translation type="unfinished">مانده حساب:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation type="unfinished">تایید عملیات ارسال</translation>
- </message>
- <message>
- <source>S&amp;end</source>
- <translation type="unfinished">و ارسال</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">کپی مقدار</translation>
</message>
<message>
- <source>Copy fee</source>
- <translation type="unfinished">کپی هزینه</translation>
- </message>
- <message>
<source>Copy after fee</source>
<translation type="unfinished">کپی کردن بعد از احتساب کارمزد</translation>
</message>
<message>
- <source>Copy bytes</source>
- <translation type="unfinished">کپی کردن بایت ها</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">کپی کردن تغییر</translation>
</message>
<message>
- <source>%1 (%2 blocks)</source>
- <translation type="unfinished">%1(%2 بلاک ها)</translation>
- </message>
- <message>
- <source>Sign on device</source>
- <extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">امضا کردن در دستگاه</translation>
- </message>
- <message>
- <source>Connect your hardware wallet first.</source>
- <translation type="unfinished">اول کی٠سخت اÙزاری خود را متصل کنید.</translation>
- </message>
- <message>
- <source>Set external signer script path in Options -&gt; Wallet</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">مسیر اسکریپت امضاکننده خارجی را در Options -&gt; Wallet تنظیم کنید</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation type="unfinished">%1 به %2</translation>
- </message>
- <message>
- <source>To review recipient list click "Show Details…"</source>
- <translation type="unfinished">برای بررسی لیست گیرندگان، روی «نمایش جزئیات…» کلیک کنید.</translation>
- </message>
- <message>
- <source>Sign failed</source>
- <translation type="unfinished">امضا موÙÙ‚ نبود</translation>
- </message>
- <message>
- <source>External signer not found</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">امضا کننده خارجی یاÙت نشد</translation>
- </message>
- <message>
- <source>External signer failure</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">امضا کننده خارجی شکست خورد.</translation>
- </message>
- <message>
- <source>Save Transaction Data</source>
- <translation type="unfinished">ذخیره اطلاعات عملیات</translation>
- </message>
- <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">تراکنش نسبتا امضا شده (باینری)</translation>
</message>
<message>
- <source>External balance:</source>
- <translation type="unfinished">تعادل خارجی </translation>
- </message>
- <message>
<source>or</source>
<translation type="unfinished">یا</translation>
</message>
- <message>
- <source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">تو میتوانی بعدا هزینه کارمزد را اÙزایش بدی(signals Replace-By-Fee, BIP-125)</translation>
- </message>
- <message>
- <source>Do you want to create this transaction?</source>
- <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
- <translation type="unfinished">آیا می خواهید این تراکنش را ایجاد کنید؟</translation>
- </message>
- <message>
- <source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">لطÙا معامله خود را بررسی کنید Ù…ÛŒ توانید این تراکنش را ایجاد Ùˆ ارسال کنید یا یک تراکنش بیت کوین با امضای جزئی (PSBT) ایجاد کنید، Ú©Ù‡ Ù…ÛŒ توانید آن را ذخیره یا Ú©Ù¾ÛŒ کنید Ùˆ سپس با آن امضا کنید، به عنوان مثال، یک کی٠پول Ø¢Ùلاین %1ØŒ یا یک کی٠پول سخت اÙزاری سازگار با PSBT.</translation>
- </message>
- <message>
- <source>Please, review your transaction.</source>
- <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">لطÙا,تراکنش خود را بازبینی کنید.</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">کارمزد تراکنش</translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">میزان کل</translation>
- </message>
- <message>
- <source>Unsigned Transaction</source>
- <comment>PSBT copied</comment>
- <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">تراکنش امضا نشده</translation>
- </message>
- <message>
- <source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">تراکنش بیت کوین با امضای جزئی (PSBT) در کلیپ بورد کپی شده است. همچنین شما می‌توانید آن را ذخیره کنید.</translation>
- </message>
- <message>
- <source>PSBT saved to disk</source>
- <translation type="unfinished">Ùایل PSBT در دیسک ذخیره شد</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation type="unfinished">تایید کردن ارسال کوین ها</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">آدرس گیرنده نامعتبر است.لطÙا دوباره Ú†Ú© یا بررسی کنید.</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">مبلغ پرداختی باید بیشتر از 0 باشد.
- </translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation type="unfinished">این میزان پول بیشتر از موجودی شما است.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">این میزان بیشتر از موجودی شما است وقتی که کارمزد تراکنش %1 باشد.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">آدرس تکراری یاÙت شد:آدرس ها باید Ùقط یک بار استÙاده شوند.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation type="unfinished">ایجاد تراکنش با خطا مواجه شد!</translation>
- </message>
- <message>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">کارمزد بیشتر از %1 است,این یعنی کارمزد خیلی زیادی در نظر گرÙته شده است.</translation>
- </message>
- <message>
- <source>%1/kvB</source>
- <translation type="unfinished">%1 kvB</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -2706,280 +1262,12 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</translation>
</message>
<message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">هشدار: آدرس بیت کوین نامعتبر</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation type="unfinished">هشدار:تغییر آدرس نامعلوم</translation>
- </message>
- <message>
- <source>Confirm custom change address</source>
- <translation type="unfinished">تایید کردن تغییر آدرس سÙارشی</translation>
- </message>
- <message>
- <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
- <translation type="unfinished">این آدرس که شما انتخاب کرده اید بخشی از کی٠پول شما نیست.هر یا همه دارایی های شما در این کی٠پول به این آدرس ارسال خواهد شد.آیا مطمئن هستید؟</translation>
- </message>
- </context>
-<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>A&amp;mount:</source>
- <translation type="unfinished">میزان وجه</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">پرداخت به:
- </translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">برچسب:</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">آدرس استÙاده شده قبلی را انتخاب کنید</translation>
- </message>
- <message>
- <source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">آدرس Bitcoin برای ارسال پرداخت به
- </translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">استÙاده از آدرس کلیپ بورد</translation>
- </message>
- <message>
- <source>Remove this entry</source>
- <translation type="unfinished">پاک کردن این ورودی</translation>
- </message>
- <message>
- <source>Use available balance</source>
- <translation type="unfinished">استÙاده از موجودی حساب</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">پیام:</translation>
- </message>
- </context>
-<context>
- <name>SendConfirmationDialog</name>
- <message>
- <source>Send</source>
- <translation type="unfinished">ارسال</translation>
- </message>
- </context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">امضا - امضاء کردن / تأیید کنید یک پیام</translation>
- </message>
- <message>
- <source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;ثبت پیام</translation>
- </message>
- <message>
- <source>The Bitcoin address to sign the message with</source>
- <translation type="unfinished">نشانی بیت‌کوین برای امضاء پیغام با آن</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">آدرس استÙاده شده قبلی را انتخاب کنید</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">استÙاده از آدرس کلیپ بورد</translation>
- </message>
- <message>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished">پیامی که می خواهید امضا کنید را اینجا وارد کنید</translation>
- </message>
- <message>
- <source>Signature</source>
- <translation type="unfinished">امضا</translation>
- </message>
- <message>
- <source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">جریان را کپی کنید امضا به سیستم کلیپ بورد</translation>
- </message>
- <message>
- <source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">پیام را امضا کنید تا ثابت کنید این آدرس بیت‌کوین متعلق به شماست</translation>
- </message>
- <message>
- <source>Sign &amp;Message</source>
- <translation type="unfinished">ثبت &amp;پیام</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">تنظیم مجدد همه امضاء کردن زمینه های پیام</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">پاک کردن همه</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">&amp; تأیید پیام</translation>
- </message>
- <message>
- <source>The Bitcoin address the message was signed with</source>
- <translation type="unfinished">نشانی بیت‌کوین که پیغام با آن امضاء شده</translation>
- </message>
- <message>
- <source>The signed message to verify</source>
- <translation type="unfinished">پیام امضا شده برای تأیید
- </translation>
- </message>
- <message>
- <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">پیام را تأیید کنید تا مطمئن شوید با آدرس Bitcoin مشخص شده امضا شده است
- </translation>
- </message>
- <message>
- <source>Verify &amp;Message</source>
- <translation type="unfinished">تایید پیام</translation>
- </message>
- <message>
- <source>Reset all verify message fields</source>
- <translation type="unfinished">بازنشانی تمام Ùیلدهای پیام</translation>
- </message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">برای تولید امضا "Sign Message" و یا "ثبت پیام" را کلیک کنید</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation type="unfinished">آدرس وارد شده نامعتبر است.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation type="unfinished">لطÙا ادرس را بررسی کرده Ùˆ دوباره امتحان کنید.
- </translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">نشانی وارد شده به هیچ کلیدی اشاره نمی‌کند.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation type="unfinished">باز کردن Ù‚ÙÙ„ کی٠پول لغو شد.
- </translation>
- </message>
- <message>
- <source>No error</source>
- <translation type="unfinished">بدون خطا</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation type="unfinished">کلید خصوصی برای نشانی وارد شده در دسترس نیست.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation type="unfinished">امضای پیام با شکست مواجه شد.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation type="unfinished">پیام ثبت شده</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation type="unfinished">امضا نمی‌تواند کدگشایی شود.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">لطÙاً امضا را بررسی نموده Ùˆ دوباره تلاش کنید.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation type="unfinished">امضا با خلاصه پیام مطابقت نداشت.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation type="unfinished">تأیید پیام انجام نشد.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">پیام شما تایید شد</translation>
- </message>
-</context>
-<context>
- <name>SplashScreen</name>
- <message>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(q را Ùشار دهید تا خاموش شود Ùˆ بعدا ادامه دهید)</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">q را Ùشار دهید تا خاموش شود</translation>
- </message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
- <message>
- <source>kB/s</source>
- <translation type="unfinished">کیلوبایت بر ثانیه</translation>
+ <source>(no label)</source>
+ <translation type="unfinished">(برچسبی ندارد)</translation>
</message>
</context>
<context>
<name>TransactionDesc</name>
- <message>
- <source>abandoned</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
- <translation type="unfinished">رها شده</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
- <translation type="unfinished">%1/تأیید نشده</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
- <translation type="unfinished">%1 تأییدیه</translation>
- </message>
- <message>
- <source>Status</source>
- <translation type="unfinished">وضعیت</translation>
- </message>
- <message>
- <source>Source</source>
- <translation type="unfinished">منبع</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation type="unfinished">تولید شده</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">از</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">ناشناس</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">به</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">آدرس خود</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">Ùقط-با قابلیت دیدن</translation>
- </message>
- <message>
- <source>label</source>
- <translation type="unfinished">برچسب</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation type="unfinished">اعتبار</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2987,82 +1275,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</translation>
</message>
<message>
- <source>not accepted</source>
- <translation type="unfinished">قبول نشده</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation type="unfinished">اعتبار</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation type="unfinished">تمامی اعتبار</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">کارمزد تراکنش</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation type="unfinished">میزان وجه دقیق</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">پیام</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">کامنت</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation type="unfinished">شناسه تراکنش</translation>
- </message>
- <message>
- <source>Transaction total size</source>
- <translation type="unfinished">حجم کل تراکنش</translation>
- </message>
- <message>
- <source>Transaction virtual size</source>
- <translation type="unfinished">اندازه مجازی تراکنش</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation type="unfinished">بازرگان</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation type="unfinished">اطلاعات اشکال زدایی
-  </translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation type="unfinished">تراکنش</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation type="unfinished">ورودی ها</translation>
- </message>
- <message>
- <source>true</source>
- <translation type="unfinished">درست</translation>
- </message>
- <message>
- <source>false</source>
- <translation type="unfinished">نادرست</translation>
- </message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
- <message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">این بخش جزئیات تراکنش را نشان می دهد</translation>
- </message>
- <message>
- <source>Details for %1</source>
- <translation type="unfinished">جزییات %1</translation>
+ <source>Amount</source>
+ <translation type="unfinished">میزان وجه:</translation>
</message>
-</context>
+ </context>
<context>
<name>TransactionTableModel</name>
<message>
@@ -3070,186 +1286,17 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">نوع</translation>
</message>
<message>
- <source>Unconfirmed</source>
- <translation type="unfinished">تایید نشده</translation>
- </message>
- <message>
- <source>Abandoned</source>
- <translation type="unfinished">رهاشده</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">تأیید شده (%1 تأییدیه)</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation type="unfinished">تولید شده ولی هنوز قبول نشده است</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">گرÙته شده با</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation type="unfinished">دریاÙت شده از</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">ارسال شده به</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">استخراج شده</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">Ùقط-با قابلیت دیدن</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation type="unfinished">(موجود نیست)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">وضعیت تراکنش. نشانگر را روی این Ùیلد Ù†Ú¯Ù‡ دارید تا تعداد تأییدیه‌ها نشان داده شود.</translation>
+ <source>(no label)</source>
+ <translation type="unfinished">(برچسبی ندارد)</translation>
</message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation type="unfinished">تاریخ Ùˆ زمان تراکنش دریاÙت شده است</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation type="unfinished">نوع تراکنش.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation type="unfinished">میزان وجه Ú©Ù… شده یا اضاÙÙ‡ شده به حساب</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionView</name>
<message>
- <source>All</source>
- <translation type="unfinished">همه</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">امروز</translation>
- </message>
- <message>
- <source>This week</source>
- <translation type="unfinished">این Ù‡Ùته</translation>
- </message>
- <message>
- <source>This month</source>
- <translation type="unfinished">این ماه</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation type="unfinished">ماه گذشته</translation>
- </message>
- <message>
- <source>This year</source>
- <translation type="unfinished">امسال</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">گرÙته شده با</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">ارسال شده به</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">استخراج شده</translation>
- </message>
- <message>
- <source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">وارد کردن آدرس,شناسه تراکنش, یا برچسب برای جست و جو</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation type="unfinished">حداقل میزان وجه</translation>
- </message>
- <message>
- <source>Range…</source>
- <translation type="unfinished">بازه:</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">تکثیر نشانی</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">تکثیر برچسب</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">روگرÙت Ù…&amp;قدار</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID</source>
- <translation type="unfinished">کپی شناسه تراکنش </translation>
- </message>
- <message>
- <source>Copy &amp;raw transaction</source>
- <translation type="unfinished">معامله اولیه را کپی نمائید.</translation>
- </message>
- <message>
- <source>Copy full transaction &amp;details</source>
- <translation type="unfinished">کپی کردن تمامی اطلاعات تراکنش</translation>
- </message>
- <message>
- <source>&amp;Show transaction details</source>
- <translation type="unfinished">نمایش جزئیات تراکنش</translation>
- </message>
- <message>
- <source>Increase transaction &amp;fee</source>
- <translation type="unfinished">اÙزایش کارمزد تراکنش</translation>
- </message>
- <message>
- <source>A&amp;bandon transaction</source>
- <translation type="unfinished">ترک معامله</translation>
- </message>
- <message>
- <source>&amp;Edit address label</source>
- <translation type="unfinished">&amp;ویرایش برچسب آدرس</translation>
- </message>
- <message>
- <source>Show in %1</source>
- <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
- <translation type="unfinished">نمایش در %1</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation type="unfinished">خارج کردن یا بالا بردن سابقه تراکنش ها</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation type="unfinished">Ùقط برای تماشا</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">نوع</translation>
</message>
- <message>
- <source>ID</source>
- <translation type="unfinished">شناسه</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation type="unfinished">خارج کردن موÙقیت آمیز بود Exporting</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation type="unfinished">دامنه:</translation>
- </message>
- <message>
- <source>to</source>
- <translation type="unfinished">به</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletFrame</name>
<message>
@@ -3263,82 +1310,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">سکه های ارسالی</translation>
- </message>
- <message>
- <source>Increasing transaction fee failed</source>
- <translation type="unfinished">اÙزایش کارمزد تراکنش با خطا مواجه شد</translation>
- </message>
- <message>
- <source>Do you want to increase the fee?</source>
- <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
- <translation type="unfinished">آیا میخواهید اندازه کارمزد را اÙزایش دهید؟</translation>
- </message>
- <message>
- <source>Current fee:</source>
- <translation type="unfinished">کارمزد الان:</translation>
- </message>
- <message>
- <source>Increase:</source>
- <translation type="unfinished">اÙزایش دادن:</translation>
- </message>
- <message>
- <source>New fee:</source>
- <translation type="unfinished">کارمزد جدید:</translation>
- </message>
- <message>
- <source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <translation type="unfinished">هشدار: ممکن است در صورت لزوم، با کاهش خروجی تغییر یا اÙزودن ورودی‌ها، هزینه اضاÙÛŒ را پرداخت کنید. اگر از قبل وجود نداشته باشد، ممکن است یک خروجی تغییر جدید اضاÙÙ‡ کند. این تغییرات ممکن است به طور بالقوه حریم خصوصی را درز کند.</translation>
- </message>
- <message>
- <source>PSBT copied</source>
- <translation type="unfinished">PSBT کپی شد</translation>
- </message>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">در کلیپ‌بورد ذخیره شد</translation>
- </message>
- <message>
- <source>Can't sign transaction.</source>
- <translation type="unfinished">نمیتوان تراکنش را ثبت کرد</translation>
- </message>
- <message>
- <source>Can't display address</source>
- <translation type="unfinished">نمی توان آدرس را نشان داد</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">کی٠پول پیش Ùرض
- </translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
- <source>Backup Wallet</source>
- <translation type="unfinished">کی٠پول پشتیبان
- </translation>
- </message>
- <message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
<translation type="unfinished">داده های کی٠پول</translation>
</message>
<message>
- <source>Backup Failed</source>
- <translation type="unfinished">پشتیبان گیری انجام نشد
- </translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation type="unfinished">پشتیبان گیری موÙقیت آمیز است
- </translation>
- </message>
- <message>
<source>Cancel</source>
<translation type="unfinished">لغو</translation>
</message>
@@ -3346,450 +1324,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<context>
<name>bitcoin-core</name>
<message>
- <source>The %s developers</source>
- <translation type="unfinished">%s توسعه دهندگان</translation>
- </message>
- <message>
- <source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%sدرخواست گوش دادن به پورت %u. این پورت به عنوان پورت "بد" در نظر گرÙته شده بنابراین بعید است Ú©Ù‡ یک همتا به آن متصل شود. برای مشاهده جزییات Ùˆ دیدن Ùهرست کامل Ùایل doc/p2p-bad-ports.md را مشاهده کنید.</translation>
- </message>
- <message>
- <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">نمی توان کی٠پول را از نسخه %i به نسخه %i کاهش داد. نسخه کی٠پول بدون تغییر</translation>
- </message>
- <message>
- <source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
- <translation type="unfinished">نمی توان یک کی٠پول تقسیم غیر HD را از نسخه %i به نسخه %i بدون ارتقا برای پشتیبانی از دسته کلید از پیش تقسیم ارتقا داد. لطÙا از نسخه %i یا بدون نسخه مشخص شده استÙاده کنید.</translation>
- </message>
- <message>
- <source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">Ùضای دیسک برای %s ممکن است Ùایل های بلوک را در خود جای ندهد. تقریبا %u گیگابایت داده در این Ùهرست ذخیره خواهد شد</translation>
- </message>
- <message>
- <source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">خطا در بارگیری کی٠پول. کی٠پول برای بارگیری به بلوک‌ها نیاز دارد، Ùˆ نرم‌اÙزار در حال حاضر از بارگیری کی٠پول‌ها پشتیبانی نمی‌کند، استÙاده از تصاویر گره ( نود ) های کامل جدیدی Ú©Ù‡ تأیید های قدیمی را به تعویق Ù…ÛŒ اندازند، باعث می‌شود بلوک ها بدون نظم دانلود شود. بارگیری کامل اطلاعات کی٠پول Ùقط پس از اینکه همگام‌سازی گره به ارتÙاع %s رسید، امکان پذیر است.</translation>
- </message>
- <message>
- <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">خطا در خواندن %s! داده‌های تراکنش ممکن است گم یا نادرست باشد. در حال اسکن مجدد کی٠پول</translation>
- </message>
- <message>
- <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
- <translation type="unfinished">خطا: رکورد قالب Dumpfile نادرست است. دریاÙت شده، "%s" "مورد انتظار".</translation>
- </message>
- <message>
- <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">خطا: رکورد شناسه Dumpfile نادرست است. دریاÙت "%s"ØŒ انتظار Ù…ÛŒ رود "%s".</translation>
- </message>
- <message>
- <source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">خطا: نسخه Dumpfile پشتیبانی نمی شود. این نسخه کی٠پول بیت کوین Ùقط از Ùایل های dumpfiles نسخه 1 پشتیبانی Ù…ÛŒ کند. Dumpfile با نسخه %s دریاÙت شد</translation>
- </message>
- <message>
- <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
- <translation type="unfinished">خطا: کی٠پول های قدیمی Ùقط از انواع آدرس "legacy"ØŒ "p2sh-segwit" Ùˆ "bech32" پشتیبانی Ù…ÛŒ کنند.</translation>
- </message>
- <message>
- <source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">خطا: امکان تولید جزئیات برای این کی٠پول نوع legacy وجود ندارد. در صورتی که کی٠پول رمزگذاری شده است، مطمئن شوید که عبارت عبور آن را درست وارد کرده‌اید.</translation>
- </message>
- <message>
- <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
- <translation type="unfinished">Ùایل %s از قبل موجود میباشد. اگر مطمئن هستید Ú©Ù‡ این همان چیزی است Ú©Ù‡ Ù…ÛŒ خواهید، ابتدا آن را از مسیر خارج کنید.</translation>
- </message>
- <message>
- <source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
- <translation type="unfinished">peers.dat نامعتبر یا Ùاسد (%s). اگر Ùکر Ù…ÛŒ کنید این یک اشکال است، لطÙاً آن را به %s گزارش دهید. به عنوان یک راه حل، Ù…ÛŒ توانید Ùایل (%s) را از مسیر خود خارج کنید (تغییر نام، انتقال یا حذ٠کنید) تا در شروع بعدی یک Ùایل جدید ایجاد شود.</translation>
- </message>
- <message>
- <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">هیچ Ùایل دامپی ارائه نشده است. برای استÙاده از createfromdumpØŒ باید -dumpfile=&lt;filename&gt; ارائه شود.</translation>
- </message>
- <message>
- <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">هیچ Ùایل دامپی ارائه نشده است. برای استÙاده از dumpØŒ -dumpfile=&lt;filename&gt; باید ارائه شود.</translation>
- </message>
- <message>
- <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">هیچ Ùرمت Ùایل کی٠پول ارائه نشده است. برای استÙاده از createfromdump باید -format=&lt;format&gt; ارائه شود.</translation>
- </message>
- <message>
- <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
- <translation type="unfinished">هرس: آخرین هماهنگی کی٠پول Ùراتر از داده های هرس شده است. شما باید دوباره -exe کنید (در صورت گره هرس شده دوباره Ú©Ù„ بلاکچین را بارگیری کنید)
- </translation>
- </message>
- <message>
- <source>The transaction amount is too small to send after the fee has been deducted</source>
- <translation type="unfinished">مبلغ معامله برای ارسال پس از کسر هزینه بسیار ناچیز است
- </translation>
- </message>
- <message>
- <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <translation type="unfinished">این یک نسخه ÛŒ آزمایشی است - با مسئولیت خودتان از آن استÙاده کنید - آن را در معدن Ùˆ بازرگانی بکار نگیرید.</translation>
- </message>
- <message>
- <source>This is the transaction fee you may pay when fee estimates are not available.</source>
- <translation type="unfinished">این است هزینه معامله ممکن است پرداخت چه زمانی هزینه تخمین در دسترس نیست</translation>
- </message>
- <message>
- <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">Ùرمت Ùایل کی٠پول ناشناخته "%s" ارائه شده است. لطÙا یکی از "bdb" یا "sqlite" را ارائه دهید.</translation>
- </message>
- <message>
- <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
- <translation type="unfinished">هشدار: قالب کی٠پول Dumpfile "%s" با Ùرمت مشخص شده خط Ùرمان %s مطابقت ندارد.</translation>
- </message>
- <message>
- <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <translation type="unfinished">هشدار: کلید های خصوصی در کی٠پول شما شناسایی شده است { %s} به همراه کلید های خصوصی غیر Ùعال</translation>
- </message>
- <message>
- <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation type="unfinished">هشدار: به نظر نمی رسد ما کاملاً با همسالان خود مواÙÙ‚ هستیم! ممکن است به ارتقا نیاز داشته باشید یا گره های دیگر به ارتقا نیاز دارند.
- </translation>
- </message>
- <message>
- <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">داده‌های شاهد برای بلوک‌ها پس از ارتÙاع %d نیاز به اعتبارسنجی دارند. لطÙا با -reindex دوباره راه اندازی کنید.</translation>
- </message>
- <message>
- <source>%s is set very high!</source>
- <translation type="unfinished">%s بسیار بزرگ انتخاب شده است.</translation>
- </message>
- <message>
- <source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">نمی توان آدرس -%s را حل کرد: '%s'</translation>
- </message>
- <message>
- <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">هنگام تنظیم -dnsseed روی نادرست نمی توان -forcednsseed را روی درست تنظیم کرد.</translation>
- </message>
- <message>
<source>Cannot write to data directory '%s'; check permissions.</source>
<translation type="unfinished">نمیتواند پوشه داده ها را بنویسد ' %s';دسترسی ها را بررسی کنید.</translation>
</message>
- <message>
- <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">اتصالات خروجی محدود به CJDNS محدود شده است ( onlynet=cjdns- ) اما cjdnsreachable- ارائه نشده است</translation>
- </message>
- <message>
- <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">اتصالات خروجی محدود به i2p است (onlynet=i2p-) اما i2psam- ارائه نشده است</translation>
- </message>
- <message>
- <source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">اندازه ورودی از حداکثر مقدار موجودی بیشتر است. لطÙاً مقدار کمتری ارسال کنید یا به صورت دستی مقدار موجودی خرج نشده کی٠پول خود را در ارسال تراکنش اعمال کنید. </translation>
- </message>
- <message>
- <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">مقدار Ú©Ù„ بیتکوینی Ú©Ù‡ از پیش انتخاب کردید کمتر از مبلغ مورد نظر برای انجام تراکنش است . لطÙاً اجازه دهید ورودی های دیگر به طور خودکار انتخاب شوند یا مقدار بیتکوین های بیشتری را به صورت دستی اضاÙÙ‡ کنید</translation>
- </message>
- <message>
- <source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
-
-The wallet might have been tampered with or created with malicious intent.
-</source>
- <translation type="unfinished">ورودی خارج از دستور از نوع legacy در کی٠پول مورد نظر پیدا شد. در حال بارگیری کی٠پول %s
-کی٠پول ممکن است دستکاری شده یا با اهدا٠مخرب ایجاد شده باشد.
-</translation>
- </message>
- <message>
- <source>Block verification was interrupted</source>
- <translation type="unfinished">تايید بلوک دچار قطعی شد</translation>
- </message>
- <message>
- <source>Copyright (C) %i-%i</source>
- <translation type="unfinished">کپی رایت (C) %i-%i</translation>
- </message>
- <message>
- <source>Corrupted block database detected</source>
- <translation type="unfinished">یک پایگاه داده ÛŒ بلوک خراب یاÙت شد</translation>
- </message>
- <message>
- <source>Do you want to rebuild the block database now?</source>
- <translation type="unfinished">آیا میخواهید الان پایگاه داده بلاک را بازسازی کنید؟</translation>
- </message>
- <message>
- <source>Done loading</source>
- <translation type="unfinished">اتمام لود شدن</translation>
- </message>
- <message>
- <source>Dump file %s does not exist.</source>
- <translation type="unfinished">Ùایل زبالهٔ %s وجود ندارد.</translation>
- </message>
- <message>
- <source>Error creating %s</source>
- <translation type="unfinished">خطا در ایجاد %s</translation>
- </message>
- <message>
- <source>Error initializing block database</source>
- <translation type="unfinished">خطا در آماده سازی پایگاه داده ی بلوک</translation>
- </message>
- <message>
- <source>Error loading %s</source>
- <translation type="unfinished">خطا بازگذاری %s</translation>
- </message>
- <message>
- <source>Error loading block database</source>
- <translation type="unfinished">خطا در بارگذاری پایگاه داده بلاک block</translation>
- </message>
- <message>
- <source>Error opening block database</source>
- <translation type="unfinished">خطا در بازکردن پایگاه داده بلاک block</translation>
- </message>
- <message>
- <source>Error reading configuration file: %s</source>
- <translation type="unfinished">خطا در خواندن Ùایل تنظیمات: %s</translation>
- </message>
- <message>
- <source>Error reading from database, shutting down.</source>
- <translation type="unfinished">خواندن از پایگاه داده با خطا مواجه شد,در حال خاموش شدن.</translation>
- </message>
- <message>
- <source>Error reading next record from wallet database</source>
- <translation type="unfinished">خطا در خواندن رکورد بعدی از پایگاه داده کی٠پول</translation>
- </message>
- <message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">خطا: نمی توان مقصد را از scriptpubkey تولید شده استخراج کرد</translation>
- </message>
- <message>
- <source>Error: Couldn't create cursor into database</source>
- <translation type="unfinished">خطا: مکان نما در پایگاه داده ایجاد نشد</translation>
- </message>
- <message>
- <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">خطا: جمع چکی Dumpfile مطابقت ندارد. محاسبه شده %s، مورد انتظار %s.</translation>
- </message>
- <message>
- <source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">خطا: کلیدی دریاÙت کردم Ú©Ù‡ هگز نبود: %s</translation>
- </message>
- <message>
- <source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">خطا: مقداری دریاÙت کردم Ú©Ù‡ هگز نبود: %s</translation>
- </message>
- <message>
- <source>Error: Missing checksum</source>
- <translation type="unfinished">خطا: جمع چک وجود ندارد</translation>
- </message>
- <message>
- <source>Error: No %s addresses available.</source>
- <translation type="unfinished">خطا : هیچ آدرس %s وجود ندارد.</translation>
- </message>
- <message>
- <source>Error: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">خطا: تجزیه نسخه %u به عنوان uint32_t ممکن نیست</translation>
- </message>
- <message>
- <source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">خطا: نوشتن رکورد در کی٠پول جدید امکان پذیر نیست</translation>
- </message>
- <message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">شنیدن هر گونه درگاه انجام پذیر نیست. ازlisten=0 برای اینکار استÙاده کیند.</translation>
- </message>
- <message>
- <source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">در هنگام مقداردهی اولیه ، مجدداً اسکن کی٠پول انجام نشد
- </translation>
- </message>
- <message>
- <source>Importing…</source>
- <translation type="unfinished">در حال واردات…</translation>
- </message>
- <message>
- <source>Input not found or already spent</source>
- <translation type="unfinished">ورودی پیدا نشد یا قبلاً خرج شده است</translation>
- </message>
- <message>
- <source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">dbcache ( حاÙظه موقت دیتابیس ) کاÙÛŒ برای تأیید بلوک وجود ندارد</translation>
- </message>
- <message>
- <source>Insufficient funds</source>
- <translation type="unfinished">وجوه ناکاÙÛŒ</translation>
- </message>
- <message>
- <source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">آدرس -i2psam یا نام میزبان نامعتبر است: '%s'</translation>
- </message>
- <message>
- <source>Invalid -proxy address or hostname: '%s'</source>
- <translation type="unfinished">آدرس پراکسی یا هاست نامعتبر: ' %s'</translation>
- </message>
- <message>
- <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">میزان نامعتبر برای -%s=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">پورت نامعتبری در %s انتخاب شده است : «%s»</translation>
- </message>
- <message>
- <source>Invalid pre-selected input %s</source>
- <translation type="unfinished">ورودی از پیش انتخاب شده %s نامعتبر است </translation>
- </message>
- <message>
- <source>Loading P2P addresses…</source>
- <translation type="unfinished">در حال بارگیری آدرس‌های P2P…</translation>
- </message>
- <message>
- <source>Loading banlist…</source>
- <translation type="unfinished">در حال بارگیری Ùهرست ممنوعه…</translation>
- </message>
- <message>
- <source>Loading block index…</source>
- <translation type="unfinished">در حال بارگیری Ùهرست بلوک…</translation>
- </message>
- <message>
- <source>Loading wallet…</source>
- <translation type="unfinished">در حال بارگیری کی٠پول…</translation>
- </message>
- <message>
- <source>Missing amount</source>
- <translation type="unfinished">مقدار گم شده</translation>
- </message>
- <message>
- <source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">داده های حل برای تخمین اندازه تراکنش وجود ندارد</translation>
- </message>
- <message>
- <source>No addresses available</source>
- <translation type="unfinished">هیچ آدرسی در دسترس نیست</translation>
- </message>
- <message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">توصیÙگرهای Ùایل به اندازه کاÙÛŒ در دسترس نیست</translation>
- </message>
- <message>
- <source>Not found pre-selected input %s</source>
- <translation type="unfinished">ورودی از پیش انتخاب شده %s پیدا نشد </translation>
- </message>
- <message>
- <source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">ورودی از پیش انتخاب شده %s قابل محاسبه نیست </translation>
- </message>
- <message>
- <source>Pruning blockstore…</source>
- <translation type="unfinished">هرس بلوک Ùروشی…</translation>
- </message>
- <message>
- <source>Replaying blocks…</source>
- <translation type="unfinished">در حال پخش مجدد بلوک ها…</translation>
- </message>
- <message>
- <source>Rescanning…</source>
- <translation type="unfinished">در حال اسکن مجدد…</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">ثبت تراکنش با خطا مواجه شد</translation>
- </message>
- <message>
- <source>Starting network threads…</source>
- <translation type="unfinished">شروع رشته های شبکه…</translation>
- </message>
- <message>
- <source>The source code is available from %s.</source>
- <translation type="unfinished">سورس کد موجود است از %s.</translation>
- </message>
- <message>
- <source>The specified config file %s does not exist</source>
- <translation type="unfinished">Ùایل پیکربندی مشخص شده %s وجود ندارد</translation>
- </message>
- <message>
- <source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">مبلغ معامله برای پرداخت هزینه بسیار ناچیز است
- </translation>
- </message>
- <message>
- <source>The wallet will avoid paying less than the minimum relay fee.</source>
- <translation type="unfinished">کی٠پول از پرداخت کمتر از حداقل هزینه رله جلوگیری خواهد کرد.
- </translation>
- </message>
- <message>
- <source>This is experimental software.</source>
- <translation type="unfinished">این یک نرم اÙزار تجربی است.</translation>
- </message>
- <message>
- <source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">این حداقل هزینه معامله ای است که شما در هر معامله پرداخت می کنید.
- </translation>
- </message>
- <message>
- <source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">این هزینه تراکنش است که در صورت ارسال معامله پرداخت خواهید کرد.
- </translation>
- </message>
- <message>
- <source>Transaction amount too small</source>
- <translation type="unfinished">حجم تراکنش خیلی کم است</translation>
- </message>
- <message>
- <source>Transaction amounts must not be negative</source>
- <translation type="unfinished">مقدار تراکنش نمی‌تواند منÙÛŒ باشد.</translation>
- </message>
- <message>
- <source>Transaction must have at least one recipient</source>
- <translation type="unfinished">تراکنش باید حداقل یک دریاÙت کننده داشته باشد</translation>
- </message>
- <message>
- <source>Transaction needs a change address, but we can't generate it.</source>
- <translation type="unfinished">تراکنش به آدرس تغییر نیاز دارد، اما ما نمی‌توانیم آن را ایجاد کنیم.</translation>
- </message>
- <message>
- <source>Transaction too large</source>
- <translation type="unfinished">حجم تراکنش خیلی زیاد است</translation>
- </message>
- <message>
- <source>Unable to find UTXO for external input</source>
- <translation type="unfinished">قادر به پیدا کردن UTXO برای ورودی جانبی نیست.</translation>
- </message>
- <message>
- <source>Unable to generate initial keys</source>
- <translation type="unfinished">نمیتوان کلید های اولیه را تولید کرد.</translation>
- </message>
- <message>
- <source>Unable to generate keys</source>
- <translation type="unfinished">نمیتوان کلید ها را تولید کرد</translation>
- </message>
- <message>
- <source>Unable to open %s for writing</source>
- <translation type="unfinished">برای نوشتن %s باز نمی شود</translation>
- </message>
- <message>
- <source>Unable to parse -maxuploadtarget: '%s'</source>
- <translation type="unfinished">قادر به تجزیه -maxuploadtarget نیست: '%s'</translation>
- </message>
- <message>
- <source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">سرور HTTP راه اندازی نمی شود. برای جزئیات به گزارش اشکال زدایی مراجعه کنید.
- </translation>
- </message>
- <message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">شبکه مشخص شده غیرقابل شناسایی در onlynet: '%s'</translation>
- </message>
- <message>
- <source>Unknown new rules activated (versionbit %i)</source>
- <translation type="unfinished">قوانین جدید ناشناخته Ùعال شد (‌%iversionbit)</translation>
- </message>
- <message>
- <source>Verifying blocks…</source>
- <translation type="unfinished">در حال تأیید بلوک‌ها…</translation>
- </message>
- <message>
- <source>Verifying wallet(s)…</source>
- <translation type="unfinished">در حال تأیید کی٠ها…</translation>
- </message>
- <message>
- <source>Settings file could not be read</source>
- <translation type="unfinished">Ùایل تنظیمات خوانده نشد</translation>
- </message>
- <message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">Ùایل تنظیمات نوشته نشد</translation>
- </message>
-</context>
+ </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts
index 5139486348..c72d64d7b9 100644
--- a/src/qt/locale/bitcoin_fi.ts
+++ b/src/qt/locale/bitcoin_fi.ts
@@ -2,8 +2,8 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Create a new address</source>
- <translation type="unfinished">Luo uusi osoite</translation>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Valitse hiiren kakkospainikkeella muokataksesi osoitetta tai nimikettä</translation>
</message>
<message>
<source>&amp;New</source>
@@ -54,10 +54,6 @@
<translation type="unfinished">V&amp;alitse</translation>
</message>
<message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Nämä ovat Bitcoin-osoitteesi maksujen lähettämistä varten. Tarkista aina määrä ja vastaanotto-osoite ennen kolikoiden lähettämistä.</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Nämä ovat Bitcoin-osoitteesi maksujen vastaanottoa varten. Käytä painiketta "Luo uusi vastaanotto-osoite" vastaanottovälilehdessä luodaksesi uusia osoitteita.
@@ -180,6 +176,14 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Syötä vanha ja uusi salasanalause lompakolle.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Jatka</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Takaisin</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Muista, että salaamalla lompakkosi et täysin pysty suojaamaan bitcoineja varkaudelta, jotka aiheutuvat koneellasi olevista haittaohjelmista.</translation>
</message>
@@ -417,7 +421,11 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<numerusform>%n vuotta</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">oletuslompakko</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -731,10 +739,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Naamioi arvot Yhteenveto-välilehdessä</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">oletuslompakko</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Lompakoita ei ole saatavilla</translation>
</message>
@@ -1099,19 +1103,11 @@ If this wallet contains any watchonly scripts, a new wallet will be created whic
If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
- <translation type="unfinished"> 
-Migrer le portefeuille convertira ce portefeuille en un ou plusieurs portefeuilles de descripteurs. Une nouvelle sauvegarde du portefeuille devra être effectuée.
-Si ce portefeuille contient des scripts watchonly, un nouveau portefeuille sera créé avec ces scripts watchonly.
-Si ce portefeuille contient des scripts solvables mais non surveillés, un portefeuille différent et nouveau sera créé avec ces scripts.
-
-Le processus de migration créera une sauvegarde du portefeuille avant de migrer. Ce fichier de sauvegarde sera nommé -.legacy.bak et se trouvera dans le répertoire de ce portefeuille. En cas de migration incorrecte, la sauvegarde peut être restaurée avec la fonctionnalité "Restaurer le portefeuille".
-
-
-Lompakon siirtäminen muuntaa tämän lompakon yhdeksi tai useammaksi kuvailluksi lompakoksi. Uusi lompakon varmuuskopio on tehtävä.
+ <translation type="unfinished">Lompakon siirtäminen muuntaa tämän lompakon yhdeksi tai useammaksi kuvailluksi lompakoksi. Uusi lompakon varmuuskopio on tehtävä.
Jos tämä lompakko sisältää vain katseltavia skriptejä, luodaan uusi lompakko, joka sisältää nämä katseltavat skriptit.
Jos tämä lompakko sisältää ratkaistavia mutta ei katsottuja skriptejä, luodaan eri ja uusi lompakko, joka sisältää nämä skriptit.
-Siirtoprosessi luo varmuuskopion lompakosta ennen siirtoa. Tämä varmuuskopiotiedosto nimetään -.legacy.bak ja se löytyy tämän lompakon hakemistosta. Virheellisen siirron sattuessa varmuuskopio voidaan palauttaa "Palauta lompakko" -toiminnolla.</translation>
+Siirtoprosessi luo varmuuskopion lompakosta ennen siirtoa. Tämä varmuuskopiotiedosto nimetään &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak ja se löytyy tämän lompakon hakemistosta. Virheellisen siirron sattuessa varmuuskopio voidaan palauttaa "Palauta lompakko" -toiminnolla.</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -1126,6 +1122,14 @@ Siirtoprosessi luo varmuuskopion lompakosta ennen siirtoa. Tämä varmuuskopioti
<translation type="unfinished">Lompakko '%1' siirrettiin onnistuneesti.</translation>
</message>
<message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Pelkästään katseltavissa olevat skriptit on siirretty uuteen lompakkoon nimeltä '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Ratkaistavat mutta ei katsotut skriptit on siirretty uuteen lompakkoon nimeltä '%1'.</translation>
+ </message>
+ <message>
<source>Migration failed</source>
<translation type="unfinished">Siirto epäonnistui</translation>
</message>
@@ -1145,10 +1149,6 @@ Siirtoprosessi luo varmuuskopion lompakosta ennen siirtoa. Tämä varmuuskopioti
<translation type="unfinished">Avoimen lompakon varoitus</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">oletuslompakko</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Avaa lompakko</translation>
@@ -1542,7 +1542,7 @@ Siirtoprosessi luo varmuuskopion lompakosta ennen siirtoa. Tämä varmuuskopioti
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Tuntematon. Esi synkronointi otsikot (%1, %2%)...</translation>
+ <translation type="unfinished">Tuntematon. Esi-synkronointi otsikot (%1, %2%)...</translation>
</message>
</context>
<context>
@@ -2350,10 +2350,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Kuljetus</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">BIP324-istunnon tunnusmerkkijono heksadesimaalimuodossa, jos sellainen on.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Istunnon tunniste</translation>
</message>
@@ -2648,6 +2644,10 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Verkkoliikenne pysäytetty</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ei yhtään</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Suoritetaan komento ilman lomakkoa</translation>
</message>
@@ -2656,6 +2656,22 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Suoritetaan komento käyttäen lompakkoa "%1"</translation>
</message>
<message>
+ <source>Welcome to the %1 RPC console.
+Use up and down arrows to navigate history, and %2 to clear screen.
+Use %3 and %4 to increase or decrease the font size.
+Type %5 for an overview of available commands.
+For more information on using this console, type %6.
+
+%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
+ <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
+ <translation type="unfinished">Tervetuloa %1 RPC-konsoliin.
+Käytä ylä- ja alanuolinäppäintä historiassa navigoimiseen ja näppäintä %2 näytön tyhjentämiseen.
+Käytä näppäimiä %3 ja %4 fonttikoon suurentamiseen ja pienentämiseen.
+Näet yleiskuvan käytettävistä komennoista kirjoittamalla %5.
+Lisätietoja konsolin käytöstä saat kirjoittamalla %6.
+%7VAROITUS: Huijarit ovat aktiivisesti yrittäneet varastaa käyttäjien lompakoiden sisältöä pyytämällä heitä kirjoittamaan komentoja tänne. Älä käytä tätä konsolia, jos et täysin ymmärrän komennon seurauksia.%8</translation>
+ </message>
+ <message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished">Suoritetaan...</translation>
@@ -3347,10 +3363,6 @@ Huom: Koska maksu lasketaan per tavu, "100 satoshin per kB" maksunopeus 500 virt
<translation type="unfinished">&amp;Allekirjoita viesti</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Voit allekirjoittaa viestit / sopimukset omalla osoitteellasi todistaaksesi että voit vastaanottaa siihen lähetetyt bitcoinit. Varo allekirjoittamasta mitään epämääräistä, sillä phishing-hyökkääjät voivat huijata sinua luovuttamaan henkilöllisyytesi allekirjoituksella. Allekirjoita ainoastaan täysin yksityiskohtainen selvitys siitä, mihin olet sitoutumassa.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-osoite jolla viesti allekirjoitetaan</translation>
</message>
@@ -3435,10 +3447,6 @@ Huom: Koska maksu lasketaan per tavu, "100 satoshin per kB" maksunopeus 500 virt
<translation type="unfinished">Tarkista osoite ja yritä uudelleen.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Syötetty osoite ei viittaa tunnettuun avaimeen.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Lompakon avaaminen peruttiin.</translation>
</message>
@@ -4009,11 +4017,6 @@ Varoitus: Tämä voi maksaa ylimääräisen maksun vähentämällä vaihtotuloja
<translation type="unfinished">PSBT kopioitu</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Kopioi leikepöydälle</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Siirtoa ei voida allekirjoittaa.</translation>
</message>
@@ -4025,10 +4028,6 @@ Varoitus: Tämä voi maksaa ylimääräisen maksun vähentämällä vaihtotuloja
<source>Can't display address</source>
<translation type="unfinished">Osoitetta ei voida näyttää</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">oletuslompakko</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4106,10 +4105,6 @@ ilman, että käytetään mitään snapshot-tietoja. Ilmoita tästä tapauksesta
<translation type="unfinished">Useampi onion bind -osoite on tarjottu. Automaattisesti luotua Torin onion-palvelua varten käytetään %s.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Tarkistathan että tietokoneesi päivämäärä ja kellonaika ovat oikeassa! Jos kellosi on väärässä, %s ei toimi oikein.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Ole hyvä ja avusta, jos %s on mielestäsi hyödyllinen. Vieraile %s saadaksesi lisää tietoa ohjelmistosta.</translation>
</message>
@@ -4182,10 +4177,6 @@ ilman, että käytetään mitään snapshot-tietoja. Ilmoita tästä tapauksesta
<translation type="unfinished">-maxmempool on oltava vähintään %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Kriittinen sisäinen virhe kohdattiin, katso debug.log lisätietoja varten</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">-%s -osoitteen '%s' selvittäminen epäonnistui</translation>
</message>
@@ -4602,10 +4593,6 @@ Ei voinut palauttaa lompakon varmuuskopiota..</translation>
<translation type="unfinished">Siirtosumma liian iso</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Ei voida varata muistia kohteelle %sMiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Kytkeytyminen kohteeseen %s ei onnistunut tällä tietokonella (kytkeytyminen palautti virheen %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fil.ts b/src/qt/locale/bitcoin_fil.ts
index a8d32b00c0..8aca583655 100644
--- a/src/qt/locale/bitcoin_fil.ts
+++ b/src/qt/locale/bitcoin_fil.ts
@@ -222,6 +222,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Isang fatal error ang naganap. %1 ay hindi na maaaring magpatuloy nang ligtas at magtitigil.</translation>
+ </message>
+ </context>
+<context>
<name>QObject</name>
<message>
<source>Error: %1</source>
@@ -299,7 +306,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">walet na default</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -377,7 +388,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Palitan ang passphrase na ginamit para sa pag-enkripto ng pitaka</translation>
+ <translation type="unfinished">Palitan ang passphrase na ginamit para sa pag-encrypt ng walet</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -499,10 +510,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ipakita sa %1 ang tulong na mensahe upang makuha ang talaan ng mga posibleng opsyon ng Bitcoin command-line</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">walet na default</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Walang magagamit na mga walet</translation>
</message>
@@ -540,6 +547,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kamalian: %1</translation>
</message>
<message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Babala:%1</translation>
+ </message>
+ <message>
<source>Date: %1
</source>
<translation type="unfinished">Datiles: %1
@@ -699,7 +710,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(%1 locked)</source>
- <translation type="unfinished">(%1 ay naka-lock)</translation>
+ <translation type="unfinished">(%1 Naka-lock)</translation>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
@@ -745,10 +756,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Buksan ang babala sa pitaka</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">walet na default</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Buksan ang Walet</translation>
@@ -1569,8 +1576,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Mapped AS</source>
- <translation type="unfinished">Mapa sa AS
-</translation>
+ <translation type="unfinished">Mapa sa AS</translation>
</message>
<message>
<source>User Agent</source>
@@ -1686,6 +1692,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ang aktibidad ng network ay hindi gumagana.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Wala</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Isinasagawa ang command nang walang anumang walet.</translation>
</message>
@@ -2026,6 +2036,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Lumikha ng Unsigned</translation>
</message>
<message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">Lumilikha ng isang Bahagyang Signed Bitcoin Transaction (PSBT) para magamit sa hal. isang offline na%1 wallet, o isang wallet na hardware na katugma sa PSBT.</translation>
+ </message>
+ <message>
+ <source>%1 to '%2'</source>
+ <translation type="unfinished">%1 hanggang %2</translation>
+ </message>
+ <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 sa %2</translation>
</message>
@@ -2191,10 +2209,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Pirmahan ang Mensahe</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Maaari kang pumirma ng mga mensahe/kasunduan sa iyong mga address upang mapatunayan na maaari kang makatanggap ng mga bitcoin na ipinadala sa kanila. Mag-ingat na huwag pumirma ng anumang bagay na hindi malinaw o random, dahil ang mga phishing attack ay maaaring subukan na linlangin ka sa pagpirma ng iyong pagkakakilanlan sa kanila. Pumirma lamang ng kumpletong mga pahayag na sumasang-ayon ka.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Ang Bitcoin address kung anong ipipirma sa mensahe</translation>
</message>
@@ -2271,10 +2285,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Mangyaring suriin ang address at subukang muli.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Ang pinasok na address ay hindi tumutukoy sa isang key.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Kinansela ang pag-unlock ng walet.</translation>
</message>
@@ -2712,11 +2722,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Could not commit transaction</source>
<translation type="unfinished">Hindi makagawa ng transaksyon</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">walet na default</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2767,10 +2773,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Naipamahagi sa ilalim ng lisensya ng MIT software, tingnan ang kasamang file %s o %s</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Mangyaring suriin na ang petsa at oras ng iyong computer ay tama! Kung mali ang iyong orasan, ang %s ay hindi gagana nang maayos.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Mangyaring tumulong kung natagpuan mo ang %s kapaki-pakinabang. Bisitahin ang %s para sa karagdagang impormasyon tungkol sa software.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fo.ts b/src/qt/locale/bitcoin_fo.ts
index 20b8db74bd..15dc1b50d4 100644
--- a/src/qt/locale/bitcoin_fo.ts
+++ b/src/qt/locale/bitcoin_fo.ts
@@ -286,7 +286,7 @@
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">Byte:</translation>
+ <translation type="unfinished">Být:</translation>
</message>
<message>
<source>Amount:</source>
@@ -864,7 +864,7 @@
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">Byte:</translation>
+ <translation type="unfinished">Být:</translation>
</message>
<message>
<source>Amount:</source>
@@ -883,6 +883,10 @@
<translation type="unfinished">Adressa til vekslipening</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">per kilobýt</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">Loka</translation>
</message>
@@ -1005,10 +1009,6 @@
<translation type="unfinished">&amp;Undirrita Boð</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Tú kann skriva undir boð/sáttmálar við tínum adressum, fyri at prógva at tú kanst móttaka bitcoin sendar til tær. Ver ansin so tú ikki skrivar undir nakað ógreitt ella tilvildarligt, tí fysking-álop kunnu royna at snýta teg til at latað tín samleika til tey. Undirrita einans nágreiniligar útsagnir ið tú tekur undir við.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin adressan at undirskriva boðini við</translation>
</message>
@@ -1269,10 +1269,6 @@
<translation type="unfinished">%s umbøn at lurta á portur %u. Hetta portrið er tulkað "óhóskandi" og tí er ósannlíkt at nakar viðskiftari sambindur í tað. Sí lista yvir "óhóskandi" portur og nágreiniligari upplýsingar í doc/p2p-bad-ports.md.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Vinaliga tryggja at dagfesting og tíð, í teldu tíni, eru røtt! Er klokkan skeiv virkar %s ikki sum ætlað.</translation>
- </message>
- <message>
<source>%s is set very high!</source>
<translation type="unfinished">Ãsetingin %s er sera høgt!</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts
index e62e8329f1..5ff6d09dbd 100644
--- a/src/qt/locale/bitcoin_fr.ts
+++ b/src/qt/locale/bitcoin_fr.ts
@@ -35,7 +35,7 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporter les données de l'onglet actuel vers un fichier</translation>
+ <translation type="unfinished">Exporter les données de l’onglet actuel vers un fichier</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -47,7 +47,7 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Choisir l'adresse à laquelle envoyer des pièces</translation>
+ <translation type="unfinished">Choisir l’adresse à laquelle envoyer des pièces</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
@@ -81,7 +81,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Exporter la liste d'adresses</translation>
+ <translation type="unfinished">Exporter la liste d’adresses</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -103,7 +103,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Échec d'exportation</translation>
+ <translation type="unfinished">Échec d’exportation</translation>
</message>
</context>
<context>
@@ -184,6 +184,14 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
<translation type="unfinished">Saisir l’ancienne puis la nouvelle phrase de passe du porte-monnaie.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Poursuivre</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Retour</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">N’oubliez pas que le chiffrement de votre porte-monnaie ne peut pas protéger entièrement vos bitcoins contre le vol par des programmes malveillants qui infecteraient votre ordinateur.</translation>
</message>
@@ -229,7 +237,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">La phrase de passe du porte-monnaie a été modifiée.</translation>
+ <translation type="unfinished">La phrase de passe du porte-monnaie a été modifiée avec succès.</translation>
</message>
<message>
<source>Passphrase change failed</source>
@@ -439,6 +447,10 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
<source>%1 GB</source>
<translation type="unfinished">%1 Go</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">porte-monnaie par défaut</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -505,11 +517,11 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
+ <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
- <translation type="unfinished">Sauvegarder le porte-monnaie dans un autre emplacement</translation>
+ <translation type="unfinished">Sauvegarder le porte-monnaie vers un autre emplacement</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
@@ -533,7 +545,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Sauvegarder le porte-monnaie…</translation>
+ <translation type="unfinished">&amp;auvegarder le porte-monnaie…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -557,7 +569,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Charger la TBSP d’un fichier…</translation>
+ <translation type="unfinished">&amp;Charger une TBSP d’un fichier…</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -617,11 +629,11 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses d’envoi et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes d’envoi utilisées</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses de réception et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes de réception utilisées</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -684,7 +696,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Ouvrir une console de débogage des nœuds et de diagnostic</translation>
+ <translation type="unfinished">Ouvrir une console de débogage de nœuds et de diagnostic</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
@@ -700,7 +712,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ouvrir un porte-monnaie</translation>
+ <translation type="unfinished">Ouvrir le porte-monnaie</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -745,10 +757,6 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
<translation type="unfinished">Masquer les montants dans l’onglet Vue d’ensemble</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Aucun porte-monnaie n’est proposé</translation>
</message>
@@ -800,8 +808,8 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n connexion active vers le réseau Bitcoin.</numerusform>
- <numerusform>%n de connexions actives vers le réseau Bitcoin.</numerusform>
+ <numerusform>%n connexion active avec le réseau Bitcoin.</numerusform>
+ <numerusform>%n connexions actives avec le réseau Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -988,11 +996,11 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Copier l’é&amp;tiquette</translation>
+ <translation type="unfinished">Copier l’&amp;étiquette</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Copier le mont&amp;ant</translation>
+ <translation type="unfinished">Copier le &amp;montant</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -1133,7 +1141,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</message>
<message>
<source>Migration failed</source>
- <translation type="unfinished">La migration a échoué</translation>
+ <translation type="unfinished">Échec de migration</translation>
</message>
<message>
<source>Migration Successful</source>
@@ -1151,10 +1159,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
<translation type="unfinished">Avertissement d’ouverture du porte-monnaie</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ouvrir un porte-monnaie</translation>
@@ -1507,7 +1511,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</message>
<message>
<source>calculating…</source>
- <translation type="unfinished">calcul en cours…</translation>
+ <translation type="unfinished">calcul…</translation>
</message>
<message>
<source>Last block time</source>
@@ -2290,6 +2294,14 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Nombre de connexions</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Adresses locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Adresses réseau que votre nœud Bitcoin utilise actuellement pour communiquer avec d’autres nœuds.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Chaîne de blocs</translation>
</message>
@@ -2338,12 +2350,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Sélectionnez un pair pour afficher des renseignements détaillés.</translation>
</message>
<message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">Version de la couche de transport : %1</translation>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Cacher les détails des pairs</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">ID hexadécimale de la session BIP324, le cas échéant.</translation>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Version de la couche de transport : %1</translation>
</message>
<message>
<source>Session ID</source>
@@ -2448,6 +2460,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Direction ou type</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">ID hexadécimale de la session BIP324.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Le protocole réseau par lequel ce pair est connecté : IPv4, IPv6, Oignon, I2P ou CJDNS.</translation>
</message>
@@ -2632,6 +2648,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">L’activité réseau est désactivée</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Aucun</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
@@ -3238,6 +3258,13 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">Des frais supérieurs à %1 sont considérés comme ridiculement élevés.</translation>
</message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Début de confirmation estimé à %n bloc.</numerusform>
+ <numerusform>Début de confirmation estimé à %n de blocs.</numerusform>
+ </translation>
+ </message>
<message>
<source>Warning: Invalid Bitcoin address</source>
<translation type="unfinished">Avertissement : L’adresse Bitcoin est invalide</translation>
@@ -3340,8 +3367,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">&amp;Signer un message</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Vous pouvez signer des messages ou des accords avec vos adresses pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Faites attention de ne rien signer de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous êtes d’accord.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Vous pouvez signer des messages ou des accords avec vos anciennes adresses (P2PKH) pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Ne signer rien de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et que vous acceptez.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3424,8 +3451,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez vérifier l’adresse et réessayer.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L’adresse saisie ne fait pas référence à une clé.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">L’adresse saisie ne fait pas référence à une ancienne clé (P2PKH). La signature des messages n’est pas prise en charge pour SegWit ni pour les autres types d’adresses non P2PKH dans cette version de %1. Vérifiez l’adresse et réessayez.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3861,7 +3888,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Échec d'exportation</translation>
+ <translation type="unfinished">Échec d’exportation</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
@@ -3971,9 +3998,8 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La TBPS a été copiée</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copié dans le presse-papiers</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">La TBSP des augmentations de frais a été copiée dans le presse-papiers.</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3984,12 +4010,12 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible de valider la transaction</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Impossible d’afficher l’adresse</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erreur de signataire</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Impossible d’afficher l’adresse</translation>
</message>
</context>
<context>
@@ -4000,7 +4026,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporter les données de l'onglet actuel vers un fichier</translation>
+ <translation type="unfinished">Exporter les données de l’onglet actuel vers un fichier</translation>
</message>
<message>
<source>Backup Wallet</source>
@@ -4123,10 +4149,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Aucun format de fichier de porte-monnaie n’a été indiqué. Pour utiliser createfromdump, -format=&lt;format&gt; doit être indiqué.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Veuillez vérifier que l’heure et la date de votre ordinateur sont justes. Si votre horloge n’est pas à l’heure, %s ne fonctionnera pas correctement.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Si vous trouvez %s utile, veuillez y contribuer. Pour de plus de précisions sur le logiciel, rendez-vous sur %s.</translation>
</message>
@@ -4144,7 +4166,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
- <translation type="unfinished">Le renommage de '%s' en '%s' a échoué. Vous devriez résoudre cela en déplaçant ou en supprimant manuellement le répertoire de l’instantané invalide %s, sinon la même erreur surviendra de nouveau lors du prochain démarrage.</translation>
+ <translation type="unfinished">Échec de renommage de '%s' en '%s'. Vous devriez résoudre cela en déplaçant ou en supprimant manuellement le répertoire de l’instantané invalide %s, sinon la même erreur surviendra de nouveau lors du prochain démarrage.</translation>
</message>
<message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
@@ -4235,10 +4257,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">-maxmempool doit être d’au moins %d Mo</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Une erreur interne fatale est survenue. Consulter debug.log pour plus de précisions</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Impossible de résoudre l’adresse -%s : « %s »</translation>
</message>
@@ -4287,6 +4305,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Échec de calcul de la majoration des frais, car les UTXO non confirmés dépendent d’un groupe énorme de transactions non confirmées.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Échec de suppression du répertoire de l’instantané d’état de la chaîne (%s). Supprimez-le manuellement avant de redémarrer.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Échec de renommage du fichier peers.dat invalide. Veuillez le déplacer ou le supprimer, puis réessayer.</translation>
</message>
@@ -4295,6 +4318,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Échec d’estimation des frais. L’option de frais de repli « Fallbackfee » est désactivée. Attendez quelques blocs ou activez %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier des blocs sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier d’annulation sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Options incompatibles : -dnsseed=1 a été indiqué explicitement, mais -onlynet interdit les connexions vers IPv4 et IPv6</translation>
</message>
@@ -4303,6 +4334,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Le montant est invalide pour %s=&lt;amount&gt; : « %s » (doit être au moins égal aux frais minrelay de %s pour prévenir le blocage des transactions)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Le poids maximal de la transaction est inférieur au poids de la transaction sans entrées</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Le poids maximal de la transaction est trop faible et ne permet pas les sorties de monnaie</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Les connexions sortantes sont limitées à CJDNS (-onlynet=cjdns), mais -cjdnsreachable n’est pas indiqué</translation>
</message>
@@ -4319,6 +4358,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Les connexions sortantes sont limitées à i2p (-onlynet=i2p), mais -i2psam n’est pas indiqué</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Échec de renommage de « %s » en « %s ». Impossible de nettoyer le répertoire de la base de données d’état de chaîne d’arrière-plan.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinaison des entrées présélectionnées et de la sélection automatique des entrées du porte-monnaie dépasse le poids maximal de la transaction. Essayez d’envoyer un montant inférieur ou de consolider manuellement les UTXO de votre porte-monnaie.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">La taille des entrées dépasse le poids maximum. Essayez d’envoyer un montant plus petit ou de consolider manuellement les UTXO de votre porte-monnaie</translation>
</message>
@@ -4361,6 +4408,10 @@ Essayez d’utiliser la version la plus récente du logiciel.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La date et l’heure de votre ordinateur semblent décalées de plus de %d minutes par rapport au réseau, ce qui peut entraîner un échec de consensus. Après avoir confirmé l’heure de votre ordinateur, ce message ne devrait plus s’afficher après redémarrage de votre nœud. Sans redémarrage, il devrait cesser de s’afficher automatiquement si vous vous connectez à suffisamment de nouveaux pairs sortants, ce qui peut prendre du temps. Pour plus de précisions, vous pouvez inspecter le champ `timeoffset` des méthodes RPC `getpeerinfo` et `getnetworkinfo`.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4373,6 +4424,18 @@ Unable to restore backup of wallet.</source>
Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">« whitebind » ne peut être utilisé que pour les connexions entrantes (« out » a été passé)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Une erreur interne fatale est survenue. Pour plus de précisions, consultez debug.log :</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Les données Assumeutxo sont introuvables pour l’empreinte de bloc « %s » donnée.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">La vérification des blocs a été interrompue</translation>
</message>
@@ -4385,6 +4448,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Tous droits réservés © %i à %i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Un bloc corrompu a été détecté, ce qui indique une défaillance matérielle possible.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Une base de données des blocs corrompue a été détectée</translation>
</message>
@@ -4413,6 +4480,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Échec du contrôle d’intégrité de la cryptographie à courbe elliptique. Fermeture de %s.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Erreur de validation de la transaction de base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
@@ -4561,10 +4632,22 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Échec de connexion du meilleur bloc (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Échec de déconnexion du bloc.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Échec d’écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Échec de lecture du bloc.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Échec de réanalyse du porte-monnaie lors de l’initialisation</translation>
</message>
@@ -4577,6 +4660,22 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Échec d’écriture du bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données d’index des blocs.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données des pièces.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Échec d’écriture des données d’annulation.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Échec de retrait de la transaction :%s</translation>
</message>
@@ -4673,6 +4772,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Chargement du porte-monnaie…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Le poids maximal de la transaction doit être compris entre %d et %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Le montant manque</translation>
</message>
@@ -4701,6 +4804,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Entrée présélectionnée non soluble %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Seule la direction a été définie, sans permissions : « %s »</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">L’élagage ne peut pas être configuré avec une valeur négative</translation>
</message>
@@ -4745,6 +4852,18 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">La section [%s] n’est pas reconnue</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Le signataire n’a pas renvoyé l’adresse</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une adresse inattendue %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une erreur : %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Échec de signature de la transaction</translation>
</message>
@@ -4773,6 +4892,18 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Démarrage des processus réseau…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erreur système lors du vidage : %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erreur système lors du chargement d’un fichier de blocs externe : %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erreur système lors de l’enregistrement du bloc sur le disque : %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Le code source est publié sur %s.</translation>
</message>
@@ -4789,6 +4920,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Le porte-monnaie évitera de payer moins que les frais minimaux de relais.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Il n’y a pas de « ScriptPubKeyManager » pour cette adresse.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Ce logiciel est expérimental.</translation>
</message>
@@ -4806,7 +4941,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Transaction amount too small</source>
- <translation type="unfinished">Le montant de la transaction est trop bas</translation>
+ <translation type="unfinished">Le montant de la transaction est trop petit</translation>
</message>
<message>
<source>Transaction amounts must not be negative</source>
@@ -4829,10 +4964,6 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">La transaction est trop élevée</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossible d’allouer de la mémoire pour -maxsigcachesize : « %s » Mio</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Impossible de se lier à %s sur cet ordinateur (la liaison a retourné l’erreur %s)</translation>
</message>
@@ -4893,6 +5024,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Les nouvelles règles inconnues sont activées (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Une option non reconnue « %s » a été indiquée dans -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fr_CM.ts b/src/qt/locale/bitcoin_fr_CM.ts
index 50d27a4f85..07ceebc2ef 100644
--- a/src/qt/locale/bitcoin_fr_CM.ts
+++ b/src/qt/locale/bitcoin_fr_CM.ts
@@ -180,6 +180,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Saisir l’ancienne puis la nouvelle phrase de passe du porte-monnaie.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Poursuivre</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Retour</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">N’oubliez pas que le chiffrement de votre porte-monnaie ne peut pas protéger entièrement vos bitcoins contre le vol par des programmes malveillants qui infecteraient votre ordinateur.</translation>
</message>
@@ -435,6 +443,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<source>%1 GB</source>
<translation type="unfinished">%1 Go</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">porte-monnaie par défaut</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -501,11 +513,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
+ <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
- <translation type="unfinished">Sauvegarder le porte-monnaie dans un autre emplacement</translation>
+ <translation type="unfinished">Sauvegarder le porte-monnaie vers un autre emplacement</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
@@ -520,6 +532,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">&amp;Recevoir</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Choix</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Chiffrer le porte-monnaie…</translation>
</message>
@@ -529,7 +545,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Sauvegarder le porte-monnaie…</translation>
+ <translation type="unfinished">&amp;auvegarder le porte-monnaie…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -553,7 +569,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Charger la TBSP d’un fichier…</translation>
+ <translation type="unfinished">&amp;Charger une TBSP d’un fichier…</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -589,7 +605,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisation des en-têtes (%1 %)…</translation>
+ <translation type="unfinished">Synchronisation des en-têtes (%1)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -613,11 +629,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses d’envoi et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes d’envoi utilisées</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses de réception et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes de réception utilisées</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -636,7 +652,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">Rattrapage en cours…</translation>
+ <translation type="unfinished">Rattrapage…</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -656,7 +672,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Informations</translation>
+ <translation type="unfinished">Renseignements</translation>
</message>
<message>
<source>Up to date</source>
@@ -680,7 +696,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Ouvrir une console de débogage des nœuds et de diagnostic</translation>
+ <translation type="unfinished">Ouvrir une console de débogage de nœuds et de diagnostic</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
@@ -696,7 +712,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ouvrir un porte-monnaie</translation>
+ <translation type="unfinished">Ouvrir le porte-monnaie</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -741,10 +757,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Masquer les montants dans l’onglet Vue d’ensemble</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Aucun porte-monnaie n’est disponible</translation>
</message>
@@ -1092,6 +1104,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Migrer le portefeuille</translation>
</message>
<message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Êtes-vous sûr de vouloir migrer le portefeuille &lt;i&gt;%1&lt;/i&gt;</translation>
+ </message>
+ <message>
<source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
@@ -1143,10 +1159,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Avertissement d’ouverture du porte-monnaie</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ouvrir un porte-monnaie</translation>
@@ -2282,6 +2294,14 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Nombre de connexions</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Adresses locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Adresses réseau que votre nœud Bitcoin utilise actuellement pour communiquer avec d’autres nœuds.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Chaîne de blocs</translation>
</message>
@@ -2330,12 +2350,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Sélectionnez un pair pour afficher des renseignements détaillés.</translation>
</message>
<message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">La version de la couche de transport : %1</translation>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Cacher les détails des pairs</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">La chaîne d'ID de session BIP324 en hexadécimal, le cas échéant.</translation>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">La version de la couche de transport : %1</translation>
</message>
<message>
<source>Session ID</source>
@@ -2436,6 +2456,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">La direction et le type de la connexion au pair : %1</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">ID hexadécimale de la session BIP324.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Le protocole réseau par lequel ce pair est connecté : IPv4, IPv6, Oignon, I2P ou CJDNS.</translation>
</message>
@@ -2620,6 +2644,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">L’activité réseau est désactivée</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Aucun</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
@@ -3216,6 +3244,13 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">Des frais supérieurs à %1 sont considérés comme ridiculement élevés.</translation>
</message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Début de confirmation estimé à %n bloc.</numerusform>
+ <numerusform>Début de confirmation estimé à %n blocs.</numerusform>
+ </translation>
+ </message>
<message>
<source>Warning: Invalid Bitcoin address</source>
<translation type="unfinished">Avertissement : L’adresse Bitcoin est invalide</translation>
@@ -3318,8 +3353,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">&amp;Signer un message</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Vous pouvez signer des messages ou des accords avec vos adresses pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Faites attention de ne rien signer de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous êtes d’accord.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Vous pouvez signer des messages ou des accords avec vos anciennes adresses (P2PKH) pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Ne signer rien de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et que vous acceptez.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3402,8 +3437,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez vérifier l’adresse et réessayer.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L’adresse saisie ne fait pas référence à une clé.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">L’adresse saisie ne fait pas référence à une ancienne clé (P2PKH). La signature des messages n’est pas prise en charge pour SegWit ni pour les autres types d’adresses non P2PKH dans cette version de %1. Vérifiez l’adresse et réessayez.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3949,9 +3984,8 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La TBPS a été copiée</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copié dans le presse-papiers</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">La TBSP des augmentations de frais a été copiée dans le presse-papiers.</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3962,12 +3996,12 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible de valider la transaction</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Impossible d’afficher l’adresse</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erreur de signataire</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Impossible d’afficher l’adresse</translation>
</message>
</context>
<context>
@@ -4101,10 +4135,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Aucun format de fichier de porte-monnaie n’a été indiqué. Pour utiliser createfromdump, -format=&lt;format&gt; doit être indiqué.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Veuillez vérifier que l’heure et la date de votre ordinateur sont justes. Si votre horloge n’est pas à l’heure, %s ne fonctionnera pas correctement.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Si vous trouvez %s utile, veuillez y contribuer. Pour de plus de précisions sur le logiciel, rendez-vous sur %s.</translation>
</message>
@@ -4213,10 +4243,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">-maxmempool doit être d’au moins %d Mo</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Une erreur interne fatale est survenue. Consulter debug.log pour plus de précisions</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Impossible de résoudre l’adresse -%s : « %s »</translation>
</message>
@@ -4265,6 +4291,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Échec du calcul des frais de majoration, car les UTXO non confirmés dépendent d'un énorme groupe de transactions non confirmées.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Échec de suppression du répertoire de l’instantané d’état de la chaîne (%s). Supprimez-le manuellement avant de redémarrer.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Échec de renommage du fichier peers.dat invalide. Veuillez le déplacer ou le supprimer, puis réessayer.</translation>
</message>
@@ -4273,6 +4304,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">L'estimation des frais a échoué. Fallbackfee est désactivé. Attendez quelques blocs ou activez %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier des blocs sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier d’annulation sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Options incompatibles : -dnsseed=1 a été explicitement spécifié, mais -onlynet interdit les connexions vers IPv4/IPv6</translation>
</message>
@@ -4281,6 +4320,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Montant non valide pour %s=&lt;amount&gt; : '%s' (doit être au moins égal au minrelay fee de %s pour éviter les transactions bloquées)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Le poids maximal de la transaction est inférieur au poids de la transaction sans entrées</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Le poids maximal de la transaction est trop faible et ne permet pas les sorties de monnaie</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Connexions sortantes limitées à CJDNS (-onlynet=cjdns) mais -cjdnsreachable n'est pas fourni</translation>
</message>
@@ -4297,6 +4344,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Connexions sortantes limitées à i2p (-onlynet=i2p) mais -i2psam n'est pas fourni</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Échec de renommage de « %s » en « %s ». Impossible de nettoyer le répertoire de la base de données d’état de chaîne d’arrière-plan.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinaison des entrées présélectionnées et de la sélection automatique des entrées du porte-monnaie dépasse le poids maximal de la transaction. Essayez d’envoyer un montant inférieur ou de consolider manuellement les UTXO de votre porte-monnaie.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">La taille des entrées dépasse le poids maximum. Veuillez essayer d'envoyer un montant plus petit ou de consolider manuellement les UTXOs de votre portefeuille</translation>
</message>
@@ -4332,15 +4387,21 @@ Le portefeuille peut avoir été altéré ou créé avec des intentions malveill
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">Descripteur non reconnu trouvé. Chargement du portefeuille %ss
+ <translation type="unfinished">Descripteur non reconnu trouvé. Chargement du portefeuille %s
Le portefeuille a peut-être été créé avec une version plus récente.
-Veuillez essayer d'utiliser la dernière version du logiciel.</translation>
+Veuillez essayer d'utiliser la dernière version du logiciel.
+</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La date et l’heure de votre ordinateur semblent décalées de plus de %d minutes par rapport au réseau, ce qui peut entraîner un échec de consensus. Après avoir confirmé l’heure de votre ordinateur, ce message ne devrait plus s’afficher après redémarrage de votre nœud. Sans redémarrage, il devrait cesser de s’afficher automatiquement si vous vous connectez à suffisamment de nouveaux pairs sortants, ce qui peut prendre du temps. Pour plus de précisions, vous pouvez inspecter le champ `timeoffset` des méthodes RPC `getpeerinfo` et `getnetworkinfo`.</translation>
</message>
<message>
<source>
Unable to cleanup failed migration</source>
- <translation type="unfinished">Impossible de corriger l'échec de la migration</translation>
+ <translation type="unfinished">
+Impossible de corriger l'échec de la migration</translation>
</message>
<message>
<source>
@@ -4349,6 +4410,18 @@ Unable to restore backup of wallet.</source>
Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">« whitebind » ne peut être utilisé que pour les connexions entrantes (« out » a été passé)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Une erreur interne fatale est survenue. Pour plus de précisions, consultez debug.log :</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Les données Assumeutxo sont introuvables pour l’empreinte de bloc « %s » donnée.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">La vérification des blocs a été interrompue</translation>
</message>
@@ -4361,6 +4434,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Tous droits réservés © %i à %i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Un bloc corrompu a été détecté, ce qui indique une défaillance matérielle possible.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Une base de données des blocs corrompue a été détectée</translation>
</message>
@@ -4389,6 +4466,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Échec du contrôle d’intégrité de la cryptographie à courbe elliptique. Fermeture de %s.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Erreur de validation des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
@@ -4537,10 +4618,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Échec de connexion du meilleur bloc (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Échec de déconnexion du bloc.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Échec de lecture du bloc.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Échec de réanalyse du porte-monnaie lors de l’initialisation</translation>
</message>
@@ -4553,6 +4646,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Échec d’écriture du bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données d’index des blocs.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données des pièces.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Échec d’écriture des données d’annulation.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Échec de suppression de la transaction :%s</translation>
</message>
@@ -4649,6 +4758,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Chargement du porte-monnaie…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Le poids maximal de la transaction doit être compris entre %d et %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Le montant manque</translation>
</message>
@@ -4677,6 +4790,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Entrée présélectionnée non solvable %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Seule la direction a été définie, sans permissions : « %s »</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">L’élagage ne peut pas être configuré avec une valeur négative</translation>
</message>
@@ -4721,6 +4838,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La section [%s] n’est pas reconnue</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Le signataire n’a pas fait écho à l’adresse</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une adresse inattendue %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une erreur : %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Échec de signature de la transaction</translation>
</message>
@@ -4749,6 +4878,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Démarrage des processus réseau…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erreur système lors du vidage : %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erreur système lors du chargement d’un fichier de blocs externe : %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erreur système lors de l’enregistrement du bloc sur le disque : %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Le code source est publié sur %s.</translation>
</message>
@@ -4765,6 +4906,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le porte-monnaie évitera de payer moins que les frais minimaux de relais.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Il n’y a pas de « ScriptPubKeyManager » pour cette adresse.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Ce logiciel est expérimental.</translation>
</message>
@@ -4805,10 +4950,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La transaction est trop grosse</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossible d'allouer de la mémoire pour -maxsigcachesize : '%s' Mo</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Impossible de se lier à %s sur cet ordinateur (la liaison a retourné l’erreur %s)</translation>
</message>
@@ -4869,6 +5010,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Les nouvelles règles inconnues sont activées (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Une option non reconnue « %s » a été indiquée dans -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fr_LU.ts b/src/qt/locale/bitcoin_fr_LU.ts
index 1c0fd095c4..76800c5658 100644
--- a/src/qt/locale/bitcoin_fr_LU.ts
+++ b/src/qt/locale/bitcoin_fr_LU.ts
@@ -180,6 +180,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Saisir l’ancienne puis la nouvelle phrase de passe du porte-monnaie.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Poursuivre</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Retour</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">N’oubliez pas que le chiffrement de votre porte-monnaie ne peut pas protéger entièrement vos bitcoins contre le vol par des programmes malveillants qui infecteraient votre ordinateur.</translation>
</message>
@@ -435,6 +443,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<source>%1 GB</source>
<translation type="unfinished">%1 Go</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">porte-monnaie par défaut</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -501,11 +513,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
+ <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
- <translation type="unfinished">Sauvegarder le porte-monnaie dans un autre emplacement</translation>
+ <translation type="unfinished">Sauvegarder le porte-monnaie vers un autre emplacement</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
@@ -520,6 +532,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">&amp;Recevoir</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Choix</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Chiffrer le porte-monnaie…</translation>
</message>
@@ -529,7 +545,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Sauvegarder le porte-monnaie…</translation>
+ <translation type="unfinished">&amp;auvegarder le porte-monnaie…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -553,7 +569,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Charger la TBSP d’un fichier…</translation>
+ <translation type="unfinished">&amp;Charger une TBSP d’un fichier…</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -589,7 +605,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisation des en-têtes (%1 %)…</translation>
+ <translation type="unfinished">Synchronisation des en-têtes (%1)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -613,11 +629,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses d’envoi et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes d’envoi utilisées</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses de réception et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes de réception utilisées</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -636,7 +652,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">Rattrapage en cours…</translation>
+ <translation type="unfinished">Rattrapage…</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -656,7 +672,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Informations</translation>
+ <translation type="unfinished">Renseignements</translation>
</message>
<message>
<source>Up to date</source>
@@ -680,7 +696,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Ouvrir une console de débogage des nœuds et de diagnostic</translation>
+ <translation type="unfinished">Ouvrir une console de débogage de nœuds et de diagnostic</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
@@ -696,7 +712,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ouvrir un porte-monnaie</translation>
+ <translation type="unfinished">Ouvrir le porte-monnaie</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -741,10 +757,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Masquer les montants dans l’onglet Vue d’ensemble</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Aucun porte-monnaie n’est disponible</translation>
</message>
@@ -1092,6 +1104,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Migrer le portefeuille</translation>
</message>
<message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Êtes-vous sûr de vouloir migrer le portefeuille &lt;i&gt;%1&lt;/i&gt;</translation>
+ </message>
+ <message>
<source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
@@ -1143,10 +1159,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Avertissement d’ouverture du porte-monnaie</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ouvrir un porte-monnaie</translation>
@@ -2282,6 +2294,14 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Nombre de connexions</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Adresses locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Adresses réseau que votre nœud Bitcoin utilise actuellement pour communiquer avec d’autres nœuds.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Chaîne de blocs</translation>
</message>
@@ -2330,12 +2350,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Sélectionnez un pair pour afficher des renseignements détaillés.</translation>
</message>
<message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">La version de la couche de transport : %1</translation>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Cacher les détails des pairs</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">La chaîne d'ID de session BIP324 en hexadécimal, le cas échéant.</translation>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">La version de la couche de transport : %1</translation>
</message>
<message>
<source>Session ID</source>
@@ -2436,6 +2456,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">La direction et le type de la connexion au pair : %1</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">ID hexadécimale de la session BIP324.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Le protocole réseau par lequel ce pair est connecté : IPv4, IPv6, Oignon, I2P ou CJDNS.</translation>
</message>
@@ -2620,6 +2644,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">L’activité réseau est désactivée</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Aucun</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
@@ -3216,6 +3244,13 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">Des frais supérieurs à %1 sont considérés comme ridiculement élevés.</translation>
</message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Début de confirmation estimé à %n bloc.</numerusform>
+ <numerusform>Début de confirmation estimé à %n blocs.</numerusform>
+ </translation>
+ </message>
<message>
<source>Warning: Invalid Bitcoin address</source>
<translation type="unfinished">Avertissement : L’adresse Bitcoin est invalide</translation>
@@ -3318,8 +3353,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">&amp;Signer un message</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Vous pouvez signer des messages ou des accords avec vos adresses pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Faites attention de ne rien signer de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous êtes d’accord.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Vous pouvez signer des messages ou des accords avec vos anciennes adresses (P2PKH) pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Ne signer rien de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et que vous acceptez.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3402,8 +3437,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez vérifier l’adresse et réessayer.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L’adresse saisie ne fait pas référence à une clé.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">L’adresse saisie ne fait pas référence à une ancienne clé (P2PKH). La signature des messages n’est pas prise en charge pour SegWit ni pour les autres types d’adresses non P2PKH dans cette version de %1. Vérifiez l’adresse et réessayez.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3949,9 +3984,8 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La TBPS a été copiée</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copié dans le presse-papiers</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">La TBSP des augmentations de frais a été copiée dans le presse-papiers.</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3962,12 +3996,12 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible de valider la transaction</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Impossible d’afficher l’adresse</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erreur de signataire</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Impossible d’afficher l’adresse</translation>
</message>
</context>
<context>
@@ -4101,10 +4135,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Aucun format de fichier de porte-monnaie n’a été indiqué. Pour utiliser createfromdump, -format=&lt;format&gt; doit être indiqué.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Veuillez vérifier que l’heure et la date de votre ordinateur sont justes. Si votre horloge n’est pas à l’heure, %s ne fonctionnera pas correctement.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Si vous trouvez %s utile, veuillez y contribuer. Pour de plus de précisions sur le logiciel, rendez-vous sur %s.</translation>
</message>
@@ -4213,10 +4243,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">-maxmempool doit être d’au moins %d Mo</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Une erreur interne fatale est survenue. Consulter debug.log pour plus de précisions</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Impossible de résoudre l’adresse -%s : « %s »</translation>
</message>
@@ -4265,6 +4291,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Échec du calcul des frais de majoration, car les UTXO non confirmés dépendent d'un énorme groupe de transactions non confirmées.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Échec de suppression du répertoire de l’instantané d’état de la chaîne (%s). Supprimez-le manuellement avant de redémarrer.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Échec de renommage du fichier peers.dat invalide. Veuillez le déplacer ou le supprimer, puis réessayer.</translation>
</message>
@@ -4273,6 +4304,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">L'estimation des frais a échoué. Fallbackfee est désactivé. Attendez quelques blocs ou activez %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier des blocs sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier d’annulation sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Options incompatibles : -dnsseed=1 a été explicitement spécifié, mais -onlynet interdit les connexions vers IPv4/IPv6</translation>
</message>
@@ -4281,6 +4320,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Montant non valide pour %s=&lt;amount&gt; : '%s' (doit être au moins égal au minrelay fee de %s pour éviter les transactions bloquées)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Le poids maximal de la transaction est inférieur au poids de la transaction sans entrées</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Le poids maximal de la transaction est trop faible et ne permet pas les sorties de monnaie</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Connexions sortantes limitées à CJDNS (-onlynet=cjdns) mais -cjdnsreachable n'est pas fourni</translation>
</message>
@@ -4297,6 +4344,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Connexions sortantes limitées à i2p (-onlynet=i2p) mais -i2psam n'est pas fourni</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Échec de renommage de « %s » en « %s ». Impossible de nettoyer le répertoire de la base de données d’état de chaîne d’arrière-plan.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinaison des entrées présélectionnées et de la sélection automatique des entrées du porte-monnaie dépasse le poids maximal de la transaction. Essayez d’envoyer un montant inférieur ou de consolider manuellement les UTXO de votre porte-monnaie.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">La taille des entrées dépasse le poids maximum. Veuillez essayer d'envoyer un montant plus petit ou de consolider manuellement les UTXOs de votre portefeuille.</translation>
</message>
@@ -4332,15 +4387,21 @@ Le portefeuille peut avoir été altéré ou créé avec des intentions malveill
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">Descripteur non reconnu trouvé. Chargement du portefeuille %ss
+ <translation type="unfinished">Descripteur non reconnu trouvé. Chargement du portefeuille %s
Le portefeuille a peut-être été créé avec une version plus récente.
-Veuillez essayer d'utiliser la dernière version du logiciel.</translation>
+Veuillez essayer d'utiliser la dernière version du logiciel.
+</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La date et l’heure de votre ordinateur semblent décalées de plus de %d minutes par rapport au réseau, ce qui peut entraîner un échec de consensus. Après avoir confirmé l’heure de votre ordinateur, ce message ne devrait plus s’afficher après redémarrage de votre nœud. Sans redémarrage, il devrait cesser de s’afficher automatiquement si vous vous connectez à suffisamment de nouveaux pairs sortants, ce qui peut prendre du temps. Pour plus de précisions, vous pouvez inspecter le champ `timeoffset` des méthodes RPC `getpeerinfo` et `getnetworkinfo`.</translation>
</message>
<message>
<source>
Unable to cleanup failed migration</source>
- <translation type="unfinished">Impossible de corriger l'échec de la migration</translation>
+ <translation type="unfinished">
+Impossible de corriger l'échec de la migration</translation>
</message>
<message>
<source>
@@ -4349,6 +4410,18 @@ Unable to restore backup of wallet.</source>
Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">« whitebind » ne peut être utilisé que pour les connexions entrantes (« out » a été passé)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Une erreur interne fatale est survenue. Pour plus de précisions, consultez debug.log :</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Les données Assumeutxo sont introuvables pour l’empreinte de bloc « %s » donnée.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">La vérification des blocs a été interrompue</translation>
</message>
@@ -4361,6 +4434,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Tous droits réservés © %i à %i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Un bloc corrompu a été détecté, ce qui indique une défaillance matérielle possible.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Une base de données des blocs corrompue a été détectée</translation>
</message>
@@ -4389,6 +4466,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Échec du contrôle d’intégrité de la cryptographie à courbe elliptique. Fermeture de %s.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Erreur de validation des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
@@ -4537,10 +4618,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Échec de connexion du meilleur bloc (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Échec de déconnexion du bloc.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Échec de lecture du bloc.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Échec de réanalyse du porte-monnaie lors de l’initialisation</translation>
</message>
@@ -4553,6 +4646,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Échec d’écriture du bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données d’index des blocs.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données des pièces.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Échec d’écriture des données d’annulation.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Échec de suppression de la transaction :%s</translation>
</message>
@@ -4649,6 +4758,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Chargement du porte-monnaie…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Le poids maximal de la transaction doit être compris entre %d et %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Le montant manque</translation>
</message>
@@ -4677,6 +4790,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Entrée présélectionnée non solvable %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Seule la direction a été définie, sans permissions : « %s »</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">L’élagage ne peut pas être configuré avec une valeur négative</translation>
</message>
@@ -4721,6 +4838,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La section [%s] n’est pas reconnue</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Le signataire n’a pas fait écho à l’adresse</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une adresse inattendue %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une erreur : %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Échec de signature de la transaction</translation>
</message>
@@ -4749,6 +4878,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Démarrage des processus réseau…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erreur système lors du vidage : %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erreur système lors du chargement d’un fichier de blocs externe : %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erreur système lors de l’enregistrement du bloc sur le disque : %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Le code source est publié sur %s.</translation>
</message>
@@ -4765,6 +4906,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le porte-monnaie évitera de payer moins que les frais minimaux de relais.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Il n’y a pas de « ScriptPubKeyManager » pour cette adresse.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Ce logiciel est expérimental.</translation>
</message>
@@ -4805,10 +4950,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La transaction est trop grosse</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossible d'allouer de la mémoire pour -maxsigcachesize : '%s' Mo</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Impossible de se lier à %s sur cet ordinateur (la liaison a retourné l’erreur %s)</translation>
</message>
@@ -4869,6 +5010,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Les nouvelles règles inconnues sont activées (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Une option non reconnue « %s » a été indiquée dans -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ga.ts b/src/qt/locale/bitcoin_ga.ts
index f6410b5cd5..1b7b9c0ec3 100644
--- a/src/qt/locale/bitcoin_ga.ts
+++ b/src/qt/locale/bitcoin_ga.ts
@@ -171,6 +171,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cuir isteach an sean pasfhrása agus an pasfhrása nua don sparán.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Leanúint ar aghaidh</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Ar ais</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Cuimhnigh nach dtugann chriptiú do sparán cosaint go hiomlán do do bitcoins ó bheith goidte ag bogearraí mailíseacha atá ag ionfhabhtú do ríomhaire.</translation>
</message>
@@ -414,7 +422,11 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<numerusform>%n bliain(/a)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">sparán réamhshocraithe</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -446,6 +458,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Maidir le %1</translation>
</message>
<message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Taispeáin faisnéis faoi %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">Maidir le &amp;Qt</translation>
</message>
@@ -454,6 +470,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Taispeáin faisnéis faoi Qt</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Mionathraigh roghanna cumraíochta do %1</translation>
+ </message>
+ <message>
<source>Create a new wallet</source>
<translation type="unfinished">Cruthaigh sparán nua</translation>
</message>
@@ -721,10 +741,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Masc na luachanna sa gcluaisín Forléargas</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Níl aon sparán ar fáil</translation>
</message>
@@ -1136,10 +1152,6 @@ Cruthóidh an próiseas imirce cúltaca den sparán roimh imirce. Ainmneofar an
<translation type="unfinished">Rabhadh oscail sparán</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Oscail Sparán</translation>
@@ -2280,6 +2292,14 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Líon naisc</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Seoltaí Ãitiúla</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Seoltaí líonra go bhfuil do nód Bitcoin úsáid faoi láthair chun cumarsáid a dhéanamh le nóid eile.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Blocshlabhra</translation>
</message>
@@ -2328,6 +2348,10 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Roghnaigh piara chun faisnéis mhionsonraithe a fheiceáil.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Folaigh Sonraí na bPiaraí</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Leagan na sraithe iompair: %1</translation>
</message>
@@ -2336,10 +2360,6 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Iompar</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Teaghrán ID an tseisiúin BIP324 i heicsidheachúlach, más ann dó.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Aitheantas an tseisiúin</translation>
</message>
@@ -2446,6 +2466,10 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Treo/Cineál</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">Teaghrán ID an tseisiúin BIP324 i heicsidheachúlach.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">An prótacal líonra a bhfuil an piara seo ceangailte trí: IPv4, IPv6, Oinniún, I2P, nó CJDNS.</translation>
</message>
@@ -2633,6 +2657,10 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Gníomhaíocht líonra díchumasaithe</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Faic</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ag rith ordú gan aon sparán</translation>
</message>
@@ -3355,8 +3383,8 @@ Nóta: Ós rud é go ríomhtar an táille ar bhonn in aghaidh an bheart, ní tha
<translation type="unfinished">&amp;Sínigh Teachtaireacht</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Féadfaidh tú teachtaireachtaí / comhaontuithe a shíniú le do sheoltaí chun a chruthú gur féidir leat bitcoins a sheoltear chucu a fháil. Bí cúramach gan aon rud doiléir nó randamach a shíniú, mar d’fhéadfadh ionsaithe fioscaireachta iarracht ar d’aitheantas a shíniú chucu. Ná sínigh ach ráitis lán-mhionsonraithe a aontaíonn tú leo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Is féidir leat teachtaireachtaí/comhaontuithe a shíniú le do sheoltaí oidhreachta (P2PKH) lena chruthú gur féidir leat bitcoins a sheoltar chucu a fháil. Bí cúramach gan aon rud doiléir nó randamach a shíniú, mar seans go ndéanfaidh ionsaithe fioscaireachta iarracht tú a mhealladh chun d'aitheantas a shíniú leo. Ná sínigh ach ráitis mhionsonraithe a n-aontaíonn tú leo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3443,10 +3471,6 @@ Nóta: Ós rud é go ríomhtar an táille ar bhonn in aghaidh an bheart, ní tha
<translation type="unfinished">Seiceáil an seoladh le do thoil agus triail arís.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Ní thagraíonn an seoladh a iontráladh d’eochair.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Cuireadh díghlasáil sparán ar ceal.</translation>
</message>
@@ -3918,6 +3942,10 @@ Nóta: Ós rud é go ríomhtar an táille ar bhonn in aghaidh an bheart, ní tha
<translation type="unfinished">Easpórtáil Rathúil</translation>
</message>
<message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">Sábháladh stair an idirbhirt go rathúil chuig %1.</translation>
+ </message>
+ <message>
<source>Range:</source>
<translation type="unfinished">Raon:</translation>
</message>
@@ -4013,9 +4041,8 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">IBSP cóipeáilte</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Cóipeáladh chuig an ngearrthaisce</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Cóipeáil PSBT bump táille chuig an ngearrthaisce</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4026,12 +4053,12 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níorbh fhéidir feidhmiú idirbheart</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Ní féidir an seoladh a thaispeáint</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Earráid sínitheora</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Ní féidir an seoladh a thaispeáint</translation>
</message>
</context>
<context>
@@ -4165,10 +4192,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níor soláthraíodh formáid comhaid sparán. Chun createfromdump a úsáid, ní mór -format=&lt;format&gt; a sholáthar.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Le do thoil seiceáil go bhfuil dáta agus am do ríomhaire ceart! Má tá do chlog mícheart, ní oibreoidh %s i gceart.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Tabhair le do thoil má fhaigheann tú %s úsáideach. Tabhair cuairt ar %s chun tuilleadh faisnéise a fháil faoin bogearraí.</translation>
</message>
@@ -4277,10 +4300,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Caithfidh -maxmempool a bheith ar a laghad %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Tharla earráid mharfach inmheánach, féach debug.log le haghaidh sonraí</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Ní féidir réiteach seoladh -%s: '%s'</translation>
</message>
@@ -4329,6 +4348,11 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Theip ar tháillí tuairte a ríomh, toisc go mbraitheann UTXOanna neamhdhearbhaithe ar bhraisle ollmhór idirbheart neamhdheimhnithe.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Theip ar bhaint an tsainstáit seat seat (%s). Bain de láimh é roimh atosú.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Theip ar an gcomhad peers.dat neamhbhailí a athainmniú. Bog nó scrios é agus bain triail eile as.</translation>
</message>
@@ -4337,6 +4361,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Theip ar mheastachán na dtáillí. Tá fallbackfee díchumasaithe. Fan cúpla bloc nó cumasaigh %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Theip ar chomhad blocála a shruthlú go diosca. Is dócha gur earráid I/O é seo.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Theip ar shruthlú an chomhaid chealaigh go diosca. Is dócha gur earráid I/O é seo.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Roghanna neamh-chomhoiriúnacha: -dnsseed=1 sonraíodh go sainráite, ach cuireann -onlynet cosc ​​ar naisc le IPv4/IPv6</translation>
</message>
@@ -4345,6 +4377,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Méid neamhbhailí le haghaidh %s=1: '%s' (ní mór an táille sealaíochta nóiméad de %s a bheith ann ar a laghad chun idirbhearta bhfostú a chosc)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Tá an t-uasmheáchan idirbhirt níos lú ná meáchan idirbhirt gan ionchuir</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Tá meáchan uasta idirbheart ró-íseal, ní féidir freastal ar aschur athraithe</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Naisc amach teoranta do CJDNS (-onlynet=cjdns) ach ní chuirtear -cjdnsreachable ar fáil</translation>
</message>
@@ -4361,6 +4401,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Tá naisc amach teoranta do i2p (-onlynet=i2p) ach ní chuirtear -i2psam ar fáil</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Theip ar athainmniú '%s' -&gt; '%s'. Ní féidir eolaire leveldb an tslabhra cúlra a ghlanadh.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Sáraíonn meascán na n-ionchur réamhroghnaithe agus an rogha ionchuir uathoibríoch sparán an t-uasmheáchan idirbhirt. Bain triail as méid níos lú a sheoladh nó UTXO do sparán a chomhdhlúthú de láimh</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">Sáraíonn méid an ionchuir an t-uasmheáchan. Bain triail as méid níos lú a sheoladh nó UTXO do sparán a chomhdhlúthú de láimh</translation>
</message>
@@ -4401,6 +4449,10 @@ Seans gur cruthaíodh an sparán ar leagan níos nuaí.
Bain triail as an leagan bogearraí is déanaí a rith.</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">Is cosúil go bhfuil dáta agus am do ríomhaire níos mó ná %d nóiméad as sioncronú leis an líonra, seans go dteipfidh ar chomhdhearcadh dá bharr. Tar éis duit clog do ríomhaire a dheimhniú, níor cheart go mbeadh an teachtaireacht seo le feiceáil a thuilleadh nuair a atosóidh tú do nód. Gan atosú, ba cheart go stopfadh sé ag taispeáint go huathoibríoch tar éis duit nasc a dhéanamh le líon imleor piaraí nua amach, a d'fhéadfadh roinnt ama a ghlacadh. Is féidir leat an réimse `timeoffset` de na modhanna RPC `getpeerinfo` agus `getnetworkinfo` a iniúchadh chun tuilleadh faisnéise a fháil.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4413,6 +4465,18 @@ Unable to restore backup of wallet.</source>
Ní féidir cúltaca an sparán a chur ar ais.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">ní féidir ceangaltán bán a úsáid ach amháin le haghaidh naisc isteach (ritheadh ​​​​"amach")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Tharla earráid mharfach inmheánach, féach debug.log le haghaidh sonraí:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Ní bhfuarthas sonraí Assumeutxo don bhlocshlabhra '%s' a tugadh.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Cuireadh isteach ar an bhfíorú blocála</translation>
</message>
@@ -4425,6 +4489,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Cóipcheart (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bloc truaillithe aimsithe a léirigh teip crua-earraí féideartha.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Braitheadh bunachar sonraí bloic truaillithe</translation>
</message>
@@ -4453,6 +4521,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Níl an comhad dumpála %s ann.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Teip seiceála sláintíochta cripteagrafaíochta cuar éilipseach. Tá %s ag múchadh.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Earráid agus db txn á dhéanamh chun idirbhearta sparán a bhaint</translation>
</message>
@@ -4601,10 +4673,22 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Earráid: ní féidir idirbheart bunachar sonraí a chur i gcrích le haghaidh sparán %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Theip ar nascadh an bhloc is fearr (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Theip ar dhínascadh an bhloc.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Theip ar éisteacht ar aon phort. Úsáid -listen=0 más é seo atá uait.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Theip ar léamh an bhloc.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Theip athscanadh ar an sparán le linn túsúchán</translation>
</message>
@@ -4617,6 +4701,22 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Theip ar fhíorú an mbunachar sonraí</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Theip ar scríobh an bhloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Theip ar scríobh chuig an mbunachar sonraí innéacs bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Theip ar scríobh chuig an mbunachar sonraí boinn.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Theip ar scríobh sonraí cealaigh.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Teip ag baint an idirbhirt: %s</translation>
</message>
@@ -4713,6 +4813,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Sparán á lódáil…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Caithfidh uasmheáchan an idirbhirt a bheith idir %d agus %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Méid ar iarraidh</translation>
</message>
@@ -4741,6 +4845,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Ní féidir ionchur réamhroghnaithe %s a réiteach</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Níor socraíodh ach treo, gan cead: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Ní féidir Bearradh a bheidh cumraithe le luach diúltach.</translation>
</message>
@@ -4785,6 +4893,18 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Ní aithnítear rannán [%s].</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Níor thug an sínitheoir macalla don seoladh</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">D'fhreagair an sínitheoir seoladh %s gan choinne</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Earráid faighte ag sínitheoir: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Theip ar síniú idirbheart</translation>
</message>
@@ -4813,6 +4933,18 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Snáitheanna líonra á dtosú…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Earráid chórais agus é á shruthlú: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Earráid chórais agus blocchomhad seachtrach á luchtú: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Earráid chórais agus an bloc á shábháil ar an diosca: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Tá an cód foinseach ar fáil ó %s.</translation>
</message>
@@ -4829,6 +4961,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Seachnóidh an sparán níos lú ná an táille athsheachadán íosta a íoc.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Níl aon Bhainisteoir ScriptPubKey ann don seoladh seo</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Is bogearraí turgnamhacha é seo.</translation>
</message>
@@ -4869,10 +5005,6 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Idirbheart ró-mhór</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Ní féidir cuimhne a leithdháileadh le haghaidh -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Ní féidir ceangal le %s ar an ríomhaire seo (thug ceangail earráid %s ar ais)</translation>
</message>
@@ -4933,6 +5065,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Rialacha nua anaithnid curtha i ngníomh (leagan giotán %ii)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Rogha neamhaitheanta "%s" curtha ar fáil i -test=1.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Leibhéal logála domhanda nach dtacaítear leis %s=%s. Luachanna bailí: %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ga_IE.ts b/src/qt/locale/bitcoin_ga_IE.ts
index 174907f094..4f6398d9ff 100644
--- a/src/qt/locale/bitcoin_ga_IE.ts
+++ b/src/qt/locale/bitcoin_ga_IE.ts
@@ -171,6 +171,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cuir isteach an sean pasfhrása agus an pasfhrása nua don sparán.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Leanúint ar aghaidh</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Ar ais</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Cuimhnigh nach dtugann chriptiú do sparán cosaint go hiomlán do do bitcoins ó bheith goidte ag bogearraí mailíseacha atá ag ionfhabhtú do ríomhaire.</translation>
</message>
@@ -422,7 +430,11 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<numerusform>%n bliain(/a)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">sparán réamhshocraithe</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -454,6 +466,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Maidir le %1</translation>
</message>
<message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Taispeáin faisnéis faoi %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">Maidir le &amp;Qt</translation>
</message>
@@ -462,6 +478,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Taispeáin faisnéis faoi Qt</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Mionathraigh roghanna cumraíochta do %1</translation>
+ </message>
+ <message>
<source>Create a new wallet</source>
<translation type="unfinished">Cruthaigh sparán nua</translation>
</message>
@@ -729,10 +749,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Masc na luachanna sa gcluaisín Forléargas</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Níl aon sparán ar fáil</translation>
</message>
@@ -1144,10 +1160,6 @@ Cruthóidh an próiseas imirce cúltaca den sparán roimh imirce. Ainmneofar an
<translation type="unfinished">Rabhadh oscail sparán</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Oscail Sparán</translation>
@@ -2288,6 +2300,14 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Líon naisc</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Seoltaí Ãitiúla</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Seoltaí líonra go bhfuil do nód Bitcoin úsáid faoi láthair chun cumarsáid a dhéanamh le nóid eile.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Blocshlabhra</translation>
</message>
@@ -2336,6 +2356,10 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Roghnaigh piara chun faisnéis mhionsonraithe a fheiceáil.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Folaigh Sonraí na bPiaraí</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Leagan na sraithe iompair: %1</translation>
</message>
@@ -2344,10 +2368,6 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Iompar</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Teaghrán ID an tseisiúin BIP324 i heicsidheachúlach, más ann dó.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Aitheantas an tseisiúin</translation>
</message>
@@ -2454,6 +2474,10 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Treo/Cineál</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">Teaghrán ID an tseisiúin BIP324 i heicsidheachúlach.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">An prótacal líonra a bhfuil an piara seo ceangailte trí: IPv4, IPv6, Oinniún, I2P, nó CJDNS.</translation>
</message>
@@ -2646,6 +2670,10 @@ Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir U
<translation type="unfinished">Gníomhaíocht líonra díchumasaithe</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Faic</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ag rith ordú gan aon sparán</translation>
</message>
@@ -3373,8 +3401,8 @@ Nóta: Ós rud é go ríomhtar an táille ar bhonn in aghaidh an bheart, ní tha
<translation type="unfinished">&amp;Sínigh Teachtaireacht</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Féadfaidh tú teachtaireachtaí / comhaontuithe a shíniú le do sheoltaí chun a chruthú gur féidir leat bitcoins a sheoltear chucu a fháil. Bí cúramach gan aon rud doiléir nó randamach a shíniú, mar d’fhéadfadh ionsaithe fioscaireachta iarracht ar d’aitheantas a shíniú chucu. Ná sínigh ach ráitis lán-mhionsonraithe a aontaíonn tú leo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Is féidir leat teachtaireachtaí/comhaontuithe a shíniú le do sheoltaí oidhreachta (P2PKH) lena chruthú gur féidir leat bitcoins a sheoltar chucu a fháil. Bí cúramach gan aon rud doiléir nó randamach a shíniú, mar seans go ndéanfaidh ionsaithe fioscaireachta iarracht tú a mhealladh chun d'aitheantas a shíniú leo. Ná sínigh ach ráitis mhionsonraithe a n-aontaíonn tú leo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3461,8 +3489,8 @@ Nóta: Ós rud é go ríomhtar an táille ar bhonn in aghaidh an bheart, ní tha
<translation type="unfinished">Seiceáil an seoladh le do thoil agus triail arís.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Ní thagraíonn an seoladh a iontráladh d’eochair.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">Ní thagraíonn an seoladh isteach d'eochair leagáide (P2PKH). Ní thacaítear le síniú teachtaireachta do SegWit agus cineálacha seoltaí eile nach P2PKH iad sa leagan seo de %1. Seiceáil an seoladh agus bain triail eile as.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3936,6 +3964,10 @@ Nóta: Ós rud é go ríomhtar an táille ar bhonn in aghaidh an bheart, ní tha
<translation type="unfinished">Easpórtáil Rathúil</translation>
</message>
<message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">Sábháladh stair an idirbhirt go rathúil chuig %1.</translation>
+ </message>
+ <message>
<source>Range:</source>
<translation type="unfinished">Raon:</translation>
</message>
@@ -4031,9 +4063,8 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">IBSP cóipeáilte</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Cóipeáladh chuig an ngearrthaisce</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Cóipeáil PSBT bump táille chuig an ngearrthaisce</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4044,12 +4075,12 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níorbh fhéidir feidhmiú idirbheart</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Ní féidir an seoladh a thaispeáint</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Earráid sínitheora</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Ní féidir an seoladh a thaispeáint</translation>
</message>
</context>
<context>
@@ -4183,10 +4214,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níor soláthraíodh formáid comhaid sparán. Chun createfromdump a úsáid, ní mór -format=&lt;format&gt; a sholáthar.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Le do thoil seiceáil go bhfuil dáta agus am do ríomhaire ceart! Má tá do chlog mícheart, ní oibreoidh %s i gceart.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Tabhair le do thoil má fhaigheann tú %s úsáideach. Tabhair cuairt ar %s chun tuilleadh faisnéise a fháil faoin bogearraí.</translation>
</message>
@@ -4295,10 +4322,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Caithfidh -maxmempool a bheith ar a laghad %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Tharla earráid mharfach inmheánach, féach debug.log le haghaidh sonraí</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Ní féidir réiteach seoladh -%s: '%s'</translation>
</message>
@@ -4347,6 +4370,12 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Theip ar tháillí tuairte a ríomh, toisc go mbraitheann UTXOanna neamhdhearbhaithe ar bhraisle ollmhór idirbheart neamhdheimhnithe.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Theip ar bhaint an tsainstáit seat seat (%s). Bain de láimh é roimh atosú.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Theip ar an gcomhad peers.dat neamhbhailí a athainmniú. Bog nó scrios é agus bain triail eile as.</translation>
</message>
@@ -4355,6 +4384,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Theip ar mheastachán na dtáillí. Tá fallbackfee díchumasaithe. Fan cúpla bloc nó cumasaigh %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Theip ar chomhad blocála a shruthlú go diosca. Is dócha gur earráid I/O é seo.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Theip ar shruthlú an chomhaid chealaigh go diosca. Is dócha gur earráid I/O é seo.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Roghanna neamh-chomhoiriúnacha: -dnsseed=1 sonraíodh go sainráite, ach cuireann -onlynet cosc ​​ar naisc le IPv4/IPv6</translation>
</message>
@@ -4363,6 +4400,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Méid neamhbhailí le haghaidh %s=&lt;amount&gt;: '%s' (ní mór an táille sealaíochta nóiméad de %s a bheith ann ar a laghad chun idirbhearta bhfostú a chosc)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Tá an t-uasmheáchan idirbhirt níos lú ná meáchan idirbhirt gan ionchuir</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Tá meáchan uasta idirbheart ró-íseal, ní féidir freastal ar aschur athraithe</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Naisc amach teoranta do CJDNS (-onlynet=cjdns) ach ní chuirtear -cjdnsreachable ar fáil</translation>
</message>
@@ -4379,6 +4424,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Tá naisc amach teoranta do i2p (-onlynet=i2p) ach ní chuirtear -i2psam ar fáil</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Theip ar athainmniú '%s' -&gt; '%s'. Ní féidir eolaire leveldb an tslabhra cúlra a ghlanadh.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Sáraíonn meascán na n-ionchur réamhroghnaithe agus an rogha ionchuir uathoibríoch sparán an t-uasmheáchan idirbhirt. Bain triail as méid níos lú a sheoladh nó UTXO do sparán a chomhdhlúthú de láimh</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">Sáraíonn méid an ionchuir an t-uasmheáchan. Bain triail as méid níos lú a sheoladh nó UTXO do sparán a chomhdhlúthú de láimh</translation>
</message>
@@ -4421,6 +4474,10 @@ Bain triail as an leagan bogearraí is déanaí a rith.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">Is cosúil go bhfuil dáta agus am do ríomhaire níos mó ná %d nóiméad as sioncronú leis an líonra, seans go dteipfidh ar chomhdhearcadh dá bharr. Tar éis duit clog do ríomhaire a dheimhniú, níor cheart go mbeadh an teachtaireacht seo le feiceáil a thuilleadh nuair a atosóidh tú do nód. Gan atosú, ba cheart go stopfadh sé ag taispeáint go huathoibríoch tar éis duit nasc a dhéanamh le líon imleor piaraí nua amach, a d'fhéadfadh roinnt ama a ghlacadh. Is féidir leat an réimse `timeoffset` de na modhanna RPC `getpeerinfo` agus `getnetworkinfo` a iniúchadh chun tuilleadh faisnéise a fháil.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4433,6 +4490,18 @@ Unable to restore backup of wallet.</source>
Ní féidir cúltaca an sparán a chur ar ais.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">ní féidir ceangaltán bán a úsáid ach amháin le haghaidh naisc isteach (ritheadh ​​​​"amach")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Tharla earráid mharfach inmheánach, féach debug.log le haghaidh sonraí:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Ní bhfuarthas sonraí Assumeutxo don bhlocshlabhra '%s' a tugadh.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Cuireadh isteach ar an bhfíorú blocála</translation>
</message>
@@ -4445,6 +4514,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Cóipcheart (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bloc truaillithe aimsithe a léirigh teip crua-earraí féideartha.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Braitheadh bunachar sonraí bloic truaillithe</translation>
</message>
@@ -4473,6 +4546,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Níl an comhad dumpála %s ann.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Teip seiceála sláintíochta cripteagrafaíochta cuar éilipseach. Tá %s ag múchadh.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Earráid agus db txn á dhéanamh chun idirbhearta sparán a bhaint</translation>
</message>
@@ -4621,10 +4698,22 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Earráid: ní féidir idirbheart bunachar sonraí a chur i gcrích le haghaidh sparán %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Theip ar nascadh an bhloc is fearr (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Theip ar dhínascadh an bhloc.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Theip ar éisteacht ar aon phort. Úsáid -listen=0 más é seo atá uait.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Theip ar léamh an bhloc.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Theip athscanadh ar an sparán le linn túsúchán</translation>
</message>
@@ -4637,6 +4726,22 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Theip ar fhíorú an mbunachar sonraí</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Theip ar scríobh an bhloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Theip ar scríobh chuig an mbunachar sonraí innéacs bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Theip ar scríobh chuig an mbunachar sonraí boinn.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Theip ar scríobh sonraí cealaigh.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Teip ag baint an idirbhirt: %s</translation>
</message>
@@ -4733,6 +4838,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Sparán á lódáil…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Caithfidh uasmheáchan an idirbhirt a bheith idir %d agus %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Méid ar iarraidh</translation>
</message>
@@ -4761,6 +4870,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Ní féidir ionchur réamhroghnaithe %s a réiteach</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Níor socraíodh ach treo, gan cead: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Ní féidir Bearradh a bheidh cumraithe le luach diúltach.</translation>
</message>
@@ -4805,6 +4918,18 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Ní aithnítear rannán [%s].</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Níor thug an sínitheoir macalla don seoladh</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">D'fhreagair an sínitheoir seoladh %s gan choinne</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Earráid faighte ag sínitheoir: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Theip ar síniú idirbheart</translation>
</message>
@@ -4833,6 +4958,18 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Snáitheanna líonra á dtosú…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Earráid chórais agus é á shruthlú: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Earráid chórais agus blocchomhad seachtrach á luchtú: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Earráid chórais agus an bloc á shábháil ar an diosca: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Tá an cód foinseach ar fáil ó %s.</translation>
</message>
@@ -4849,6 +4986,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Seachnóidh an sparán níos lú ná an táille athsheachadán íosta a íoc.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Níl aon Bhainisteoir ScriptPubKey ann don seoladh seo</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Is bogearraí turgnamhacha é seo.</translation>
</message>
@@ -4889,10 +5030,6 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Idirbheart ró-mhór</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Ní féidir cuimhne a leithdháileadh le haghaidh -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Ní féidir ceangal le %s ar an ríomhaire seo (thug ceangail earráid %s ar ais)</translation>
</message>
@@ -4953,6 +5090,10 @@ Ní féidir cúltaca an sparán a chur ar ais.</translation>
<translation type="unfinished">Rialacha nua anaithnid curtha i ngníomh (leagan giotán %ii)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Rogha neamhaitheanta "%s" curtha ar fáil i -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Leibhéal logála domhanda nach dtacaítear leis %s=%s. Luachanna bailí: %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_gl.ts b/src/qt/locale/bitcoin_gl.ts
index 03319ecabf..53e038ecd0 100644
--- a/src/qt/locale/bitcoin_gl.ts
+++ b/src/qt/locale/bitcoin_gl.ts
@@ -184,6 +184,10 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Introduce a frase contrasinal anterior mais a nova frase contrasinal para a carteira.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recorda que encriptar a tua carteira non protexe completamente que os teus bitcoins poidan ser roubados por malware que afecte ó teu computador.</translation>
</message>
@@ -334,7 +338,11 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">moedeiro por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -558,10 +566,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Mostra a %1 mensaxe de axuda para obter unha lista cas posibles opcións de línea de comando de Bitcoin </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">moedeiro por defecto</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Non hai moedeiros dispoñíbeis</translation>
</message>
@@ -793,10 +797,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">moedeiro por defecto</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir Moedeiro</translation>
@@ -1652,10 +1652,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Por favor comproba a dirección e proba de novo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">A dirección introducida non se refire a ninguna clave.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Cancelouse o desbloqueo do moedeiro.</translation>
</message>
@@ -1999,11 +1995,7 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<source>Send Coins</source>
<translation type="unfinished">Moedas Enviadas</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">moedeiro por defecto</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_gl_ES.ts b/src/qt/locale/bitcoin_gl_ES.ts
index a6c022038d..47951fa6f2 100644
--- a/src/qt/locale/bitcoin_gl_ES.ts
+++ b/src/qt/locale/bitcoin_gl_ES.ts
@@ -2,10 +2,6 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Fai Click co botón dereito para editar o enderezo ou etiqueta</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation type="unfinished">Crea un novo enderezo</translation>
</message>
@@ -94,6 +90,14 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Houbo un erro tentando gardar a lista de enderezos en %1. Por favor proba de novo.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Enviando enderezos - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recibindo enderezos - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exportación Fallida</translation>
</message>
@@ -172,6 +176,10 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Introduce a frase contrasinal anterior mais a nova frase contrasinal para a carteira.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Recorda que encriptar a tua carteira non protexe completamente que os teus bitcoins poidan ser roubados por malware que afecte ó teu computador.</translation>
</message>
@@ -246,6 +254,10 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">O ficheiro de configuración %1 pode estar danado ou non válido.</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">Excepción de fuga</translation>
</message>
@@ -265,6 +277,10 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<context>
<name>QObject</name>
<message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 aínda non saíu con seguridade...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Cantidade</translation>
</message>
@@ -310,7 +326,11 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Carteira por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -530,10 +550,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Mostra a %1 mensaxe de axuda para obter unha lista cas posibles opcións de línea de comando de Bitcoin </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Carteira por defecto</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Non hai carteiras dispoñibles</translation>
</message>
@@ -765,10 +781,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Carteira por defecto</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir carteira</translation>
@@ -1135,13 +1147,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Carteira por defecto</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_gu.ts b/src/qt/locale/bitcoin_gu.ts
index 6bf04dc5d1..146b9e2e24 100644
--- a/src/qt/locale/bitcoin_gu.ts
+++ b/src/qt/locale/bitcoin_gu.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">નવà«àª‚</translation>
+ <translation type="unfinished">&amp; નવà«àª‚</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -177,13 +177,17 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">વૉલેટ માટે નવો પાસફà«àª°à«‡àª દાખલ કરો. 1 કૃપા કરીને 2 દસ અથવા વધૠઅજાનà«àª¯àª¾ અકà«àª·àª°à«‹ 2 અથવા 3 આઠ અથવા વધૠશબà«àª¦à«‹àª¨àª¾ પાસફà«àª°à«‡àªàª¨à«‹ ઉપયોગ કરો 3 .</translation>
+ <translation type="unfinished">વૉલેટ માટે નવો પાસફà«àª°à«‡àª દાખલ કરો. &lt;br&gt; કૃપા કરીને &lt;b&gt; દસ અથવા વધૠઅજાનà«àª¯àª¾ અકà«àª·àª°à«‹ &lt;/2&gt; અથવા &lt;b&gt; આઠ અથવા વધૠશબà«àª¦à«‹àª¨àª¾ પાસફà«àª°à«‡àªàª¨à«‹ ઉપયોગ કરો &lt;/b&gt; .</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
<translation type="unfinished">પાકીટ માટે જà«àª¨àª¾ શબà«àª¦àª¸àª®à«‚હ અને નવા શબà«àª¦àª¸àª®à«‚હ દાખલ કરો.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">ચાલૠરાખો</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">યાદ રાખો કે તમારા વૉલેટને àªàª¨à«àª•à«àª°àª¿àªªà«àªŸ કરવાથી તમારા કમà«àªªà«àª¯à«àªŸàª°àª¨à«‡ સંકà«àª°àª®àª¿àª¤ કરતા માલવેર દà«àªµàª¾àª°àª¾ ચોરાઈ જવાથી તમારા બિટકોઈનને સંપૂરà«àª£àªªàª£à«‡ સà«àª°àª•à«àª·àª¿àª¤ કરી શકાશે નહીં.</translation>
</message>
@@ -217,7 +221,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">વૉલેટ અનલૉક નિષà«àª«àª³ થયà«àª‚</translation>
+ <translation type="unfinished">વૉલેટ ખોલવૠનિષà«àª«àª³ થયà«àª‚</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
@@ -228,6 +232,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">વૉલેટ ડિકà«àª°àª¿àªªà«àª¶àª¨ માટે દાખલ કરેલ પાસફà«àª°à«‡àª ખોટો છે. તેમાં નલ અકà«àª·àª° (àªàªŸàª²à«‡ ​​કે - શૂનà«àª¯ બાઈટ) છે. જો પાસફà«àª°à«‡àª 25.0 પહેલા આ સૉફà«àªŸàªµà«‡àª°àª¨àª¾ સંસà«àª•àª°àª£ સાથે સેટ કરવામાં આવà«àª¯à«‹ હોય, તો કૃપા કરીને ફકà«àª¤ પà«àª°àª¥àª® શૂનà«àª¯ અકà«àª·àª° સà«àª§à«€àª¨àª¾ અકà«àª·àª°à«‹ સાથે ફરી પà«àª°àª¯àª¾àª¸ કરો — પરંતૠતેમાં શામેલ નથી. જો આ સફળ થાય, તો ભવિષà«àª¯àª®àª¾àª‚ આ સમસà«àª¯àª¾àª¨à«‡ ટાળવા માટે કૃપા કરીને નવો પાસફà«àª°à«‡àª સેટ કરો.</translation>
</message>
<message>
+ <source>Wallet passphrase was successfully changed.</source>
+ <translation type="unfinished">વૉલેટ પાસફà«àª°à«‡àª સફળતાપૂરà«àªµàª• બદલવામાં આવà«àª¯à«‹</translation>
+ </message>
+ <message>
<source>Passphrase change failed</source>
<translation type="unfinished">પાસફà«àª°à«‡àª ફેરફાર નિષà«àª«àª³ ગયો</translation>
</message>
@@ -237,7 +245,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">ચેતવણી: ( Caps Lock ) કી ચાલૠછે!</translation>
+ <translation type="unfinished">ચેતવણી: કેપà«àª¸àª²à«‹àª• કી ચાલૠછે!</translation>
</message>
</context>
<context>
@@ -413,7 +421,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">મૂળભૂત વૉલેટ</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -727,10 +739,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">વિહંગાવલોકન ટેબમાં મૂલà«àª¯à«‹àª¨à«‡ માસà«àª• કરો</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">મૂળભૂત વૉલેટ</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">કોઈ પાકીટ ઉપલબà«àª§ નથી</translation>
</message>
@@ -896,6 +904,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>UnitDisplayStatusBarControl</name>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation type="unfinished">રકમ બતાવવા માટે àªàª•àª®. અનà«àª¯ àªàª•àª® પસંદ કરવા માટે કà«àª²àª¿àª• કરો.</translation>
+ </message>
+</context>
+<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
@@ -927,15 +942,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(un)select all</source>
- <translation type="unfinished">બધા (na)પસંદ કરો</translation>
+ <translation type="unfinished">બધા (ના)પસંદ કરો</translation>
</message>
<message>
<source>Tree mode</source>
- <translation type="unfinished">ટà«àª°à«€ મોડ</translation>
+ <translation type="unfinished">ટà«àª°à«€ પદà«àª§àª¤àª¿</translation>
</message>
<message>
<source>List mode</source>
- <translation type="unfinished">સૂચિ મોડ</translation>
+ <translation type="unfinished">સૂચિ પદà«àª§àª¤àª¿</translation>
</message>
<message>
<source>Amount</source>
@@ -971,7 +986,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">કૉપિ કરો &amp;લેબલ બનાવો</translation>
+ <translation type="unfinished">કૉપિ કરો &amp;લેબલ</translation>
</message>
<message>
<source>Copy &amp;amount</source>
@@ -1069,7 +1084,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Loading wallets…</source>
<extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">પાકીટ લોડ કરી રહà«àª¯à«àª‚ છે...</translation>
+ <translation type="unfinished">પાકીટ લોડ થઈ રહà«àª¯à«àª‚ છે...</translation>
</message>
</context>
<context>
@@ -1134,10 +1149,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">ઓપન વૉલેટ ચેતવણી</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">ડિફૉલà«àªŸ વૉલેટ</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">વૉલેટ ખોલો</translation>
@@ -1433,6 +1444,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">જીબી (GB)</translation>
</message>
<message>
+ <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
+ <translation type="unfinished">આ પà«àª°àª¾àª°àª‚ભિક સિંકà«àª°àª¨àª¾àª‡àªà«‡àª¶àª¨ ખૂબ જ માગણી કરે છે, અને તમારા કમà«àªªà«àª¯à«àªŸàª° સાથેની હારà«àª¡àªµà«‡àª° સમસà«àª¯àª¾àª“નો પરà«àª¦àª¾àª«àª¾àª¶ કરી શકે છે જે અગાઉ કોઈનà«àª‚ ધà«àª¯àª¾àª¨ ગયà«àª‚ ન હતà«àª‚. દરેક વખતે જà«àª¯àª¾àª°à«‡ તમે ચાલૠકરો %1, તà«àª¯àª¾àª°à«‡ તે ડાઉનલોડ કરવાનà«àª‚ ચાલૠરાખશે જà«àª¯àª¾àª‚થી તેણે છોડà«àª¯à«àª‚ હતà«àª‚.</translation>
+ </message>
+ <message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
<translation type="unfinished">જà«àª¯àª¾àª°à«‡ તમે ઓકે કà«àª²àª¿àª• કરો છો,%1સંપૂરà«àª£ ડાઉનલોડ અને પà«àª°àª•à«àª°àª¿àª¯àª¾ કરવાનà«àª‚ શરૂ કરશે%4બà«àª²à«‹àª• ચેન (સાંકળ) (%2GB) માં સૌથી પહેલાના વà«àª¯àªµàª¹àª¾àª°à«‹àª¥à«€ શરૂ થાય છે%3જà«àª¯àª¾àª°à«‡%4શરૂઆતમાં લોનà«àªš કરà«àª¯à«àª‚.</translation>
</message>
@@ -1503,7 +1518,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">છેલà«àª²à«‹ બà«àª²à«‹àª• નો સમય</translation>
+ <translation type="unfinished">છેલà«àª²àª¾ બà«àª²à«‹àª• નો સમય</translation>
</message>
<message>
<source>Progress</source>
@@ -2351,10 +2366,6 @@ BIP70 માં વà«àª¯àª¾àªªàª• સà«àª°àª•à«àª·àª¾ ખામીઓને à
<translation type="unfinished">પરિવહન</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">હેકà«àª¸àª®àª¾àª‚ BIP324 સતà«àª° ID સà«àªŸà«àª°àª¿àª‚ગ, જો કોઈ હોય તો.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">પà«àª°àª•à«àª°àª¿àª¯àª¾ નંબર</translation>
</message>
@@ -2523,7 +2534,7 @@ BIP70 માં વà«àª¯àª¾àªªàª• સà«àª°àª•à«àª·àª¾ ખામીઓને à
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">છેલà«àª²à«‹ બà«àª²à«‹àª• નો સમય</translation>
+ <translation type="unfinished">છેલà«àª²àª¾ બà«àª²à«‹àª• નો સમય</translation>
</message>
<message>
<source>Inbound: initiated by peer</source>
@@ -2641,6 +2652,10 @@ BIP70 માં વà«àª¯àª¾àªªàª• સà«àª°àª•à«àª·àª¾ ખામીઓને à
<translation type="unfinished">નેટવરà«àª• પà«àª°àªµà«ƒàª¤à«àª¤àª¿ અકà«àª·àª® છે</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">કોઈ નહિ</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">કોઈપણ વૉલેટ વિના આદેશનો અમલ</translation>
</message>
@@ -2807,7 +2822,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">કૉપિ કરો &amp;લેબલ બનાવો</translation>
+ <translation type="unfinished">કૉપિ કરો &amp;લેબલ</translation>
</message>
<message>
<source>Copy &amp;message</source>
@@ -2850,7 +2865,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Copy &amp;URI</source>
- <translation type="unfinished">&amp;URI કૉપિ કરો</translation>
+ <translation type="unfinished">કૉપિ &amp;URI </translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -3038,7 +3053,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">કૉપિ કરો &amp;લેબલ બનાવો</translation>
+ <translation type="unfinished">કૉપિ કરો &amp;લેબલ</translation>
</message>
<message>
<source>Copy &amp;amount</source>
@@ -3086,13 +3101,6 @@ For more information on using this console, type %6.
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">ડિફૉલà«àªŸ વૉલેટ</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_hak.ts b/src/qt/locale/bitcoin_hak.ts
index ca7723785c..4ad802e718 100644
--- a/src/qt/locale/bitcoin_hak.ts
+++ b/src/qt/locale/bitcoin_hak.ts
@@ -10,10 +10,6 @@
<translation type="unfinished">新增一個ä½å€</translation>
</message>
<message>
- <source>&amp;New</source>
- <translation type="unfinished">新增 &amp;N</translation>
- </message>
- <message>
<source>Copy the currently selected address to the system clipboard</source>
<translation type="unfinished">把目å‰é€‰æ‹©çš„地å€å¤åˆ¶åˆ°ç³»ç»Ÿç²˜è´´æ¿ä¸­</translation>
</message>
@@ -179,6 +175,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">請記得, å³ä½¿å°‡éŒ¢åŒ…加密, 也ä¸èƒ½å®Œå…¨é˜²æ­¢å› æƒ¡æ„軟體入侵, 而導致ä½å…ƒå¹£è¢«å·.</translation>
</message>
@@ -261,6 +265,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未æ•èŽ·çš„异常</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">發生致命錯誤。 %1無法å†ç¹¼çºŒå®‰å…¨åœ°é‹è¡Œä¸¦é›¢é–‹ã€‚</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">內部錯誤</translation>
</message>
@@ -432,7 +440,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -510,7 +518,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -521,16 +529,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">接收(&amp;R)</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">选项(&amp;O)</translation>
- </message>
- <message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">加密钱包(&amp;E)</translation>
- </message>
- <message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">把你钱包中的ç§é’¥åŠ å¯†</translation>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -541,22 +541,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">修改密ç (&amp;C)</translation>
</message>
<message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">ç­¾å消æ¯(&amp;M)</translation>
- </message>
- <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">用比特å¸åœ°å€å…³è”çš„ç§é’¥ä¸ºæ¶ˆæ¯ç­¾å,以è¯æ˜Žæ‚¨æ‹¥æœ‰è¿™ä¸ªæ¯”特å¸åœ°å€</translation>
</message>
<message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">验è¯æ¶ˆæ¯(&amp;V)</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">校验消æ¯ï¼Œç¡®ä¿è¯¥æ¶ˆæ¯æ˜¯ç”±æŒ‡å®šçš„比特å¸åœ°å€æ‰€æœ‰è€…ç­¾åçš„</translation>
- </message>
- <message>
<source>&amp;Load PSBT from file…</source>
<translation type="unfinished">从文件加载PSBT(&amp;L)...</translation>
</message>
@@ -573,32 +561,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">创建钱包...</translation>
</message>
<message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">关闭所有钱包...</translation>
- </message>
- <message>
<source>&amp;File</source>
- <translation type="unfinished">文件(&amp;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <translation type="unfinished">&amp;說明</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">标签页工具æ </translation>
- </message>
- <message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">åŒæ­¥åŒºå—头 (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">与网络åŒæ­¥...</translation>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -610,7 +586,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">连到åŒè¡Œ...</translation>
+ <translation type="unfinished">连接到节点...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -640,15 +616,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">赶上...</translation>
+ <translation type="unfinished">正在追上进度...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -734,7 +710,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示 %1 帮助信æ¯ï¼ŒèŽ·å–å¯ç”¨å‘½ä»¤è¡Œé€‰é¡¹åˆ—表</translation>
+ <translation type="unfinished">显示%1帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -745,10 +721,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">在“概况â€æ ‡ç­¾é¡µä¸­ä¸æ˜Žæ–‡æ˜¾ç¤ºæ•°å€¼ã€åªæ˜¾ç¤ºæŽ©ç </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -786,15 +758,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">éšè—(&amp;H)</translation>
+ <translation type="unfinished">&amp;躲</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -806,26 +778,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">点击查看更多æ“作。</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">显示节点标签</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">ç¦ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">點擊查看更多æ“作</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">å¯ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">關閉網路紀錄</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">é å…ˆåŒæ­¥æ¨™é ­(%1%)</translation>
+ <translation type="unfinished">预åŒæ­¥åŒºå—头 (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -927,11 +889,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -946,14 +908,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">計費後金é¡:</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">找零:</translation>
- </message>
- <message>
- <source>(un)select all</source>
- <translation type="unfinished">å…¨(ä¸)选</translation>
- </message>
- <message>
<source>Tree mode</source>
<translation type="unfinished">树状模å¼</translation>
</message>
@@ -966,22 +920,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金é¢</translation>
</message>
<message>
- <source>Received with label</source>
- <translation type="unfinished">收款标签</translation>
- </message>
- <message>
<source>Received with address</source>
<translation type="unfinished">收款地å€</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">日期</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
- </message>
- <message>
<source>Copy amount</source>
<translation type="unfinished">å¤åˆ¶é‡‘é¢</translation>
</message>
@@ -1006,10 +948,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">é”定未花费(&amp;O)</translation>
</message>
<message>
- <source>&amp;Unlock unspent</source>
- <translation type="unfinished">解é”未花费(&amp;U)</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">å¤åˆ¶æ•°ç›®</translation>
</message>
@@ -1045,11 +983,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1141,10 +1075,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
@@ -1194,7 +1124,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1245,7 +1175,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
</context>
<context>
@@ -1284,7 +1214,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">地å€â€œ%1â€å·²ç»å­˜åœ¨ï¼Œå®ƒæ˜¯ä¸€ä¸ªæ”¶æ¬¾åœ°å€ï¼Œæ ‡ç­¾ä¸ºâ€œ%2â€ï¼Œæ‰€ä»¥å®ƒä¸èƒ½ä½œä¸ºä¸€ä¸ªä»˜æ¬¾åœ°å€è¢«æ·»åŠ è¿›æ¥ã€‚</translation>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1307,7 +1237,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1315,7 +1245,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1352,7 +1282,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1383,7 +1313,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <translation type="unfinished">歡迎來到 %1。</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
@@ -1391,7 +1321,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">å–消此设置需è¦é‡æ–°ä¸‹è½½æ•´ä¸ªåŒºå—链。先完整下载整æ¡é“¾å†è¿›è¡Œä¿®å‰ªä¼šæ›´å¿«ã€‚这会ç¦ç”¨ä¸€äº›é«˜çº§åŠŸèƒ½ã€‚</translation>
+ <translation type="unfinished">æ¢å¾©æ­¤è¨­å®šéœ€è¦é‡æ–°ä¸‹è¼‰æ•´å€‹å€å¡Šéˆã€‚ 先下載完整éˆç„¶å¾Œå†ä¿®å‰ªå®ƒçš„速度更快。 ç¦ç”¨ä¸€äº›é«˜ç´šåŠŸèƒ½ã€‚</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
@@ -1437,7 +1367,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1448,15 +1378,15 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">近期交易å¯èƒ½å°šæœªæ˜¾ç¤ºï¼Œå› æ­¤å½“å‰ä½™é¢å¯èƒ½ä¸å‡†ç¡®ã€‚以上信æ¯å°†åœ¨ä¸Žæ¯”特å¸ç½‘络完全åŒæ­¥åŽæ›´æ­£ã€‚详情如下</translation>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">å°è¯•ä½¿ç”¨å—未å¯è§äº¤æ˜“å½±å“çš„ä½™é¢å°†ä¸è¢«ç½‘络接å—。</translation>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1468,7 +1398,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1480,7 +1410,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1508,7 +1438,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Paste address from clipboard</source>
<extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
</context>
<context>
@@ -1519,11 +1449,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1535,11 +1465,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
@@ -2290,10 +2220,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">传输</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID,如果有的è¯ã€‚</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">会è¯ID</translation>
</message>
@@ -2400,6 +2326,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">这个节点是通过这ç§ç½‘络å议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2462,7 +2392,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>&amp;Open</source>
@@ -2568,7 +2498,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2592,6 +2522,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2627,7 +2561,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2817,11 +2751,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2959,7 +2893,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2973,9 +2907,9 @@ For more information on using this console, type %6.
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">指定交易虚拟大å°çš„æ¯kB (1,000字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–50è°çš„手續費。</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
@@ -3090,6 +3024,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">部分签å交易(二进制)</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3098,6 +3036,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ä½ å¯ä»¥ä¹‹å¾Œå†æ高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">請檢查您的交易æ案。這將產生部分簽å的比特幣交易(PSBT),您å¯ä»¥å„²å­˜æˆ–複製該交易,然後使用簽å。離線%1錢包或與PSBT相容的硬體錢包。</translation>
+ </message>
+ <message>
<source>%1 from wallet '%2'</source>
<translation type="unfinished">%1 æ¥è‡ªé’±åŒ… “%2â€</translation>
</message>
@@ -3229,7 +3172,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3286,10 +3229,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">簽署訊æ¯(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ä½¿ç”¨æ‚¨çš„地å€ç°½å訊æ¯/å”議,以證明您å¯ä»¥æŽ¥æ”¶ç™¼é€çµ¦ä»–們的比特幣。但是請å°å¿ƒï¼Œä¸è¦ç°½å語æ„å«ç³Šä¸æ¸…,或隨機產生的內容,因為釣魚å¼è©é¨™å¯èƒ½æœƒç”¨é¨™ä½ ç°½å的手法來冒充是你。åªæœ‰ç°½å您åŒæ„的詳細內容。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用æ¥å¯¹æ¶ˆæ¯ç­¾å的地å€</translation>
</message>
@@ -3299,7 +3238,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3374,10 +3313,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请检查地å€åŽé‡è¯•ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">找ä¸åˆ°ä¸Žè¾“入地å€ç›¸å…³çš„密钥。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">å·²å–消解é”钱包。</translation>
</message>
@@ -3430,6 +3365,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3808,7 +3750,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3946,11 +3888,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT已複製</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">å¤åˆ¶åˆ°å‰ªè´´æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">沒辦法簽署交易。</translation>
</message>
@@ -3960,11 +3897,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't display address</source>
- <translation type="unfinished">無法顯示地å€</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <translation type="unfinished">無法顯示錢包ä½å€</translation>
</message>
</context>
<context>
@@ -4014,6 +3947,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%sæ壞。嘗試使用錢包工具bitcoin-wallet挽救或還原備份。</translation>
+ </message>
+ <message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<translation type="unfinished">%s éªŒè¯ -assumeutxo 快照状æ€å¤±è´¥ã€‚这表明硬件å¯èƒ½æœ‰é—®é¢˜ï¼Œä¹Ÿå¯èƒ½æ˜¯è½¯ä»¶bug,或者还å¯èƒ½æ˜¯è½¯ä»¶è¢«ä¸å½“修改ã€ä»Žè€Œè®©éžæ³•å¿«ç…§ä¹Ÿèƒ½å¤Ÿè¢«åŠ è½½ã€‚因此,将关闭节点并åœæ­¢ä½¿ç”¨ä»Žè¿™ä¸ªå¿«ç…§æž„建出的任何状æ€ï¼Œå¹¶å°†é“¾é«˜åº¦ä»Ž %d é‡ç½®åˆ° %d 。下次å¯åŠ¨æ—¶ï¼ŒèŠ‚点将会ä¸ä½¿ç”¨å¿«ç…§æ•°æ®ä»Ž %d 继续åŒæ­¥ã€‚请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状æ€å¿«ç…§ä»è¢«ä¿å­˜è‡³ç£ç›˜ä¸Šï¼Œä»¥ä¾›è¯Šæ–­é—®é¢˜çš„原因。</translation>
</message>
@@ -4027,7 +3964,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <translation type="unfinished">無法在資料目錄上ç²å–鎖定%s。%så¯èƒ½å·²ç¶“在é‹è¡Œäº†ã€‚</translation>
</message>
<message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
@@ -4055,7 +3992,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ <translation type="unfinished">
+錯誤:轉存檔案識別記錄ä¸æ­£ç¢ºã€‚ç²å¾—%s,é æœŸ
+%s。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
@@ -4094,10 +4033,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">没有æ供钱包格å¼ã€‚è¦ä½¿ç”¨ createfromdump ,必须æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">请检查电脑的日期时间设置是å¦æ­£ç¡®ï¼æ—¶é—´é”™è¯¯å¯èƒ½ä¼šå¯¼è‡´ %s è¿è¡Œå¼‚常。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你认为%s对你比较有用的è¯ï¼Œè¯·å¯¹æˆ‘们进行一些自愿贡献。请访问%s网站æ¥èŽ·å–有关这个软件的更多信æ¯ã€‚</translation>
</message>
@@ -4206,10 +4141,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">åƒæ•¸ -maxmempool 至少è¦çµ¦ %d 百è¬ä½å…ƒçµ„(MB)</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">å‘生了致命的内部错误,请在debug.log中查看详情</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ²’è¾¦æ³•è§£æž -%s åƒæ•¸æŒ‡å®šçš„地å€: '%s'</translation>
</message>
@@ -4344,6 +4275,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4361,7 +4296,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">找ä¸åˆ°asmap文件%s</translation>
+ <translation type="unfinished">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4452,14 +4387,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: %s 所在的ç£ç›˜ç©ºé—´ä½Žã€‚</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">錯誤:轉存檔案的校驗和ä¸åŒ¹é…。%s計算得%s</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—çš„éµä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—的值ä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">錯誤:keypool已用完,請先é‡æ–°å‘¼å«keypoolrefill</translation>
</message>
<message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">錯誤:缺少校驗和</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">錯誤: 沒有å¯ç”¨çš„ %s 地å€</translation>
+ </message>
+ <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4512,6 +4467,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4520,6 +4479,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4544,6 +4511,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">dbcacheä¸è¶³ä»¥ç”¨äºŽåŒºå—验è¯</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">金é¢ä¸è¶³</translation>
+ </message>
+ <message>
<source>Invalid -i2psam address or hostname: '%s'</source>
<translation type="unfinished">无效的 -i2psam 地å€æˆ–主机å: '%s'</translation>
</message>
@@ -4716,10 +4687,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易ä½å…ƒé‡å¤ªå¤§</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts
index e3979b07e4..17fc4dc382 100644
--- a/src/qt/locale/bitcoin_he.ts
+++ b/src/qt/locale/bitcoin_he.ts
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">העתק ×ת הכתובת המסומנת ללוח</translation>
+ <translation type="unfinished">העתקת הכתובת המסומנת ללוח</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">× × ×œ×¡×¤×§ ×ת הסיסמה הישנה ולתת סיסמה חדשה ל×רנק.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">המשך</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">חזרה</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">זכור שהצפנת ×”×רנק ×œ× ×™×›×•×œ×” להגן עליך לגמרי מגניבת המטבעות שלך על ידי תוכנה זדונית שנמצ×ת על המחשב שלך.</translation>
</message>
@@ -398,6 +406,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ג״ב</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">×רנק בררת מחדל</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -692,6 +704,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">סגירת כל ×”×רנקי×</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">הסבת ×רנק</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">הסבת ×רנק לביטקוין</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">יש להציג ×ת הודעת העזרה של %1 כדי להציג רשימה ×¢× ×פשרויות שורת פקודה לביטקוין</translation>
</message>
@@ -705,10 +725,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">×רנק בררת מחדל</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">×ין ××¨× ×§×™× ×–×ž×™× ×™×</translation>
</message>
@@ -793,6 +809,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">שגי××”: %1</translation>
</message>
<message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">×זהרה: %1</translation>
+ </message>
+ <message>
<source>Date: %1
</source>
<translation type="unfinished">ת×ריך: %1
@@ -1008,6 +1028,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">הסבת ×רנק</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1018,10 +1045,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">×זהרת פתיחת ×רנק</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">×רנק בררת מחדל</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">פתיחת ×רנק</translation>
@@ -1597,6 +1620,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">בקובץ ההגדרות ניתן לציין ×פשרויות מתקדמות ×שר יקבלו עדיפות על ההגדרות בממשק הגרפי. כמו כן, ×פשרויות בשורת הפקודה יקבלו עדיפות על קובץ ההגדרות.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">המשך</translation>
+ </message>
+ <message>
<source>Cancel</source>
<translation type="unfinished">ביטול</translation>
</message>
@@ -2158,6 +2185,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">פעילות הרשת נוטרלה</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">לל×</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">מבצע פקודה ×œ×œ× ×›×œ ×רנק</translation>
</message>
@@ -2721,10 +2752,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">חתימה על הו&amp;דעה</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">×פשר ×œ×—×ª×•× ×¢×œ הודעות/×”×¡×›×ž×™× ×‘×מצעות הכתובות שלך, כדי להוכיח שב×פשרותך לקבל ×ת ×”×‘×™×˜×§×•×™× ×™× ×”× ×©×œ×—×™× ×ליהן. יש להיזהר ×•×œ× ×œ×—×ª×•× ×¢×œ תוכן ×¢×ž×•× ×ו ×קר××™, מכיוון שתקיפות דיוג עשויות לנסות לגנוב ×ת זהותך. יש ×œ×—×ª×•× ×¨×§ על הצהרות מפורטות שהנך מסכי×/×” להן.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">כתובת הביטקוין ×יתה ×œ×—×ª×•× ×ת ההודעה</translation>
</message>
@@ -2809,10 +2836,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">× × ×œ×‘×“×•×§ ×ת הכתובת ולנסות שוב.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">הכתובת שסיפקת ×œ× ×ž×ª×™×™×—×¡×ª למפתח.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">שחרור ×”×רנק בוטל.</translation>
</message>
@@ -3327,11 +3350,7 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Could not commit transaction</source>
<translation type="unfinished">שילוב העסקה נכשל</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">×רנק בררת מחדל</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3383,12 +3402,16 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s משובש. נסו להשתמש בכלי ×”×רנק bitcoin-wallet כדי להציל ×ו לשחזר מגיבוי..</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">×œ× × ×™×ª×Ÿ לנעול ×ת תיקיית ×”× ×ª×•× ×™× %sâ€. %s כנר××” כבר רץ.</translation>
+ </message>
+ <message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
<translation type="unfinished">מופץ תחת רשיון התוכנה של MIT, ר××” קובץ מלווה %s ×ו %s</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">× × ×‘×“×§×• שהת×ריך והשעה במחשב ×©×œ×›× × ×›×•× ×™×! ×× ×”×©×¢×•×Ÿ ×©×œ×›× ×œ× ×ž×¡×•× ×›×¨×Ÿ, %s ×œ× ×™×¢×‘×•×“ כהלכה.</translation>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">× × ×œ×©×§×•×œ ×œ×ª×¨×•× ×× %s שימושי בשבילך. יש לבקר ב־%s למידע נוסף על התוכנה.</translation>
</message>
<message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
@@ -3455,10 +3478,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">‎-maxmempool חייב להיות לפחות %d מ״ב</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">שגי××” פטלית פנימית ×ירעה, לפירוט ר××” ×ת לוג הדיב××’.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">×œ× ×ž×¦×œ×™×— לפענח -%s כתובת: '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hi.ts b/src/qt/locale/bitcoin_hi.ts
index bcde979223..8f77bdc79c 100644
--- a/src/qt/locale/bitcoin_hi.ts
+++ b/src/qt/locale/bitcoin_hi.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">पता या लेबल संपादित करने के लिठराइट-कà¥à¤²à¤¿à¤• करें</translation>
+ <translation type="unfinished">पते या लेबल में बदलाव करने के लिठराइट-कà¥à¤²à¤¿à¤• करें</translation>
</message>
<message>
<source>Create a new address</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">मौजूदा चयनित पते को सिसà¥à¤Ÿà¤® कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ पर कॉपी करें</translation>
+ <translation type="unfinished">चà¥à¤¨à¥‡ गठमौजूदा पते को सिसà¥à¤Ÿà¤® कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ पर कॉपी करें</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -27,7 +27,7 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">सूची से मौजूदा चयनित पता हटाà¤à¤‚</translation>
+ <translation type="unfinished">सूची से अभी चà¥à¤¨à¤¾ गया पता डिलीट करें</translation>
</message>
<message>
<source>Enter address or label to search</source>
@@ -35,7 +35,7 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">मौजूदा टैब में डेटा को फ़ाइल में निरà¥à¤¯à¤¾à¤¤ करें</translation>
+ <translation type="unfinished">मौजूदा टैब में डेटा को फ़ाइल में à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ करें</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -43,7 +43,7 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">मिटाना</translation>
+ <translation type="unfinished">डिलीट करें</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -55,7 +55,7 @@
</message>
<message>
<source>C&amp;hoose</source>
- <translation type="unfinished">&amp;चà¥à¤œà¤¼</translation>
+ <translation type="unfinished">&amp;चà¥à¤¨à¥‡à¤‚</translation>
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
@@ -69,19 +69,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;कॉपी पता</translation>
+ <translation type="unfinished">&amp;पता कॉपी करें</translation>
</message>
<message>
<source>Copy &amp;Label</source>
- <translation type="unfinished">कॉपी और लेबल</translation>
+ <translation type="unfinished">&amp;लेबल कॉपी करें</translation>
</message>
<message>
<source>&amp;Edit</source>
- <translation type="unfinished">&amp;à¤à¤¡à¥€à¤Ÿ</translation>
+ <translation type="unfinished">&amp;बदलाव करें</translation>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">पता की सूची को निरà¥à¤¯à¤¾à¤¤ करें</translation>
+ <translation type="unfinished">पते की सूची को à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ करें</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -94,8 +94,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">पता सूची को %1यहां सहेजने का पà¥à¤°à¤¯à¤¾à¤¸ करते समय à¤à¤• तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ . कृपया पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें।</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">पते भेजे जा रहे हैं - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
- <translation type="unfinished">निरà¥à¤¯à¤¾à¤¤ विफल हो गया है</translation>
+ <translation type="unfinished">à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ नहीं हो पाया</translation>
</message>
</context>
<context>
@@ -121,7 +125,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">पासफ़à¥à¤°à¥‡à¤œà¤¼ मे पà¥à¤°à¤µà¥‡à¤¶ करें</translation>
+ <translation type="unfinished">पासफà¥à¤°à¥‡à¥› दरà¥à¤œ करें</translation>
</message>
<message>
<source>New passphrase</source>
@@ -405,10 +409,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">किसी अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ पर वॉलेट बैकअप करे |</translation>
</message>
<message>
- <source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">वॉलेट à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤¶à¤¨ के लिठउपयोग किठजाने वाले पासफ़à¥à¤°à¥‡à¤œà¤¼ को बदलें</translation>
- </message>
- <message>
<source>&amp;Send</source>
<translation type="unfinished">&amp;भेजें</translation>
</message>
@@ -422,101 +422,25 @@ Signing is only possible with addresses of the type 'legacy'.</source>
 </translation>
</message>
<message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ वॉलेट…</translation>
- </message>
- <message>
- <source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">अपने वॉलेट से संबंधित निजी कà¥à¤‚जियों को à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ करें</translation>
- </message>
- <message>
- <source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;बैकअप वॉलेट…</translation>
- </message>
- <message>
- <source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;पासफ़à¥à¤°à¥‡à¤œà¤¼ बदलें…</translation>
- </message>
- <message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">साइन &amp;मैसेज...</translation>
- </message>
- <message>
- <source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">अपने बिटकॉइन पतों के साथ संदेशों पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करके साबित करें कि वे आपके हैं |</translation>
- </message>
- <message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">&amp;संदेश सतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ करें…</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">यह सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करने के लिठसंदेशों को सतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ करें कि वे निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ बिटकॉइन पते के साथ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤¿à¤¤ थे |</translation>
- </message>
- <message>
- <source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">फ़ाइल से पीà¤à¤¸à¤¬à¥€à¤Ÿà¥€ &amp;लोड करें…</translation>
- </message>
- <message>
- <source>Open &amp;URI…</source>
- <translation type="unfinished"> &amp;यूआरआई खोलिये…</translation>
- </message>
- <message>
<source>Close Wallet…</source>
- <translation type="unfinished">वॉलेट बंद करें…</translation>
+ <translation type="unfinished">बटà¥à¤† बंद करें...</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">वॉलेट बनाà¤à¤‚</translation>
+ <translation type="unfinished">वॉलेट बनाà¤à¤‚...</translation>
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">सभी वॉलेट बंद करें…</translation>
- </message>
- <message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;फ़ाइल</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <translation type="unfinished">&amp;सेटिंगà¥à¤¸</translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation type="unfinished">&amp;हेलà¥à¤ª</translation>
- </message>
- <message>
- <source>Tabs toolbar</source>
- <translation type="unfinished">टैब टूलबार</translation>
- </message>
- <message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">हेडर सिंक किया जा रहा है (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">नेटवरà¥à¤• के साथ सिंकà¥à¤°à¥‹à¤¨à¤¾à¤‡à¤œà¤¼ किया जा रहा है…</translation>
- </message>
- <message>
- <source>Indexing blocks on disk…</source>
- <translation type="unfinished">डिसà¥à¤• पर बà¥à¤²à¥‰à¤• का सूचीकरण किया जा रहा है…</translation>
- </message>
- <message>
- <source>Processing blocks on disk…</source>
- <translation type="unfinished">डिसà¥à¤• पर बà¥à¤²à¥‰à¤• संसाधित किठजा रहे हैं…</translation>
+ <translation type="unfinished">सारे बटà¥à¤à¤ बंद करें...</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
<numerusform>Processed %n block(s) of transaction history.</numerusform>
- <numerusform>टà¥à¤°à¤¾à¤¨à¤œà¥‡à¤•à¥à¤¶à¤¨ हिसà¥à¤Ÿà¥à¤°à¥€ के बà¥à¤²à¥‰à¤• संसाधित किठगठहै %n .</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
</translation>
</message>
<message>
- <source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">पीà¤à¤¸à¤¬à¥€à¤Ÿà¥€ को &amp;कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ से लोड करें…</translation>
- </message>
- <message>
<source>Migrate Wallet</source>
<translation type="unfinished">वॉलेट माइगà¥à¤°à¥‡à¤Ÿ करें</translation>
</message>
@@ -533,6 +457,26 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">अधिक विकलà¥à¤ªà¥‹à¤‚ के लिठकà¥à¤²à¤¿à¤• करें</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">पीयरà¥à¤¸ टैब दिखाà¤à¤‚</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">नेटवरà¥à¤• गतिविधि अकà¥à¤·à¤® करें</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">नेटवरà¥à¤• गतिविधि सकà¥à¤·à¤® करें</translation>
+ </message>
+ <message>
<source>Error creating wallet</source>
<translation type="unfinished">बटवा निरà¥à¤®à¤¾à¤£ में गलती</translation>
</message>
@@ -612,7 +556,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Date</source>
- <translation type="unfinished">तारीख़</translation>
+ <translation type="unfinished">डेट</translation>
</message>
<message>
<source>Confirmations</source>
@@ -655,13 +599,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">कॉपी बाइटà¥à¤¸</translation>
</message>
<message>
+ <source>Copy change</source>
+ <translation type="unfinished">कॉपी चैंज</translation>
+ </message>
+ <message>
<source>(no label)</source>
- <translation type="unfinished">(कोई लेबल नहीं)</translation>
+ <translation type="unfinished">(नो लेबल)</translation>
</message>
</context>
<context>
<name>CreateWalletActivity</name>
<message>
+ <source>Create Wallet</source>
+ <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
+ <translation type="unfinished">वॉलेट बनाà¤à¤‚</translation>
+ </message>
+ <message>
<source>Create wallet failed</source>
<translation type="unfinished">वॉलेट बनाना विफल</translation>
</message>
@@ -1388,10 +1341,6 @@ For more information on using this console, type %6.
<translation type="unfinished">मेसेज</translation>
</message>
<message>
- <source>(no label)</source>
- <translation type="unfinished">(कोई लेबल नहीं)</translation>
- </message>
- <message>
<source>(no message)</source>
<translation type="unfinished">(नो मेसेज)</translation>
</message>
@@ -1571,6 +1520,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">कॉपी बाइटà¥à¤¸</translation>
</message>
<message>
+ <source>Copy change</source>
+ <translation type="unfinished">कॉपी चैंज</translation>
+ </message>
+ <message>
<source>%1 (%2 blocks)</source>
<translation type="unfinished">%1 (%2 बà¥à¤²à¤¾à¤•à¤¸)</translation>
</message>
@@ -1747,11 +1700,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
<translation type="unfinished">आपके दà¥à¤µà¤¾à¤°à¤¾ परिवरà¥à¤¤à¤¨ के लिठचà¥à¤¨à¤¾ गया पता इस वॉलेट का हिसà¥à¤¸à¤¾ नहीं है। आपके वॉलेट में कोई भी या सभी धनराशि इस पते पर भेजी जा सकती है। कà¥à¤¯à¤¾ आपको यकीन है?</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(कोई लेबल नहीं)</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -1841,10 +1790,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">&amp;संदेश पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करें</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">आप अपने पते के साथ संदेशों/समà¤à¥Œà¤¤à¥‹à¤‚ पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करके यह साबित कर सकते हैं कि आप उनà¥à¤¹à¥‡à¤‚ भेजे गठबिटकॉइन पà¥à¤°à¤¾à¤ªà¥à¤¤ कर सकते हैं। सावधान रहें कि कà¥à¤› भी असà¥à¤ªà¤·à¥à¤Ÿ या यादृचà¥à¤›à¤¿à¤• पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° न करें, कà¥à¤¯à¥‹à¤‚कि फ़िशिंग हमले आपको अपनी पहचान पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करने के लिठछल करने का पà¥à¤°à¤¯à¤¾à¤¸ कर सकते हैं। केवल पूरी तरह से विसà¥à¤¤à¥ƒà¤¤ बयानों पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करें जिनसे आप सहमत हैं।</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">संदेश पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करने के लिठबिटकॉइन पता</translation>
</message>
@@ -1937,10 +1882,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">कृपया पते की जांच करें और पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें।</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">दरà¥à¤œ किया गया पता à¤à¤• कà¥à¤‚जी को संदरà¥à¤­à¤¿à¤¤ नहीं करता है।</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">वॉलेट अनलॉक रदà¥à¤¦ कर दिया गया था।
 </translation>
@@ -2232,10 +2173,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">(असंबंधित)</translation>
</message>
<message>
- <source>(no label)</source>
- <translation type="unfinished">(कोई लेबल नहीं)</translation>
- </message>
- <message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
<translation type="unfinished">लेनदेन की जानकारी. इस फ़ीलà¥à¤¡ पर करà¥à¤¸à¤° लाà¤à¤‚ ताकि कनà¥à¤«à¤¼à¤°à¥à¤®à¥‡à¤¶à¤¨ की संखà¥à¤¯à¤¾ पता चले.</translation>
</message>
@@ -2361,11 +2298,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Send Coins</source>
<translation type="unfinished">सेनà¥à¤¡ कॉइनà¥à¤¸</translation>
</message>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ में कापी किया गया</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -2381,6 +2313,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<context>
<name>bitcoin-core</name>
<message>
+ <source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
+ <translation type="unfinished">%s अनà¥à¤°à¥‹à¤§ %u पोरà¥à¤Ÿ पर सà¥à¤¨à¤¨à¥‡ का. इस बंदरगाह को "खराब" माना जाता है और इस पà¥à¤°à¤•à¤¾à¤° यह संभावना नहीं है कि कोई भी सहकरà¥à¤®à¥€ इससे जà¥à¤¡à¤¼à¥‡à¤—ा। विवरण और पूरी सूची के लिठdoc/p2p-bad-ports.md देखें।</translation>
+ </message>
+ <message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
<translation type="unfinished">%s के लिठडिसà¥à¤• सà¥à¤¥à¤¾à¤¨ बà¥à¤²à¥‰à¤• फ़ाइलों को समायोजित नहीं कर सकता है। इस निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ में लगभग %u GB डेटा संगà¥à¤°à¤¹à¥€à¤¤ किया जाà¤à¤—ा।</translation>
</message>
@@ -2415,7 +2351,8 @@ The wallet might have been tampered with or created with malicious intent.
</source>
<translation type="unfinished">डिसà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤° वॉलेट में अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¶à¤¿à¤¤ विरासत पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ मिली। %s बटà¥à¤† लोड हो रहा है
-हो सकता है कि वॉलेट से छेड़छाड़ की गई हो या दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ इरादे से बनाया गया हो।</translation>
+हो सकता है कि वॉलेट से छेड़छाड़ की गई हो या दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ इरादे से बनाया गया हो।
+</translation>
</message>
<message>
<source>Error: Cannot extract destination from the generated scriptpubkey</source>
diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts
index e843aed672..c157aca5cc 100644
--- a/src/qt/locale/bitcoin_hr.ts
+++ b/src/qt/locale/bitcoin_hr.ts
@@ -176,6 +176,10 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Unesite staru i novu lozinku za novÄanik.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nastavi</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Zapamtite da Å¡ifriranje vaÅ¡eg novÄanika ne može u potpunosti zaÅ¡tititi vaÅ¡e bitcoinove od zloćudnog softvera kojim se zarazi vaÅ¡e raÄunalo.</translation>
</message>
@@ -393,7 +397,11 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<numerusform>%n godina</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">uobiÄajeni novÄanik</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -483,7 +491,7 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
</message>
<message>
<source>&amp;Options…</source>
- <translation type="unfinished">&amp;Postavke</translation>
+ <translation type="unfinished">&amp;Opcije</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
@@ -519,7 +527,7 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;UÄitaj PSBT iz datoteke</translation>
+ <translation type="unfinished">&amp;UÄitaj PSBT iz datoteke...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -690,10 +698,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Sakrij vrijednost u tabu Pregled </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">uobiÄajeni novÄanik</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nema dostupnih novÄanika</translation>
</message>
@@ -1028,10 +1032,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Upozorenje kod otvaranja novÄanika</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">uobiÄajeni novÄanik</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otvorite novÄanik</translation>
@@ -2395,6 +2395,10 @@ Ako imate ovu grešku, od trgovca zatražite URI koji je kompatibilan sa BIP21.<
<translation type="unfinished">Mrežna aktivnost iskljuÄena</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ništa</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">IzvrÅ¡ava se naredba bez bilo kakvog novÄanika</translation>
</message>
@@ -2742,8 +2746,7 @@ Za više informacija o korištenju ove konzile, utipkajte %6.
</message>
<message>
<source>Hide transaction fee settings</source>
- <translation type="unfinished">Sakrijte postavke za transakcijske provizije
-</translation>
+ <translation type="unfinished">Sakrijte postavke za transakcijske provizije</translation>
</message>
<message>
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
@@ -3073,10 +3076,6 @@ Napomena: Budući da se naknada raÄuna po bajtu, naknada od "100 satoÅ¡ija po k
<translation type="unfinished">&amp;Potpišite poruku</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Možete potpisati poruke/dogovore svojim adresama kako biste dokazali da možete pristupiti bitcoinima poslanim na te adrese. Budite oprezni da ne potpisujte niÅ¡ta nejasno ili nasumiÄno, jer napadi phishingom vas mogu prevariti da prepiÅ¡ite svoj identitet njima. Potpisujte samo detaljno objaÅ¡njene izjave s kojima se slažete.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin adresa pomoću koje ćete potpisati poruku</translation>
</message>
@@ -3161,10 +3160,6 @@ Napomena: Budući da se naknada raÄuna po bajtu, naknada od "100 satoÅ¡ija po k
<translation type="unfinished">Molim provjerite adresu i pokušajte ponovo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Unesena adresa ne odnosi se na kljuÄ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">OtkljuÄavanje novÄanika je otkazano.</translation>
</message>
@@ -3728,10 +3723,6 @@ Idi na Datoteka &gt; Otvori novÄanik za uÄitanje novÄanika.
<source>Can't display address</source>
<translation type="unfinished">Ne mogu prikazati adresu</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">uobiÄajeni novÄanik</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3844,10 +3835,6 @@ Idi na Datoteka &gt; Otvori novÄanik za uÄitanje novÄanika.
<translation type="unfinished">Format datoteke novÄanika nije dostupan. Kako biste koristili reatefromdump, -format=&lt;format&gt; mora biti osiguran.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Molimo provjerite jesu li datum i vrijeme na vaÅ¡em raÄunalu toÄni. Ako je vaÅ¡ sat krivo namjeÅ¡ten, %s neće raditi ispravno.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Molimo vas da doprinijete programu %s ako ga smatrate korisnim. Posjetite %s za više informacija.</translation>
</message>
@@ -3932,10 +3919,6 @@ Idi na Datoteka &gt; Otvori novÄanik za uÄitanje novÄanika.
<translation type="unfinished">-maxmempool mora biti barem %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Dogodila se kobna greška, vidi detalje u debug.log.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Ne može se razriješiti adresa -%s: '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts
index 55dc10bb72..f3c9416193 100644
--- a/src/qt/locale/bitcoin_hu.ts
+++ b/src/qt/locale/bitcoin_hu.ts
@@ -184,6 +184,14 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Ãrja be a tárca régi és új jelmondatát.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Tovább</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Vissza</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Ne feledje, hogy a tárca titkosítása nem nyújt teljes védelmet az adathalász programok fertőzésével szemben.</translation>
</message>
@@ -425,7 +433,11 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<numerusform>%n év</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">alapértelmezett tárca</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -503,7 +515,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Tárcatitkosító jelmondat megváltoztatása</translation>
+ <translation type="unfinished">Tárcatitkosító jelszó megváltoztatása</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -531,7 +543,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">Jelmondat &amp;megváltoztatása…</translation>
+ <translation type="unfinished">Jelszó &amp;megváltoztatása…</translation>
</message>
<message>
<source>Sign &amp;message…</source>
@@ -539,7 +551,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Üzenetek aláírása a Bitcoin-címeivel, amivel bizonyíthatja, hogy az Öné</translation>
+ <translation type="unfinished">Üzenetek aláírása a Bitcoin-címeivel, amivel bizonyíthatja hogy a cím az Öné</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -563,7 +575,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Tárca létrehozása...</translation>
+ <translation type="unfinished">Tárca készítése…</translation>
</message>
<message>
<source>Close All Wallets…</source>
@@ -619,7 +631,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">Paran&amp;cssori opciók</translation>
+ <translation type="unfinished">Paran&amp;cssor kapcsolók</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -649,7 +661,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Figyelmeztetés</translation>
+ <translation type="unfinished">Figyelem</translation>
</message>
<message>
<source>Information</source>
@@ -693,11 +705,11 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Tárca megnyitása</translation>
+ <translation type="unfinished">Tárca Megnyitása</translation>
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">Egy tárca megnyitása</translation>
+ <translation type="unfinished">Tárca megnyitása</translation>
</message>
<message>
<source>Close wallet</source>
@@ -738,17 +750,13 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Értékek elrejtése az Ãttekintés fülön</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">alapértelmezett tárca</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nincs elérhető tárca</translation>
</message>
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Tárca adat</translation>
+ <translation type="unfinished">Tárca adatai</translation>
</message>
<message>
<source>Load Wallet Backup</source>
@@ -988,11 +996,11 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">C&amp;ímke másolása</translation>
+ <translation type="unfinished">Címke &amp;másolása</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">&amp;Összeg másolása</translation>
+ <translation type="unfinished">Ö&amp;sszeg másolása</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -1151,10 +1159,6 @@ A migrációs folyamat készít biztonsági mentést a tárcáról migrálás el
<translation type="unfinished">Tárca-megnyitási figyelmeztetés</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">alapértelmezett tárca</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Tárca megnyitása</translation>
@@ -2345,10 +2349,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ãtvitel</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">A BIP324 munkamenet azonosító hex formátumú szöveglánca, ha van.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Munkamenet azonosító</translation>
</message>
@@ -2455,6 +2455,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Irány/Típus</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">A BIP324 munkamenet-azonosító hex formátumban.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">A hálózati protokoll amin keresztül ez a partner kapcsolódik: IPv4, IPv6, Onion, I2P vagy CJDNS.</translation>
</message>
@@ -2647,12 +2651,16 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Hálózati tevékenység letiltva</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Semmi</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Parancs végrehajtása tárca nélkül</translation>
</message>
<message>
<source>Node window - [%1]</source>
- <translation type="unfinished">Node ablak - [%1]</translation>
+ <translation type="unfinished">Csomópont ablak - [%1]</translation>
</message>
<message>
<source>Executing command using "%1" wallet</source>
@@ -3367,8 +3375,8 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Üzenet &amp;aláírása</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Címeivel aláírhatja az üzeneteket/egyezményeket, amivel bizonyíthatja, hogy át tudja venni az ezekre a címekre küldött bitcoin-t. Vigyázzon, hogy ne írjon alá semmi félreérthetőt, mivel adathalász támadásokkal megpróbálhatják becsapni, hogy az azonosságát átírja másokra. Csak olyan részletes állításokat írjon alá, amivel egyetért.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Aláírhat üzeneteket/megállapodásokat a régí típusú (P2PKH) címeivel amivel bizonyítja, hogy fogadni és elkölteni is tudja az oda küldött bitcoint. Legyen óvatos és ne írjon alá semmilyen ködös vagy véletlenszerű üzenetet, mivel adathalászok megkísérelhetik rávenni a személyazonosságának átruházására. Csak olyan alaposan részletezett állításokat írjon alá amivel teljesen egyetért.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3455,8 +3463,8 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Ellenőrizze a címet és próbálja meg újra.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">A megadott cím nem hivatkozik egy kulcshoz sem.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">A megadott cím nem régi típusú (P2PKH) kulcsra hivatkozik. Üzenetek aláírása SegWit és más nem P2PKH típusú címekkel nem támogatott a jelenlegi %1 verzióban. Kérjük ellenőrizze a címet majd próbálja újra.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -4031,9 +4039,8 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">PSBT másolva</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Vágólapra másolva</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Díj emelési PSBT a vágólapra másolva</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4044,12 +4051,12 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">A tranzakciót nem lehet elküldeni</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Nem lehet a címet megjeleníteni</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Aláíró hiba</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">alapértelmezett tárca</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Nem lehet a címet megjeleníteni</translation>
</message>
</context>
<context>
@@ -4069,7 +4076,7 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Tárca adat</translation>
+ <translation type="unfinished">Tárca adatai</translation>
</message>
<message>
<source>Backup Failed</source>
@@ -4183,10 +4190,6 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Nincs tárca fájlformátum megadva. A createfromdump használatához -format=&lt;format&gt; megadása kötelező.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Ellenőrizze, hogy helyesen van-e beállítva a gépén a dátum és az idő! A %s nem fog megfelelően működni, ha rosszul van beállítva az óra.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Kérjük támogasson, ha hasznosnak találta a %s-t. Az alábbi linken további információt találhat a szoftverről: %s.</translation>
</message>
@@ -4295,10 +4298,6 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">-maxmempool legalább %d MB kell legyen.</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Súlyos belső hiba történt, részletek a debug.log-ban</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">-%s cím feloldása nem sikerült: '%s'</translation>
</message>
@@ -4312,7 +4311,7 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Nem lehet írni a '%s' könyvtárba; ellenőrizze a jogosultságokat.</translation>
+ <translation type="unfinished">Nem tudok írni a '%s' könyvtárba, ellenőrizd a jogosultságokat.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -4347,6 +4346,12 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Sikertelen az emelt díjak becslése, mert a megerősítetlen UTXO-k hatalmas mennyiségű megerősítetlen tranzakcióktól függnek.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Nem sikerült a láncállapot pillanatkép könyvtárat (%s) eltávolítani. Távolítsa el kézzel újraindítás előtt.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Az érvénytelen peers.dat fájl átnevezése sikertelen. Kérjük mozgassa vagy törölje, majd próbálja újra.</translation>
</message>
@@ -4355,6 +4360,14 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Díjbecslés sikertelen. Alapértelmezett díj letiltva. Várjon néhány blokkot vagy engedélyezze ezt: %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Nem sikerült a blokk fájlt lemezre írni. Ez valószínű I/O hiba következménye.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Nem sikerült a visszavonási fájlt lemezre írni. Ez valószínű I/O hiba következménye.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Összeférhetetlen beállítások: -dnsseed=1 lett megadva, de az -onlynet megtiltja az IPv4/IPv6 kapcsolatokat</translation>
</message>
@@ -4363,6 +4376,14 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Érvénytelen összeg: %s=&lt;amount&gt;: '%s' (legalább a minrelay összeg azaz %s kell legyen, hogy ne ragadjon be a tranzakció)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Maximális tranzakciós súly kevesebb, mint a bemenetek nélküli tranzakció súlya</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Maximális tranzakciós súly túl alacsony, nincs hely a visszajáró kimenetnek</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">A kilépő kapcsolatok CJDNS-re korlátozottak (-onlynet=cjdns) de nincs megadva -cjdnsreachable</translation>
</message>
@@ -4379,6 +4400,14 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">A kilépő kapcsolatok i2p-re korlátozottak (-onlynet=i2p) de nincs megadva -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Nem sikerült az '%s' -&gt; '%s' átnevezés. Nem lehet kitisztítani a háttér láncállapot leveldb könyvtárat.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Az előre kiválasztott bemenetek és a tárca automatikus bemeneteinek kombinációja meghaladja a maximális tranzakciós súlyt. Kérjük próbáljon kisebb összeget küldeni vagy kézzel egyesítse a tárca UTXO-it.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">A bemenetek mérete meghaladja a maximum súlyt. Kérjük próbáljon kisebb összeget küldeni vagy kézzel egyesítse a tárca UTXO-it.</translation>
</message>
@@ -4421,6 +4450,10 @@ Kérjük próbálja futtatni a legújabb szoftver verziót.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">A számítógépének órája több mint %d perces eltérést mutat a hálózatéhoz képest, ez hátráltathatja a konszenzusra jutást. Miután megbizonyosodott az óra helyességéről ennek az üzenetnek nem szabad megjelennie a csomópont újraindítása után. Újraindítás nélkül nem jelenik meg többször miután elegendő új kimenő partnerhez csatlakozott, ami eltarthat egy ideig. További információért tanulmányozhatja a `timeoffset` mezőt a `getpeerinfo` és a `getnetworkinfo` RPC parancsokban.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4433,6 +4466,18 @@ Unable to restore backup of wallet.</source>
A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">A whitebind csak bejövő kapcsolatokhoz használható ("out" lett megadva)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Végzetes belső hiba történt, részletek a debug.log fájlban:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Nem található assumeutxo adat a megadott blokk ellenőrzőösszeghez '%s'.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Blokkok ellenőrzése megszakítva</translation>
</message>
@@ -4445,6 +4490,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Szerzői jog (C) fenntartva %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Hibás blokk találata valószínűleg hardver hibára utal.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Sérült blokk-adatbázis észlelve</translation>
</message>
@@ -4473,8 +4522,12 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">A %s elérési úton fájl nem létezik.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Elliptikus görbés kriptográfia épségi ellenőrzése sikertelen. %s most leáll.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
- <translation type="unfinished">Hiba tietokannan transaktion vahvistamisessa lompakon tapahtumien poistamiseksi.</translation>
+ <translation type="unfinished">Hiba a tárca tranzakciókat eltávolító adatbázis tranzakció létrehozása közben</translation>
</message>
<message>
<source>Error creating %s</source>
@@ -4526,7 +4579,7 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
</message>
<message>
<source>Error starting db txn for wallet transactions removal</source>
- <translation type="unfinished">Hinta tietokannan transaktion aloittamisessa lompakon tapahtumien poistamiseksi.</translation>
+ <translation type="unfinished">Hiba a tárca tranzakciókat eltávolító adatbázis tranzakció indítása közben</translation>
</message>
<message>
<source>Error: Cannot extract destination from the generated scriptpubkey</source>
@@ -4614,17 +4667,29 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
</message>
<message>
<source>Error: address book copy failed for wallet %s</source>
- <translation type="unfinished">Virhe: osoitekirjan kopioiminen epäonnistui lompakolle %s</translation>
+ <translation type="unfinished">Hiba: címjegyzék másolása sikertelen ehhez a tárcához: %s</translation>
</message>
<message>
<source>Error: database transaction cannot be executed for wallet %s</source>
- <translation type="unfinished">Virhe: tietokantatransaktiota ei voida suorittaa lompakolle %s</translation>
+ <translation type="unfinished">Hiba: adatbázis tranzakció végrehajtása sikertelen ehhez a tárcához: %s</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Sikertelen a legjobb blokkhoz (%s) csatlakozás.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Blokk szétkapcsolása nem sikerült.</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Egyik hálózati portot sem sikerül figyelni. Használja a -listen=0 kapcsolót, ha ezt szeretné.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Blokk olvasása nem sikerült.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Indítás közben nem sikerült átfésülni a tárcát</translation>
</message>
@@ -4637,9 +4702,24 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Adatbázis ellenőrzése sikertelen</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Blokk írása nem sikerült.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">A blokk-index adatbázis írása nem sikerült.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Az érme-adatbázis írása nem sikerült.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Visszavonási adatok írása nem sikerült.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
- <translation type="unfinished"> 
-Virhe tapahtuman poistamisessa: %s</translation>
+ <translation type="unfinished">Tranzakció eltávolítása nem sikerült: %s</translation>
</message>
<message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
@@ -4734,6 +4814,10 @@ Virhe tapahtuman poistamisessa: %s</translation>
<translation type="unfinished">Tárca betöltése…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Maximális tranzakciós súlynak %d és %d között kell lennie.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Hiányzó összeg</translation>
</message>
@@ -4762,6 +4846,10 @@ Virhe tapahtuman poistamisessa: %s</translation>
<translation type="unfinished">Nem megoldható az előre kiválasztott bemenet %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Csak az irány lett beállítva, engedélyek nem: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Ritkított üzemmódot nem lehet negatív értékkel konfigurálni.</translation>
</message>
@@ -4806,6 +4894,18 @@ Virhe tapahtuman poistamisessa: %s</translation>
<translation type="unfinished">Ismeretlen bekezdés [%s]</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Az aláíró nem jelzett vissza címet</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Az aláíró váratlan címet jelzett vissza: %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Aláíró hibát jelzett: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Tranzakció aláírása sikertelen</translation>
</message>
@@ -4834,6 +4934,18 @@ Virhe tapahtuman poistamisessa: %s</translation>
<translation type="unfinished">Hálózati szálak indítása…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Rendszerhiba lemezre írás közben: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Rendszerhiba külső blokk fájl betöltése közben: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Rendszerhiba blokk lemezre mentése közben: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">A forráskód elérhető innen: %s.</translation>
</message>
@@ -4850,6 +4962,10 @@ Virhe tapahtuman poistamisessa: %s</translation>
<translation type="unfinished">A tárca nem fog a minimális továbbítási díjnál kevesebbet fizetni. </translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Nem tartozik ScriptPubKeyManager ehhez a címhez</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Ez egy kísérleti szoftver.</translation>
</message>
@@ -4863,7 +4979,7 @@ Virhe tapahtuman poistamisessa: %s</translation>
</message>
<message>
<source>Transaction %s does not belong to this wallet</source>
- <translation type="unfinished">tranzakció%s ei kuulu tähän lompakkoon.</translation>
+ <translation type="unfinished">A %s tranzakció nem tartozik ehhez a tárcához</translation>
</message>
<message>
<source>Transaction amount too small</source>
@@ -4890,10 +5006,6 @@ Virhe tapahtuman poistamisessa: %s</translation>
<translation type="unfinished">Túl nagy tranzakció</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Nem sikerült a memóriát lefoglalni -maxsigcachesize számára: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Ezen a számítógépen nem lehet ehhez társítani: %s (a bind ezzel a hibával tért vissza: %s)</translation>
</message>
@@ -4954,6 +5066,10 @@ Virhe tapahtuman poistamisessa: %s</translation>
<translation type="unfinished">Ismeretlen új szabályok aktiválva (verzióbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Ismeretlen beállítás "%s" lett megadva itt: -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Nem támogatott globális naplózási szint %s=%s. Lehetséges értékek: %s.</translation>
</message>
@@ -4975,7 +5091,7 @@ Virhe tapahtuman poistamisessa: %s</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
- <translation type="unfinished">Virhe: Ei voitu poistaa vain seurantatapahtumia.</translation>
+ <translation type="unfinished">Hiba: Nem lehet törölni csak megfigyelt tranzakciókat.</translation>
</message>
<message>
<source>User Agent comment (%s) contains unsafe characters.</source>
diff --git a/src/qt/locale/bitcoin_id.ts b/src/qt/locale/bitcoin_id.ts
index a148483336..864787803d 100644
--- a/src/qt/locale/bitcoin_id.ts
+++ b/src/qt/locale/bitcoin_id.ts
@@ -79,6 +79,14 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Terjadi sebuah kesalahan saat mencoba menyimpan daftar alamat ke %1. Silakan coba lagi.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Alamat pengirim - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Penerima alamat - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Gagal Mengekspor</translation>
</message>
@@ -87,7 +95,7 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<name>AddressTableModel</name>
<message>
<source>Address</source>
- <translation type="unfinished">Alamat</translation>
+ <translation type="unfinished">0x5a52E96BAcdaBb82fd05763E25335261B270Efcb</translation>
</message>
<message>
<source>(no label)</source>
@@ -307,10 +315,102 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">wallet default</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Ubah kata kunci yang digunakan untuk enkripsi dompet</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Enkripsi wallet...</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">Enkripsi private key yang dimiliki dompet Anda</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Cadangkan Dompet...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Ganti kata sandi...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Tanda tangani dan kirim pessan...</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Tanda tangani sebuah pesan menggunakan alamat Bitcoin Anda untuk membuktikan bahwa Anda adalah pemiliknya</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Verifikasi pesan...</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Verifikasi pesan untuk memastikan bahwa pesan tersebut ditanda tangani oleh suatu alamat Bitcoin tertentu</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Muat PSBT dari file...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Buka &amp;URI...</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Tutup Dompet...</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Bikin dompet...</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Tutup semua dompet...</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Berkas</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Pengaturan</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Bantuan</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Baris tab</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Singkronisasi Header (%1%)...</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Mensinkronisasi dengan jaringan</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Mengindeks blok pada disk...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Memproses blok pada disk ...</translation>
+ </message>
+ <message>
<source>Connecting to peers…</source>
<translation type="unfinished">Menghubungkan ke peers...</translation>
</message>
@@ -333,7 +433,7 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>%n blok riwayat transaksi diproses.</numerusform>
</translation>
</message>
<message>
@@ -369,6 +469,50 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Terbaru</translation>
</message>
<message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Muat transaksi Bitcoin yang ditandatangani seperapat</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Masukkan PSBT dari &amp;clipboard</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">Muat transaksi Bitcoin yang ditandatangani seperapat dari clipboard</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Jendela Node</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Buka konsol debug dan diagnosa node</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">Address &amp;Pengirim</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">Address &amp;Penerima</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">Buka URI bitcoin:</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Buka Wallet</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Buka sebuah wallet</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Tutup wallet</translation>
+ </message>
+ <message>
<source>Restore Wallet…</source>
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
<translation type="unfinished">Pulihkan Dompet…</translation>
@@ -403,10 +547,6 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Mask nilai yang ada di tab Overview</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">wallet default</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Tidak ada wallet tersedia</translation>
</message>
@@ -438,23 +578,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<source>Main Window</source>
<translation type="unfinished">Jendela Utama</translation>
</message>
- <message>
- <source>%1 client</source>
- <translation type="unfinished">%1 klien</translation>
- </message>
- <message>
- <source>&amp;Hide</source>
- <translation type="unfinished">Sembunyi</translation>
- </message>
- <message>
- <source>S&amp;how</source>
- <translation type="unfinished">Tampilkan</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n koneksi yang aktif ke jaringan Bitcoin</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
<message>
@@ -500,19 +628,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<source>(%1 locked)</source>
<translation type="unfinished">(%1 terkunci)</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(tidak ada label)</translation>
- </message>
</context>
<context>
<name>CreateWalletActivity</name>
<message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">Bikin dompet</translation>
- </message>
- <message>
<source>Too many external signers found</source>
<translation type="unfinished">Terlalu banyak penanda tangan eksternal ditemukan</translation>
</message>
@@ -537,6 +656,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Migrasi dompet</translation>
</message>
<message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Anda yakin ingin memindahkan dompet &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
<source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
@@ -588,10 +711,6 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<translation type="unfinished">Peringatan membuka wallet</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">wallet default</translation>
- </message>
- <message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
<translation type="unfinished">Membuka Wallet &lt;b&gt;%1&lt;/b&gt;...</translation>
@@ -1178,10 +1297,6 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<translation type="unfinished">Transpor</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">String ID sesi BIP324 dalam heksadesimal, jika ada.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">ID sesi</translation>
</message>
@@ -1208,6 +1323,10 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<translation type="unfinished">Jumlah total alamat yang diterima dari rekan ini yang dihapus (tidak diproses) karena pembatasan tarif.</translation>
</message>
<message>
+ <source>Node window</source>
+ <translation type="unfinished">Jendela Node</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Waktu blok terakhir</translation>
</message>
@@ -1350,18 +1469,6 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Disalin ke clipboard</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">wallet default</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
@@ -1382,7 +1489,7 @@ wallet</translation>
<name>bitcoin-core</name>
<message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s gagal memvalidasi status snapshot -assumeutxo. Ini mengindikasikan masalah perangkat keras, atau bug pada perangkat lunak, atau modifikasi perangkat lunak yang buruk yang memungkinkan snapshot yang tidak valid dimuat. Sebagai akibatnya, node akan dimatikan dan berhenti menggunakan status apa pun yang dibangun di atas snapshot, mengatur ulang tinggi rantai dari %d ke %d. Pada restart berikutnya, node akan melanjutkan sinkronisasi dari %d tanpa menggunakan data snapshot apa pun. Silakan laporkan kejadian ini ke %s, termasuk bagaimana Anda mendapatkan snapshot tersebut. Chainstate snapshot yang tidak valid akan dibiarkan di disk jika hal itu membantu dalam mendiagnosis masalah yang menyebabkan kesalahan ini.</translation>
+ <translation type="unfinished">%s gagal memvalidasi status snapshot -asumsikan UTXO (Keluaran Transaksi yang tidak terpakai). Ini mengindikasikan masalah perangkat keras, atau bug pada perangkat lunak, atau modifikasi perangkat lunak yang buruk yang memungkinkan snapshot yang tidak valid dimuat. Sebagai akibatnya, node akan dimatikan dan berhenti menggunakan status apa pun yang dibangun di atas snapshot, mengatur ulang tinggi rantai dari %d ke %d. Pada restart berikutnya, node akan melanjutkan sinkronisasi dari %d tanpa menggunakan data snapshot apa pun. Silakan laporkan kejadian ini ke %s, termasuk bagaimana Anda mendapatkan snapshot tersebut. Status rantai snapshot yang tidak valid akan dibiarkan di disk jika hal ini membantu dalam mendiagnosis masalah yang menyebabkan kesalahan ini.</translation>
</message>
<message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
@@ -1414,7 +1521,7 @@ wallet</translation>
</message>
<message>
<source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
- <translation type="unfinished">Tingkat penebangan khusus kategori yang tidak didukung %1$s=%2$s. Diharapkan %1$s=&lt;kategori&gt;:&lt;loglevel&gt;. Kategori yang valid: %3$s. Tingkat pencatatan yang valid: %4$s.</translation>
+ <translation type="unfinished">Tingkat penebangan khusus kategori yang tidak didukung %1$s=%2$s. Diharapkan %1$s=&lt;category&gt;:&lt;loglevel&gt;. Kategori yang valid: %3$s. Tingkat pencatatan yang valid: %4$s.</translation>
</message>
<message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
@@ -1429,6 +1536,10 @@ wallet</translation>
<translation type="unfinished">Dompet berhasil dimuat. Tipe dompet lama akan ditinggalkan dan dukungan untuk membuat dan membuka dompet ini akan dihapus di masa depan. Dompet lama dapat dimigrasikan ke dompet deskriptor dengan migratewallet.</translation>
</message>
<message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">Tidak dapat menulis ke direktori data '%s'; periksa izinnya.</translation>
+ </message>
+ <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s ditetapkan sangat tinggi! Biaya sebesar ini dapat dibayarkan dalam satu transaksi.</translation>
</message>
@@ -1454,7 +1565,7 @@ wallet</translation>
</message>
<message>
<source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">Estimasi biaya gagal. Fallbackfee dinonaktifkan. Tunggu beberapa blok atau aktifkan %s.</translation>
+ <translation type="unfinished">Estimasi biaya gagal. Biaya cadangan dinonaktifkan. Tunggu beberapa blok atau aktifkan %s.</translation>
</message>
<message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
@@ -1462,7 +1573,7 @@ wallet</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;jumlah&gt;: '%s' (harus setidaknya biaya minrelay sebesar %s untuk mencegah transaksi macet)</translation>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;amount&gt;: '%s' (harus setidaknya biaya minrelay sebesar %s untuk mencegah transaksi macet)</translation>
</message>
<message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
@@ -1616,7 +1727,7 @@ Tidak dapat memulihkan cadangan dompet..</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;jumlah&gt;: '%s' (harus minimal %s)</translation>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;amount&gt;: '%s' (harus minimal %s)</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
@@ -1651,10 +1762,6 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Transaksi %s tidak termasuk dompet ini</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Tidak dapat mengalokasikan memori untuk -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to find UTXO for external input</source>
<translation type="unfinished">Tidak dapat menemukan UTXO untuk input eksternal</translation>
</message>
diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts
index 83410574dd..8a2cf107e1 100644
--- a/src/qt/locale/bitcoin_it.ts
+++ b/src/qt/locale/bitcoin_it.ts
@@ -184,6 +184,14 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Inserisci la vecchia passphrase e la nuova passphrase per il portafoglio.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continua</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Indietro</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Ricorda che la cifratura del portafoglio non protegge del tutto i tuoi bitcoin dal furto da parte di malware che infettasse il tuo computer.</translation>
</message>
@@ -197,7 +205,7 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Il tuo portafoglio è ora cifrato.</translation>
+ <translation type="unfinished">Il tuo portafoglio ora è cifrato.</translation>
</message>
<message>
<source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
@@ -402,7 +410,11 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<numerusform>%n anni</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">portafoglio predefinito</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -427,7 +439,7 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
<message>
<source>Quit application</source>
- <translation type="unfinished">Chiudi applicazione</translation>
+ <translation type="unfinished">Chiudi l'applicazione</translation>
</message>
<message>
<source>&amp;About %1</source>
@@ -560,19 +572,19 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizzando Headers (1%1%)...</translation>
+ <translation type="unfinished">Sincronizzazione Intestazioni in corso (1%1%)...</translation>
</message>
<message>
<source>Synchronizing with network…</source>
- <translation type="unfinished">Sincronizzando con la rete...</translation>
+ <translation type="unfinished">Sincronizzazione con la rete in corso...</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
- <translation type="unfinished">Indicizzando i blocchi su disco...</translation>
+ <translation type="unfinished">Indicizzazione dei blocchi su disco in corso...</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Processando i blocchi su disco...</translation>
+ <translation type="unfinished">Elaborazione dei blocchi su disco in corso...</translation>
</message>
<message>
<source>Connecting to peers…</source>
@@ -635,7 +647,7 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Carica Partially Signed Bitcoin Transaction</translation>
+ <translation type="unfinished">Carica Transazione Bitcoin Parzialmente Firmata (PSBT)</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -712,10 +724,6 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Maschera gli importi nella sezione "Panoramica"</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portafoglio predefinito</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nessun portafoglio disponibile</translation>
</message>
@@ -1080,7 +1088,7 @@ Il processo di migrazione creerà un backup del portafoglio prima della migrazio
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">Migra Wallet</translation>
+ <translation type="unfinished">Migra Portafoglio</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1118,10 +1126,6 @@ Il processo di migrazione creerà un backup del portafoglio prima della migrazio
<translation type="unfinished">Avviso apertura portafoglio</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portafoglio predefinito</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Apri Portafoglio</translation>
@@ -2253,6 +2257,14 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Numero di connessioni</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Indirizzi Locali</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Indirizzi di rete che il tuo nodo Bitcoin sta usando per comunicare con altri nodi.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Catena di Blocchi</translation>
</message>
@@ -2297,6 +2309,10 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Seleziona un peer per visualizzare informazioni più dettagliate.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Nascondi Dettagli Peers</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versione del livello di trasporto (transport layer): %1</translation>
</message>
@@ -2305,10 +2321,6 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Trasporto</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">La stringa dell' ID sessione BIP324 nell'hex, se presente.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">ID Sessione</translation>
</message>
@@ -2595,6 +2607,10 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Attività di rete disabilitata</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nessuno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Esecuzione del comando senza alcun portafoglio</translation>
</message>
@@ -3297,8 +3313,8 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">&amp;Firma Messaggio</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">È possibile firmare messaggi/accordi con i propri indirizzi in modo da dimostrare di poter ricevere bitcoin attraverso di essi. Presta attenzione a non firmare dichiarazioni vaghe o casuali, perché attacchi di phishing potrebbero cercare di indurti ad apporre la firma su di esse. Firma esclusivamente dichiarazioni completamente dettagliate e delle quali condividi in pieno il contenuto.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">È possibile firmare messaggi/accordi con i tuoi indirizzi (P2PKH) legacy per dimostrare di poter ricevere bitcoin attraverso di essi. Presta attenzione a non firmare dichiarazioni vaghe o casuali, perché attacchi di phishing potrebbero cercare di indurti ad apporre la firma su di esse. Firma esclusivamente dichiarazioni completamente dettagliate e delle quali condividi in pieno il contenuto.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3385,8 +3401,8 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Per favore controlla l'indirizzo e prova di nuovo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L'indirizzo bitcoin inserito non è associato a nessuna chiave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">L'indirizzo inserito non si riferisce a una chiave legacy (P2PKH). La firma dei messaggi per SegWit e altri tipi di indirizzi non P2PKH non è supportata in questa versione di %1. Controlla l'indirizzo e riprova.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3958,9 +3974,8 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">PSBT copiata</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiato negli appunti</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Aumento delle tariffe PSBT copiato negli appunti</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3971,12 +3986,12 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Non è stato possibile completare la transazione</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Non è possibile mostrare l'indirizzo</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Errore del firmatario</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portafoglio predefinito</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Non è possibile mostrare l'indirizzo</translation>
</message>
</context>
<context>
@@ -4110,10 +4125,6 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Nessun formato assegnato al file del portafoglio. Per usare createfromdump, -format=&lt;format&gt; deve essere fornito.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Per favore controllate che la data del computer e l'ora siano corrette! Se il vostro orologio è sbagliato %s non funzionerà correttamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Per favore contribuite se ritenete %s utile. Visitate %s per maggiori informazioni riguardo il software.</translation>
</message>
@@ -4222,10 +4233,6 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">-maxmempool deve essere almeno %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Si è verificato un errore interno fatale, consultare debug.log per i dettagli</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Impossobile risolvere l'indirizzo -%s: '%s'</translation>
</message>
@@ -4274,6 +4281,12 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Impossibile calcolare il salto di commissioni, poiché gli UTXO non confermati dipendono da una enorme serie di transazioni non confermate.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Impossibile rimuovere la directory dello stato della catena dello snapshot (1%s). Rimuovilo manualmente prima di riavviare.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Mancata rinominazione del file peers.dat non valido. Per favore spostarlo o eliminarlo e provare di nuovo.</translation>
</message>
@@ -4282,6 +4295,14 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">La stima della tariffa non è riuscita. La Commissione di riserva è disabilitata. Attendere qualche blocco o abilitare %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Lo scaricamento del file di blocco su disco non è riuscito. Questo è probabilmente il risultato di un errore I/O.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Lo scaricamento del file di annullamento su disco non è riuscito. Questo è probabilmente il risultato di un errore I/O.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opzioni incompatibili: -dnsseed=1 è stato specificato esplicitamente, ma -onlynet vieta le connessioni a IPv4/IPv6</translation>
</message>
@@ -4290,6 +4311,14 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Importo non valido per %s=&lt;amount&gt;: '%s' (deve essere almeno la commissione minrelay di %s per evitare transazioni bloccate)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Il peso massimo della transazione è inferiore al peso della transazione senza input</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Il peso massimo della transazione è troppo basso, non può contenere il resto di ritorno</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Le connessioni in uscita sono limitate a CJDNS (-onlynet=cjdns) ma -cjdnsreachable non è fornito.</translation>
</message>
@@ -4306,6 +4335,14 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Le connessioni in uscita sono limitate a i2p (-onlynet=i2p), ma -i2psam non è fornito.</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Rinominazione di '%s' -&gt; '%s' fallita. Impossibile ripulire la directory di background chainstate leveldb.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinazione degli input preselezionati e della selezione automatica degli input del portafoglio supera il peso massimo della transazione. Prova ad inviare un importo inferiore o a consolidare manualmente gli UTXO del portafoglio.</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">La dimensione degli inputs supera il peso massimo. Si prega di provare a inviare una quantità inferiore o a consolidare manualmente gli UTXO del portafoglio.</translation>
</message>
@@ -4348,6 +4385,10 @@ Provare a eseguire l'ultima versione del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La data e l'ora del computer sembrano essere più di %d minuti fuori sicnronismo con la rete, questo potrebbe causare un errore di consenso. Dopo aver confermato l'orario del computer, questo messaggio non dovrebbe più apparire al riavvio del nodo. Senza un riavvio, dovrebbe smettere di apparire automaticamente dopo che ci si è connessi a un numero sufficiente di nuovi nodi, il che può richiedere del tempo. È possibile ispezionare il campo `timeoffset` dei metodi RPC `getpeerinfo` e `getnetworkinfo` per ottenere maggiori informazioni.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4360,6 +4401,18 @@ Unable to restore backup of wallet.</source>
Non in grado di ripristinare il backup del portafoglio.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind può essere usato solo per le connessioni in entrata ("out" è stato passato)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Si è verificato un errore interno fatale, vedere debug.log per i dettagli: </translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Dati Assumeutxo non trovati per il blockhash fornito '%s'.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">La verifica del blocco è stata interrotta</translation>
</message>
@@ -4372,6 +4425,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Diritto d'autore (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">È stato trovato un blocco corrotto che indica un potenziale guasto hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Rilevato database blocchi corrotto</translation>
</message>
@@ -4400,6 +4457,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Il dumpfile %s non esiste.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Errore nel controllo di integrità della crittografia a curva ellittica. %s in spegnimento. </translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Errore nel completamento della db txn per rimuovere transazioni dal wallet</translation>
</message>
@@ -4548,10 +4609,22 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore: la transazione database non può essere eseguita per il portafoglio %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Non è stato possibile connettersi al blocco migliore (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Non è stato possibile scollegare il blocco.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Nessuna porta disponibile per l'ascolto. Usa -listen=0 se vuoi procedere comunque.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Errore nella lettura del blocco.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Impossibile ripetere la scansione del portafoglio durante l'inizializzazione</translation>
</message>
@@ -4564,10 +4637,31 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore nella verifica del database</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Errore nella scrittura del blocco.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Non è stato possibile scrivere sul database degli indici di blocco.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Impossibile scrivere sul database delle monete.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished"> 
+Errore nella scrittura dei dati di ripristino.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">La rimozione della transazione è fallita: %s</translation>
</message>
<message>
+ <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
+ <translation type="unfinished">Il tasso di conversione(%s) è inferiore al minore tasso di conversione delle impostazioni(%s)</translation>
+ </message>
+ <message>
<source>Ignoring duplicate -wallet %s.</source>
<translation type="unfinished">Ignorando il duplicato -wallet %s.</translation>
</message>
@@ -4656,6 +4750,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Caricando il portafoglio...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Il peso massimo della transazione deve essere tra %d e %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Quantità mancante</translation>
</message>
@@ -4684,6 +4782,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Ingresso pre-selezionato non risolvibile %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">È stata impostata solo la direzione, senza autorizzazioni: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Prune non può essere configurato con un valore negativo.</translation>
</message>
@@ -4728,6 +4830,18 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">La sezione [%s] non è riconosciuta</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Signer non ha generato un indirizzo di ritorno</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Signer ha generato un indirizzo imprevisto %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Signer restituito un errore: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Firma transazione fallita</translation>
</message>
@@ -4756,6 +4870,19 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">L'esecuzione delle threads della rete sta iniziando...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Errore di sistema in fase di svuotamento: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished"> Errore di sistema in fase di caricamento del file di blocco esterno: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished"> 
+Errore di sistema in fase di salvataggio del blocco nel disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Il codice sorgente è disponibile in %s</translation>
</message>
@@ -4772,6 +4899,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Il portafoglio eviterà di pagare meno della tariffa minima di trasmissione.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Non c'è uno ScriptPubKeyManager per questo indirizzo</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Questo è un software sperimentale.</translation>
</message>
@@ -4812,10 +4943,6 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Transazione troppo grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossibile allocare memoria per -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Impossibile associarsi a %s su questo computer (l'associazione ha restituito l'errore %s)</translation>
</message>
@@ -4876,6 +5003,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Nuove regole non riconosciute sono state attivate (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opzione non riconosciuta "%s" fornita in -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Livello di logging globale non supportato %s=%s. Regole valide: %s.</translation>
</message>
@@ -4909,7 +5040,7 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
</message>
<message>
<source>Verifying wallet(s)…</source>
- <translation type="unfinished">Verificando il(i) portafoglio(portafogli)...</translation>
+ <translation type="unfinished">Verifica portafoglio(portafogli) in corso...</translation>
</message>
<message>
<source>Wallet needed to be rewritten: restart %s to complete</source>
diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts
index 1a92e34bb2..1b9a9c3ab0 100644
--- a/src/qt/locale/bitcoin_ja.ts
+++ b/src/qt/locale/bitcoin_ja.ts
@@ -3,7 +3,8 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">å³ã‚¯ãƒªãƒƒã‚¯ã§ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ãŸã¯ãƒ©ãƒ™ãƒ«ã‚’編集</translation>
+ <translation type="unfinished"> 
+å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ãŸã¯ãƒ©ãƒ™ãƒ«ã‚’編集ã—ã¾ã™ã€‚</translation>
</message>
<message>
<source>Create a new address</source>
@@ -64,8 +65,7 @@
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">ã“れらã¯æ”¯æ‰•ã„ã‚’å—ã‘å–ã‚‹ãŸã‚ã®ã€ã‚ãªãŸã® Bitcoin アドレスã§ã™ã€‚æ–°ã—ã„アドレスを作æˆã™ã‚‹ã«ã¯å—å–タブ内ã®ã€Œæ–°ã—ã„å—å–用アドレスを作æˆã€ãƒœã‚¿ãƒ³ã‚’使用ã—ã¾ã™ã€‚
-ç½²åã¯ã€ã‚¿ã‚¤ãƒ—ãŒã€Œãƒ¬ã‚¬ã‚·ãƒ¼ã€ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã¿å¯èƒ½ã§ã™ã€‚</translation>
+ <translation type="unfinished">ã“ã‚ŒãŒæ”¯æ‰•ã„ã‚’å—ã‘å–ã‚‹ãŸã‚ã®ã‚ãªãŸã®ãƒ“ットコインアドレスã§ã™ã€‚æ–°ã—ã„アドレスを作æˆã™ã‚‹ã«ã¯ã€å—信タブã®ã€Œæ–°ã—ã„å—信アドレスを作æˆã€ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦ãã ã•ã„。署åã¯ã€Œãƒ¬ã‚¬ã‚·ãƒ¼ã€ã‚¿ã‚¤ãƒ—ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã®ã¿å¯èƒ½ã§ã™ã€‚</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -81,7 +81,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">アドレス帳をエクスãƒãƒ¼ãƒˆ</translation>
+ <translation type="unfinished">アドレス帳データをエクスãƒãƒ¼ãƒˆã™ã‚‹</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ウォレット用ã®æ—§ãƒ‘スフレーズã¨æ–°ãƒ‘スフレーズを入力ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">続ã‘ã‚‹</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">戻る</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">ウォレットを暗å·åŒ–ã—ã¦ã‚‚ã€ã‚³ãƒ³ãƒ”ュータã«æ„ŸæŸ“ã—ãŸãƒžãƒ«ã‚¦ã‚§ã‚¢ãªã©ã«ã‚ˆã‚‹ Bitcoin ã®ç›—難を完全ã«é˜²ãã“ã¨ã¯ã§ããªã„ã“ã¨ã«ã”注æ„ãã ã•ã„。</translation>
</message>
@@ -429,7 +437,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished">%1 KB</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">デフォルトウォレット</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -523,7 +535,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">ウォレットを暗å·åŒ–(&amp;E)…</translation>
+ <translation type="unfinished">ウォレットを暗å·åŒ–…(&amp;E)</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -531,15 +543,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">ウォレットをãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—(&amp;B)…</translation>
+ <translation type="unfinished">ウォレットをãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—…(&amp;B)</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">パスフレーズを変更(&amp;C)…</translation>
+ <translation type="unfinished">パスフレーズを変更…(&amp;C)</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">メッセージã«ç½²å(&amp;m)…</translation>
+ <translation type="unfinished">メッセージを署å…(&amp;m)</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
@@ -547,7 +559,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Verify message…</source>
- <translation type="unfinished">メッセージを検証(&amp;V)…</translation>
+ <translation type="unfinished">メッセージを検証…(&amp;V)</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
@@ -555,11 +567,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">PSBTをファイルã‹ã‚‰èª­ã‚€(&amp;L)…</translation>
+ <translation type="unfinished">PSBTをファイルã‹ã‚‰èª­ã‚€â€¦(&amp;L)</translation>
</message>
<message>
<source>Open &amp;URI…</source>
- <translation type="unfinished">URIã‚’é–‹ã(&amp;U)…</translation>
+ <translation type="unfinished">URIã‚’é–‹ã…(&amp;U)</translation>
</message>
<message>
<source>Close Wallet…</source>
@@ -567,7 +579,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">ウォレットを作æˆ...</translation>
+ <translation type="unfinished">ウォレットを作æˆâ€¦</translation>
</message>
<message>
<source>Close All Wallets…</source>
@@ -591,23 +603,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">ヘッダをåŒæœŸä¸­ (%1%)...</translation>
+ <translation type="unfinished">ヘッダをåŒæœŸä¸­ (%1%)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
- <translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«åŒæœŸä¸­â€¦</translation>
+ <translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«åŒæœŸä¸­â€¦â€¦</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
- <translation type="unfinished">ディスク上ã®ãƒ–ロックをインデックス中...</translation>
+ <translation type="unfinished">ディスク上ã®ãƒ–ロックをインデックス中…</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">ディスク上ã®ãƒ–ロックを処ç†ä¸­...</translation>
+ <translation type="unfinished">ディスク上ã®ãƒ–ロックを処ç†ä¸­â€¦</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">ピアã«æŽ¥ç¶šä¸­â€¦</translation>
+ <translation type="unfinished">ピアã«æŽ¥ç¶šä¸­...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -665,7 +677,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">部分的ã«ç½²åã•ã‚ŒãŸBitcoinã®å–引を読ã¿è¾¼ã‚€</translation>
+ <translation type="unfinished">部分的ã«ç½²åã•ã‚ŒãŸãƒ“ットコインã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’読ã¿è¾¼ã¿</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -673,7 +685,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">部分的ã«ç½²åã•ã‚ŒãŸBitcoinã®å–引をクリップボードã‹ã‚‰èª­ã¿è¾¼ã‚€</translation>
+ <translation type="unfinished">部分的ã«ç½²åã•ã‚ŒãŸãƒ“ットコインã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’クリップボードã‹ã‚‰èª­ã¿è¾¼ã¿</translation>
</message>
<message>
<source>Node window</source>
@@ -735,19 +747,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Mask values</source>
- <translation type="unfinished">値を隠㙠(&amp;M)</translation>
+ <translation type="unfinished">&amp;値を隠ã™</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
<translation type="unfinished">概è¦ã‚¿ãƒ–ã«ã‚る値を隠ã™</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">デフォルトウォレット</translation>
- </message>
- <message>
<source>No wallets available</source>
- <translation type="unfinished">利用ã§ãるウォレットãŒã‚ã‚Šã¾ã›ã‚“</translation>
+ <translation type="unfinished">ウォレットã¯åˆ©ç”¨ã§ãã¾ã›ã‚“</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -787,23 +795,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">éš ã™ (&amp;H)</translation>
+ <translation type="unfinished">éš ã™</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">表示 (&amp;h)</translation>
+ <translation type="unfinished">表示</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>Bitcoinãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã® %n ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªæŽ¥ç¶šã€‚</numerusform>
+ <numerusform>%n ビットコイン ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªæŽ¥ç¶šã€‚</numerusform>
</translation>
</message>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">クリックã—ã¦ã€ã•ã‚‰ã«ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’表示。</translation>
+ <translation type="unfinished">クリックã—ã¦ã€ã‚ˆã‚Šå¤šãã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’表示。</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -813,16 +821,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
- <translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ´»å‹•ã‚’åœæ­¢ã™ã‚‹</translation>
+ <translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ´»å‹•ã‚’無効化ã™ã‚‹</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ´»å‹•ã‚’開始ã™ã‚‹</translation>
+ <translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ´»å‹•ã‚’有効化ã™ã‚‹</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">ヘッダーを事å‰åŒæœŸä¸­ (%1 %)…</translation>
+ <translation type="unfinished">事å‰åŒæœŸãƒ˜ãƒƒãƒ€ãƒ¼ (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -964,11 +972,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Received with label</source>
- <translation type="unfinished">ラベル</translation>
+ <translation type="unfinished">対応ã™ã‚‹ãƒ©ãƒ™ãƒ«</translation>
</message>
<message>
<source>Received with address</source>
- <translation type="unfinished">アドレス</translation>
+ <translation type="unfinished">対応ã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹</translation>
</message>
<message>
<source>Date</source>
@@ -976,7 +984,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Confirmations</source>
- <translation type="unfinished">承èªæ•°</translation>
+ <translation type="unfinished">検証数</translation>
</message>
<message>
<source>Confirmed</source>
@@ -1000,7 +1008,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
- <translation type="unfinished">å–引IDã¨ã‚¢ã‚¦ãƒˆãƒ—ットã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’コピー(&amp;I)</translation>
+ <translation type="unfinished">å–引IDã¨ã‚¢ã‚¦ãƒˆãƒ—ットã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’コピー</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
@@ -1012,7 +1020,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy quantity</source>
- <translation type="unfinished">金é¡ã‚’コピー</translation>
+ <translation type="unfinished">é¸æŠžæ•°ã‚’コピー</translation>
</message>
<message>
<source>Copy fee</source>
@@ -1044,11 +1052,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">%1 (%2) ã‹ã‚‰ã®ãŠé‡£ã‚Š</translation>
+ <translation type="unfinished">%1 (%2) ã‹ã‚‰ã®ãŠã¤ã‚Š</translation>
</message>
<message>
<source>(change)</source>
- <translation type="unfinished">(ãŠé‡£ã‚Šï¼‰</translation>
+ <translation type="unfinished">(ãŠã¤ã‚Šï¼‰</translation>
</message>
</context>
<context>
@@ -1069,7 +1077,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Create wallet warning</source>
- <translation type="unfinished">ウォレット作æˆã®è­¦å‘Š</translation>
+ <translation type="unfinished">ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã‚’ä½œæˆ - 警告</translation>
</message>
<message>
<source>Can't list signers</source>
@@ -1117,7 +1125,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">ウォレットを移行ã™ã‚‹</translation>
+ <translation type="unfinished">ウォレットã®ç§»è¡Œ</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1155,10 +1163,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">ウォレットã®èµ·å‹•ã«é–¢ã™ã‚‹è­¦å‘Š</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">デフォルトウォレット</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">ウォレットを開ã</translation>
@@ -2347,10 +2351,6 @@ BIP70ã«ã¯åºƒç¯„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼ä¸Šã®å•é¡ŒãŒã‚ã‚‹ã®ã§ã€ã‚¦ã‚©ãƒ¬
<translation type="unfinished">トランスãƒãƒ¼ãƒˆ</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">BIP324 ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ ID ã®16進文字列 (存在ã™ã‚‹å ´åˆ) 。</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">セッション ID</translation>
</message>
@@ -2457,6 +2457,10 @@ BIP70ã«ã¯åºƒç¯„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼ä¸Šã®å•é¡ŒãŒã‚ã‚‹ã®ã§ã€ã‚¦ã‚©ãƒ¬
<translation type="unfinished">æ–¹å‘/タイプ</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">BIP324 ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ ID ã®16進文字列</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">ã“ã®ãƒ”ã‚¢ã¨æŽ¥ç¶šã—ã¦ã„ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ロトコル: IPv4, IPv6, Onion, I2P, or CJDNS.</translation>
</message>
@@ -2649,6 +2653,10 @@ BIP70ã«ã¯åºƒç¯„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼ä¸Šã®å•é¡ŒãŒã‚ã‚‹ã®ã§ã€ã‚¦ã‚©ãƒ¬
<translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ´»å‹•ãŒåœæ­¢ã—ã¾ã—ãŸ</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">ãªã—</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ã©ã®ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã‚‚使ã‚ãšã«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¦ã„ã¾ã™</translation>
</message>
@@ -2905,7 +2913,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ラベルãªã—)</translation>
+ <translation type="unfinished">(ラベル無ã—)</translation>
</message>
<message>
<source>(no message)</source>
@@ -3204,7 +3212,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>%1 kvB</source>
<comment>PSBT transaction creation</comment>
<extracomment>When reviewing a newly created PSBT (via Send flow), the transaction fee is shown, with "virtual size" of the transaction displayed for context</extracomment>
- <translation type="unfinished"> %1 kvB</translation>
+ <translation type="unfinished">%1kvB</translation>
</message>
<message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
@@ -3264,10 +3272,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">%1 よりも高ã„手数料ã¯ã€æ³•å¤–ã«é«˜ã„手数料ã¨åˆ¤å®šã•ã‚Œã¾ã™ã€‚</translation>
</message>
- <message>
- <source>%1/kvB</source>
- <translation type="unfinished">%1 /kvB</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -3292,7 +3296,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ラベルãªã—)</translation>
+ <translation type="unfinished">(ラベル無ã—)</translation>
</message>
</context>
<context>
@@ -3376,8 +3380,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">メッセージã«ç½²å(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">ã‚ãªãŸãŒæ‰€æœ‰ã—ã¦ã„るアドレスã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚„契約書ã«ç½²åã‚’ã™ã‚‹ã“ã¨ã§ã€ãれらã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¸é€ã‚‰ã‚ŒãŸ Bitcoin ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã‚‹ã“ã¨ã‚’証明ã§ãã¾ã™ã€‚フィッシング攻撃者ãŒã‚ãªãŸã‚’騙ã—ã¦ã€ã‚ãªãŸã®èº«åˆ†æƒ…å ±ã«ç½²åã•ã›ã‚ˆã†ã¨ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€ã‚ˆãã‚ã‹ã‚‰ãªã„ã‚‚ã®ã‚„ランダムãªæ–‡å­—列ã«å¯¾ã—ã¦ç½²åã—ãªã„ã§ãã ã•ã„。ã‚ãªãŸãŒåŒæ„ã—ãŸã€ã‚ˆã詳細ã®è¨˜ã•ã‚ŒãŸæ–‡è¨€ã«ã®ã¿ç½²åã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">ã‚ãªãŸã®æ‰€æœ‰ã—ã¦ã„るレガシー(P2PKH)アドレスã«ã‚ˆã‚Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚„åˆæ„書ã«ç½²åã‚’ã™ã‚‹ã“ã¨ã§ã€ãれらアドレスã«å¯¾ã—ã¦é€ã‚‰ã‚ŒãŸãƒ“ットコインをå—ã‘å–ã‚‹ã“ã¨ãŒã§ãã‚‹ã“ã¨ã‚’証明ã§ãã¾ã™ã€‚フィッシング攻撃ã«ã‚ˆã‚Šä¸æ­£ã«ã‚ãªãŸã®è­˜åˆ¥æƒ…報を署åã•ã›ã‚‰ã‚Œã¦ã—ã¾ã†ã“ã¨ã‚’防ããŸã‚ã«ã€ä¸æ˜Žç¢ºãªã‚‚ã®ã‚„ランダムãªã‚‚ã®ã«å¯¾ã—ã¦ç½²åã—ãªã„よã†æ³¨æ„ã—ã¦ãã ã•ã„。ã‚ãªãŸãŒåŒæ„ã—ãŸã€ã‚ˆã詳細ã®è¨˜ã•ã‚ŒãŸæ–‡è¨€ã«ã®ã¿ç½²åã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3464,8 +3468,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">アドレスãŒæ­£ã—ã„ã‹ç¢ºã‹ã‚ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">入力ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«ç´ã¥ãéµãŒã‚ã‚Šã¾ã›ã‚“。</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">入力ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãƒ¬ã‚¬ã‚·ãƒ¼ (P2PKH) éµã‚’指ã—ã¦ã„ã¾ã›ã‚“。 SegWit ãŠã‚ˆã³ãã®ä»–ã®éž P2PKH アドレス タイプã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ç½²åã¯ã€%1ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。アドレスを確èªã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3768,7 +3772,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ラベルãªã—)</translation>
+ <translation type="unfinished">(ラベル無ã—)</translation>
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
@@ -4039,9 +4043,8 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBTãŒã‚³ãƒ”ーã•ã‚Œã¾ã—ãŸ</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">クリップボードã«ã‚³ãƒ”ーã—ã¾ã—ãŸ</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">手数料引ã上ã’ã®PSBTをクリップボードã«ã‚³ãƒ”ーã—ã¾ã—ãŸ</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4052,12 +4055,12 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">å–引ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">アドレスを表示ã§ãã¾ã›ã‚“</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">サイナーエラー</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">デフォルトウォレット</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">アドレスを表示ã§ãã¾ã›ã‚“</translation>
</message>
</context>
<context>
@@ -4191,10 +4194,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ウォレットファイルフォーマットãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。createfromdumpを使用ã™ã‚‹ã«ã¯ã€-format=&lt;format&gt;を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®æ—¥ä»˜ã¨æ™‚刻ãŒæ­£ã—ã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„ï¼ PCã®æ™‚計ãŒæ­£ã—ããªã„å ´åˆ %s ã¯æ­£ç¢ºã«å‹•ä½œã—ã¾ã›ã‚“。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">%s ãŒæœ‰ç”¨ã ã¨æ„Ÿã˜ã‚‰ã‚ŒãŸæ–¹ã¯ãœã²ãƒ—ロジェクトã¸ã®è²¢çŒ®ã‚’ãŠé¡˜ã„ã—ã¾ã™ã€‚ソフトウェアã®ã‚ˆã‚Šè©³ç´°ãªæƒ…å ±ã«ã¤ã„ã¦ã¯ %s ã‚’ã”覧ãã ã•ã„。</translation>
</message>
@@ -4303,10 +4302,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool ã¯æœ€ä½Žã§ã‚‚ %d MB å¿…è¦ã§ã™</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">致命的ãªå†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚詳細ã¯ãƒ‡ãƒãƒƒã‚°ç”¨ã®ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ« debug.log ã‚’å‚ç…§ã—ã¦ãã ã•ã„</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">-%s アドレス '%s' を解決ã§ãã¾ã›ã‚“</translation>
</message>
@@ -4355,6 +4350,12 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">未承èªã® UTXO ã¯æœªæ‰¿èªã®å–引ã®å·¨å¤§ãªã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«ä¾å­˜ã—ã¦ã„ã‚‹ãŸã‚ã€ãƒãƒ³ãƒ—料金ã®è¨ˆç®—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">スナップショットã®chainstateディレクトリ(%s)を削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚å†èµ·å‹•ã™ã‚‹å‰ã«æ‰‹å‹•ã§å‰Šé™¤ã—ã¦ãã ã•ã„。
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">無効㪠peers.dat ファイルã®åå‰ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚移動ã¾ãŸã¯å‰Šé™¤ã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。</translation>
</message>
@@ -4363,6 +4364,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">手数料推定ã«å¤±æ•—ã—ã¾ã—ãŸã€‚代替手数料ãŒç„¡åŠ¹ã§ã™ã€‚数ブロック待ã¤ã‹ã€%s オプションを有効ã«ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">ブロックファイルã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã“ã‚Œã¯I/Oエラーã®çµæžœã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">å…ƒã¸æˆ»ã™ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã“ã‚Œã¯I/Oエラーã®çµæžœã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">ä¸é©åˆ‡ãªã‚ªãƒ—ション: -dnsseed=1 ãŒæ˜Žç¤ºçš„ã«æŒ‡å®šã•ã‚Œã¾ã—ãŸãŒã€-onlynet 㯠IPv4/IPv6 ã¸ã®æŽ¥ç¶šã‚’ç¦æ­¢ã—ã¾ã™</translation>
</message>
@@ -4371,6 +4380,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s=&lt;amount&gt; オプションã«å¯¾ã™ã‚‹ä¸æ­£ãªé‡‘é¡: '%s' (å–引ã®åœæ»žé˜²æ­¢ã®ãŸã‚ã€æœ€å°ä¸­ç¶™æ‰‹æ•°æ–™ã® %s より大ãã„å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">最大トランザクションweightãŒã‚¤ãƒ³ãƒ—ットã®ãªã„トランザクションweightよりもå°ã•ã„</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">最大トランザクションweightãŒä½Žã™ãŽã‚‹ãŸã‚ã€ãŠé‡£ã‚Šç”¨ã®ã‚¢ã‚¦ãƒˆãƒ—ットã«å¯¾å¿œã§ãã¾ã›ã‚“</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">アウトãƒã‚¦ãƒ³ãƒ‰æŽ¥ç¶šãŒCJDNS (-onlynet=cjdns)ã«åˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ãŒã€-cjdnsreachableãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。</translation>
</message>
@@ -4387,6 +4404,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">アウトãƒã‚¦ãƒ³ãƒ‰æŽ¥ç¶šãŒi2p (-onlynet=i2p)ã«åˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ãŒã€-i2psamãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">「%sã€-&gt;「%sã€ã¸ã®å称変更ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§chainstate leveldbディレクトリã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ãŒã§ãã¾ã›ã‚“。</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">事å‰ã«é¸æŠžã•ã‚ŒãŸã‚¤ãƒ³ãƒ—ットã¨ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®è‡ªå‹•ã‚¤ãƒ³ãƒ—ットé¸æŠžã®çµ„ã¿åˆã‚ã›ãŒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®æœ€å¤§weightを超ãˆã¾ã—ãŸã€‚より少ãªã„金é¡ã‚’é€ä¿¡ã™ã‚‹ã‹ã€ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®UTXOを手動ã§çµ±åˆã—ã¦ã¿ã¦ãã ã•ã„</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">インプットã®ã‚µã‚¤ã‚ºãŒã€æœ€å¤§ã‚¦ã‚§ã‚¤ãƒˆã‚’超éŽã—ã¦ã„ã¾ã™ã€‚é€é‡‘é¡ã‚’減らã™ã‹ã€ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®UTXOを手動ã§é›†ç´„ã—ã¦ã¿ã¦ãã ã•ã„。</translation>
</message>
@@ -4429,6 +4454,10 @@ Please try running the latest software version.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">コンピューターã®æ—¥ä»˜ã¨æ™‚é–“ãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¨%d分以上ãšã‚Œã¦ã„るよã†ã§ã™ã€‚ã“ã‚Œã¯ã‚³ãƒ³ã‚»ãƒ³ã‚µã‚¹ã‚¨ãƒ©ãƒ¼ã«ã¤ãªãŒã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚コンピューターã®æ™‚計を確èªã—ãŸå¾Œã€ãƒŽãƒ¼ãƒ‰ã‚’å†èµ·å‹•ã™ã‚‹ã¨ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•ã‚Œãªããªã‚Šã¾ã™ã€‚å†èµ·å‹•ã—ãªã„å ´åˆã¯ã€å分ãªæ•°ã®æ–°ã—ã„アウトãƒã‚¦ãƒ³ãƒ‰ãƒ”ã‚¢ã«æŽ¥ç¶šã™ã‚‹ã¨è¡¨ç¤ºã•ã‚Œãªããªã‚Šã¾ã™ãŒã€ã“ã‚Œã«ã¯æ™‚é–“ãŒã‹ã‹ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚`getpeerinfo` RPCãŠã‚ˆã³ `getnetworkinfo` RPCメソッドã®`timeoffset`フィールドを調ã¹ã‚‹ã¨è©³ç´°ãŒå¾—られã¾ã™ã€‚</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4441,6 +4470,18 @@ Unable to restore backup of wallet.</source>
ウォレットã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を復元ã§ãã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebindã¯å—信接続ã®ã¿ã«ä½¿ç”¨ã§ãã¾ã™ï¼ˆ"out"ãŒæ¸¡ã•ã‚Œã¾ã—ãŸï¼‰</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">致命的ãªå†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚詳細ã¯ãƒ‡ãƒãƒƒã‚°ç”¨ã®ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ« debug.log ã‚’å‚ç…§ã—ã¦ãã ã•ã„:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">指定ã•ã‚ŒãŸãƒ–ロックãƒãƒƒã‚·ãƒ¥ã€Œ%sã€ã«å¯¾ã™ã‚‹assumeutxoデータãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">ブロック検証ãŒä¸­æ–­ã•ã‚Œã¾ã—ãŸ</translation>
</message>
@@ -4449,6 +4490,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">%s ã®è¨­å®šã¯ã€ [%s] セクションã«æ›¸ã‹ã‚ŒãŸå ´åˆã®ã¿ %s ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸é©ç”¨ã•ã‚Œã¾ã™ã€‚</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">潜在的ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢éšœå®³ã‚’示ã™ç ´æブロックãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">ç ´æã—ãŸãƒ–ロック データベースãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ</translation>
</message>
@@ -4477,6 +4522,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ダンプファイル %s ãŒå­˜åœ¨ã—ã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">楕円曲線暗å·ã®å¥å…¨æ€§ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸã€‚%sを終了ã—ã¾ã™ã€‚</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">ウォレットトランザクションã®å‰Šé™¤ã®ãŸã‚db txnã®ã‚³ãƒŸãƒƒãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ</translation>
</message>
@@ -4625,10 +4674,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">エラー: ウォレット%sã«å¯¾ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã§ãã¾ã›ã‚“</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">ベストブロック(%s)ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">ブロックã®åˆ‡æ–­ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">ãƒãƒ¼ãƒˆã®ãƒªãƒƒã‚¹ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚å¿…è¦ã§ã‚れ㰠-listen=0 を指定ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">ブロックã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">åˆæœŸåŒ–中ã«ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®å†ã‚¹ã‚­ãƒ£ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
</message>
@@ -4641,6 +4702,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">データベースã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">ブロックã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">ブロックインデックスデータベースã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">コインデータベースã¸ã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">å…ƒã¸æˆ»ã™ãƒ‡ãƒ¼ã‚¿ã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">å–引ã®å‰Šé™¤ã«å¤±æ•—: %s</translation>
</message>
@@ -4737,6 +4814,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ウォレットã®èª­ã¿è¾¼ã¿ä¸­â€¦</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">最大トランザクションweightã¯%dã‹ã‚‰%dã®é–“ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">金é¡ä¸è¶³</translation>
</message>
@@ -4765,6 +4846,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">事å‰é¸æŠžã•ã‚ŒãŸã‚¤ãƒ³ãƒ—ット%sãŒè§£æ±ºã§ãã¾ã›ã‚“</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">æ–¹å‘ã®ã¿ãŒè¨­å®šã•ã‚Œã¦ãŠã‚Šã€æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">剪定モードã®è¨­å®šå€¤ã¯è² ã®å€¤ã«ã¯ã§ãã¾ã›ã‚“。</translation>
</message>
@@ -4809,6 +4894,18 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">セクションå [%s] ã¯èªè­˜ã•ã‚Œã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">サイナーãŒã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’エコーã—ã¾ã›ã‚“ã§ã—ãŸ</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">サイナーãŒäºˆæœŸã—ãªã„アドレス%sをエコーã—ã¾ã—ãŸ</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">サイナーãŒã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã—ãŸ: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">å–引ã®ç½²åã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
</message>
@@ -4837,6 +4934,18 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¹ãƒ¬ãƒƒãƒ‰ã®èµ·å‹•ä¸­â€¦</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">フラッシュ中ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">外部ブロックファイルã®ãƒ­ãƒ¼ãƒ‰ä¸­ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">ブロックをディスクã«ä¿å­˜ä¸­ã«ã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">ソースコード㯠%s ã‹ã‚‰å…¥æ‰‹ã§ãã¾ã™ã€‚</translation>
</message>
@@ -4853,6 +4962,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ウォレットã¯æœ€å°ä¸­ç¶™æ‰‹æ•°æ–™ã‚’下回る金é¡ã¯æ”¯æ‰•ã„ã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã¯ScriptPubKeyManagerãŒã‚ã‚Šã¾ã›ã‚“</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">ã“ã‚Œã¯å®Ÿé¨“用ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚</translation>
</message>
@@ -4893,10 +5006,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">å–引ãŒå¤§ãã™ãŽã¾ã™</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">-maxsigcachesize ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">ã“ã®ã‚³ãƒ³ãƒ”ュータ㮠%s ã«ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“(%s エラーãŒè¿”ã•ã‚Œã¾ã—ãŸï¼‰</translation>
</message>
@@ -4957,6 +5066,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ä¸æ˜Žãªæ–°ãƒ«ãƒ¼ãƒ«ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ãƒˆã•ã‚Œã¾ã—㟠(versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished"> -test=&lt;option&gt;ã§æä¾›ã•ã‚ŒãŸã‚ªãƒ—ション「%sã€ãŒèªè­˜ã•ã‚Œã¾ã›ã‚“。</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">未サãƒãƒ¼ãƒˆã®ãƒ­ã‚°ãƒ¬ãƒ™ãƒ« %s=%s。 æ­£ã—ã„値ã¯: %s。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ka.ts b/src/qt/locale/bitcoin_ka.ts
index e15938e277..157fcc3376 100644
--- a/src/qt/locale/bitcoin_ka.ts
+++ b/src/qt/locale/bitcoin_ka.ts
@@ -176,6 +176,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">შეიყვáƒáƒœáƒ”თ ძველი სáƒáƒ˜áƒ“უმლრფრáƒáƒ–რდრáƒáƒ®áƒáƒšáƒ˜ სáƒáƒ˜áƒ“უმლრფრáƒáƒ–რსáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡áƒ—ვის</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">გáƒáƒ’რძელებáƒ</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">გáƒáƒ®áƒ¡áƒáƒ•áƒ“ეთ, რáƒáƒ› თქვენი სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ•áƒ áƒ ვერ უზრუნველყáƒáƒ¤áƒ¡ სრულáƒáƒ“ დáƒáƒ˜áƒªáƒ•áƒáƒ¡ თქვენი ბიტკáƒáƒ˜áƒœáƒ”ბის მáƒáƒžáƒáƒ áƒ•áƒ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რში მáƒáƒ•áƒœáƒ” პრáƒáƒ’რáƒáƒ›áƒ”ბით.</translation>
</message>
@@ -368,7 +372,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">ნáƒáƒ’ულისხმევი სáƒáƒ¤áƒ£áƒšáƒ”</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -433,6 +441,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ქსელური áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘რგáƒáƒ—იშულიáƒ.</translation>
</message>
<message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">მáƒáƒ áƒ˜áƒáƒœáƒ”ტული &lt;b&gt;ჩáƒáƒ áƒ—ულიáƒ&lt;/b&gt; :%1</translation>
+ </message>
+ <message>
<source>Send coins to a Bitcoin address</source>
<translation type="unfinished">მáƒáƒœáƒ”ტების გáƒáƒ’ზáƒáƒ•áƒœáƒ Bitcoin-მისáƒáƒ›áƒáƒ áƒ—ზე</translation>
</message>
@@ -642,10 +654,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ყველრსáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">ნáƒáƒ’ულისხმევი სáƒáƒ¤áƒ£áƒšáƒ”</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">áƒáƒ  áƒáƒ áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული სáƒáƒ¤áƒ£áƒšáƒ”.</translation>
</message>
@@ -923,10 +931,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ ვერ მáƒáƒ®áƒ”რხდáƒ</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">ნáƒáƒ’ულისხმევი სáƒáƒ¤áƒ£áƒšáƒ”</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">ღირსáƒáƒ¤áƒ£áƒšáƒ”</translation>
@@ -2333,10 +2337,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ მისáƒáƒ›áƒáƒ áƒ—ი დრსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">შეყვáƒáƒœáƒ˜áƒšáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡ კáƒáƒ•áƒ¨áƒ˜áƒ áƒ¨áƒ˜ გáƒáƒ¡áƒáƒ¦áƒ”ბთáƒáƒœ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">სáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ შეწყვეტილიáƒ.</translation>
</message>
@@ -2780,11 +2780,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">მáƒáƒœáƒ”ტების გáƒáƒ’ზáƒáƒ•áƒœáƒ</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">ნáƒáƒ’ულისხმევი სáƒáƒ¤áƒ£áƒšáƒ”</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2844,10 +2840,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">-maxmempool უნდრიყáƒáƒ¡ მინიმუმ %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">მáƒáƒ®áƒ“რფáƒáƒ¢áƒáƒšáƒ£áƒ áƒ˜ შიდრშეცდáƒáƒ›áƒ. გáƒáƒ›áƒáƒ áƒ—ვის დეტáƒáƒšáƒ”ბისთვის იხილეთ debug.log</translation>
- </message>
- <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">შენიშნულირბლáƒáƒ™áƒ—რბáƒáƒ–ის დáƒáƒ–იáƒáƒœáƒ”ბáƒ</translation>
</message>
diff --git a/src/qt/locale/bitcoin_kk.ts b/src/qt/locale/bitcoin_kk.ts
index d40c6e56a1..4346f22521 100644
--- a/src/qt/locale/bitcoin_kk.ts
+++ b/src/qt/locale/bitcoin_kk.ts
@@ -481,7 +481,7 @@
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 артта</translation>
+ <translation type="unfinished">%1 қалмады</translation>
</message>
<message>
<source>Catching up…</source>
@@ -489,7 +489,7 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Қате</translation>
+ <translation type="unfinished">қате</translation>
</message>
<message>
<source>Warning</source>
@@ -497,7 +497,7 @@
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Ðқпарат</translation>
+ <translation type="unfinished">ИнформациÑ</translation>
</message>
<message>
<source>Up to date</source>
diff --git a/src/qt/locale/bitcoin_kk@latin.ts b/src/qt/locale/bitcoin_kk@latin.ts
index 981b8a191c..af3d2abe58 100644
--- a/src/qt/locale/bitcoin_kk@latin.ts
+++ b/src/qt/locale/bitcoin_kk@latin.ts
@@ -481,7 +481,7 @@
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 артта</translation>
+ <translation type="unfinished">%1 қалмады</translation>
</message>
<message>
<source>Catching up…</source>
@@ -489,7 +489,7 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Қате</translation>
+ <translation type="unfinished">қате</translation>
</message>
<message>
<source>Warning</source>
@@ -497,7 +497,7 @@
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Ðқпарат</translation>
+ <translation type="unfinished">ИнформациÑ</translation>
</message>
<message>
<source>Up to date</source>
diff --git a/src/qt/locale/bitcoin_km.ts b/src/qt/locale/bitcoin_km.ts
index e62aee0aff..36d0852039 100644
--- a/src/qt/locale/bitcoin_km.ts
+++ b/src/qt/locale/bitcoin_km.ts
@@ -184,6 +184,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">វាយបញ្ចូលឃ្លាសម្ងាážáŸ‹áž…ាស់ និងឃ្លាសសម្លាážáŸ‹ážáŸ’មី សម្រាប់កាបូបចលáŸážážšáž”ស់អ្នក។</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">បន្áž</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">សូមចងចាំážáž¶áž€áž¶ážšáž¢áŸŠáž·áž“គ្រីបកាបូបរបស់អ្នកមិនអាចការពារបានពáŸáž‰áž›áŸáž‰áž“ូវ bitcoins របស់អ្នកពីការលួចដោយមáŸážšáŸ„គដែលឆ្លងកុំព្យូទáŸážšážšáž”ស់អ្នក។</translation>
</message>
@@ -372,7 +376,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished"> %1 kB</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">កាបូបលំនាំដើម</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -400,6 +408,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">បោះបង់កម្មវិធី</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;ប្រហែល %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">បង្ហាញពáŸážáŸáž˜áž¶áž“អំពី %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">អំពី &amp;Qt</translation>
</message>
@@ -642,6 +658,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">កាបូបMigrate</translation>
</message>
<message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished">បង្ហាញសារជំនួយ%1ដើម្បីទទួលបានបញ្ជីជាមួយនឹងជម្រើសបន្ទាážáŸ‹áž–ាក្យបញ្ជា Bitcoin ដែលអាចធ្វើទៅបាន</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">ážáž˜áŸ’លៃMask​(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">ážáž˜áŸ’លៃMaskនៅក្នុងážáŸáž”ទិដ្ឋភាពទូទៅ</translation>
+ </message>
+ <message>
<source>No wallets available</source>
<translation type="unfinished">មិនមានកាបូបអáŸáž¡áž·áž…ážáŸ’រូនិច</translation>
</message>
@@ -667,15 +695,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Window</source>
- <translation type="unfinished">&amp;វិនដូ</translation>
+ <translation type="unfinished">វិនដូ(&amp;W)</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">វិនដូចម្បង</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 អážáž·ážáž·áž‡áž“</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">&amp;លាក់</translation>
+ <translation type="unfinished">លាក់(&amp;H)</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">S&amp;របៀប</translation>
+ <translation type="unfinished">របៀប(&amp;S)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -706,6 +742,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">បើកសកម្មភាពបណ្ážáž¶áž‰</translation>
</message>
<message>
+ <source>Error: %1</source>
+ <translation type="unfinished">កំហុស៖%1</translation>
+ </message>
+ <message>
<source>Warning: %1</source>
<translation type="unfinished">ប្រុងប្រយáŸážáŸ’នៈ %1</translation>
</message>
@@ -888,6 +928,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ចម្លងážáž˜áŸ’លៃ</translation>
</message>
<message>
+ <source>Copy change</source>
+ <translation type="unfinished">ចម្លងការផ្លាស់ប្ážáž¼ážš</translation>
+ </message>
+ <message>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1បានចាក់សោរ)</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">អាច +/- %1 satoshi(s)ច្រើនក្នុងការបញ្ជូលមួយ។</translation>
</message>
@@ -1900,6 +1948,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">សកម្មភាពបណ្ážáž¶áž‰ ážáŸ’រូវបានដាក់អោយប្រើការលែងបាន។</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">មិន</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ប្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž”ញ្ជារដោយគ្មានកាបូបអáŸáž¡áž·áž…ážáŸ’រូនិច។</translation>
</message>
@@ -1908,6 +1960,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ctrl+T</translation>
</message>
<message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">ប្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž”ញ្ចារដោយប្រើ​ ៉​%1​​ ៉ កាបូបអáŸáž¡áž·áž…ážáŸ’រូនិច</translation>
+ </message>
+ <message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished">កំពុង​ប្រážáž·áž”ážáŸ’ážáž·â€¦</translation>
@@ -2027,7 +2083,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>Could not unlock wallet.</source>
<translation type="unfinished">មិនអាចបើកសោរ កាបូបអáŸáž¡áž·áž…ážáŸ’រូនិចបាន។</translation>
</message>
- </context>
+ <message>
+ <source>Could not generate new %1 address</source>
+ <translation type="unfinished">មិនអាចបង្កើážáž¢áž¶ážŸáž™ážŠáŸ’ឋាន%1ážáŸ’មី</translation>
+ </message>
+</context>
<context>
<name>ReceiveRequestDialog</name>
<message>
@@ -2078,7 +2138,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>Payment information</source>
<translation type="unfinished">áž–áŸážáŸáž˜áž¶áž“ទូរទាážáŸ‹áž”្រាក់</translation>
</message>
- </context>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">សំណើរសុំទូរទាážáŸ‹áž”្រាក់ដល់​ %1</translation>
+ </message>
+</context>
<context>
<name>RecentRequestsTableModel</name>
<message>
@@ -2091,7 +2155,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(គ្មាន​ស្លាក​)</translation>
+ <translation type="unfinished">(គ្មាន​ស្លាក​សញ្ញា)</translation>
</message>
<message>
<source>(no message)</source>
@@ -2233,6 +2297,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ចម្លងážáž˜áŸ’លៃ</translation>
</message>
<message>
+ <source>Copy change</source>
+ <translation type="unfinished">ចម្លងការផ្លាស់ប្ážáž¼ážš</translation>
+ </message>
+ <message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
<translation type="unfinished">ចុះហážáŸ’ážáž›áŸážáž¶áž›áž¾áž§áž”ករណáŸ</translation>
@@ -2247,6 +2315,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">កំណážáŸ‹áž‘ីážáž¶áŸ†áž„script អ្នកចុះហážáŸ’ážáž›áŸážáž¶ážáž¶áž„ក្រៅនៅក្នុងជម្រើស -&gt; កាបូប</translation>
</message>
<message>
+ <source>%1 to %2</source>
+ <translation type="unfinished">%1​ ទៅ %2</translation>
+ </message>
+ <message>
<source>To review recipient list click "Show Details…"</source>
<translation type="unfinished">ដើម្បីពិនិážáŸ’យមើលបញ្ជីអ្នកទទួលសូមចុច "បង្ហាញពáŸážáŸŒáž˜áž¶áž“លម្អិáž..."</translation>
</message>
@@ -2291,6 +2363,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">អ្នកអាចបង្កើនកម្រៃពáŸáž›áž€áŸ’រោយ( សញ្ញា ជំនួសដោយកម្រៃ BIP-125)។</translation>
</message>
<message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">សូមពិនិážáŸ’យសំណើរប្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž€áž¶ážšážšáž”ស់អ្នកឡើងវិញ។ វានឹងបង្កើážáž”្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž€áž¶ážšáž”៊ីážážáž‰ážŠáŸ‚លបានចុះហážáŸ’ážáž›áŸážáž¶ážŠáŸ„យផ្នែក (PSBT) ដែលអ្នកអាចរក្សាទុក ឬážážáž…ម្លង រួចហើយសូមចុះហážáŸ’ážáž›áŸážáž¶áŸ” ឧទាហរណ០កាបូបអáŸáž¡áž·áž…ážáŸ’រូនិចដែលមិនមានភ្ជាប់អ៊ីនធឺណáŸáž %1 ឬកាបូបដែលមានផ្នែករឹងដែលអាចធ្វើការជាមួយ​ PSBT។</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">ážáž¾áž¢áŸ’នកចង់បង្កើážáž”្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšáž“áŸáŸ‡áž‘áŸ?</translation>
@@ -2334,6 +2411,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ចំនួនលើសសមážáž»áž›áŸ’យរបស់អ្នក។</translation>
</message>
<message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">ចំនួនសរុបលើសសមážáž»áž›áŸ’យរបស់អ្នកនៅពáŸáž›ážŠáŸ‚លកម្រៃប្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž€áž¶ážš%1ážáŸ’រូវបានបូកបញ្ចូល។</translation>
+ </message>
+ <message>
<source>Duplicate address found: addresses should only be used once each.</source>
<translation type="unfinished">អាសយដ្ឋានស្ទួនážáŸ’រូវបានរកឃើញៈ គ្រប់អាសយដ្ឋានគួរážáŸ’រូវបានប្រើážáŸ‚ម្ážáž„</translation>
</message>
@@ -2341,6 +2422,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Transaction creation failed!</source>
<translation type="unfinished">បង្កើážáž”្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž€áž¶ážšáž˜áž·áž“ជោគជáŸáž™!</translation>
</message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation type="unfinished">កម្រៃážáŸ’ពស់ជាង %1 ចាážáŸ‹áž‘ុកážáž¶ážáž˜áŸ’លៃមិនសមស្រប។​</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -2350,7 +2435,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(គ្មាន​ស្លាក​)</translation>
+ <translation type="unfinished">(គ្មាន​ស្លាក​សញ្ញា)</translation>
</message>
</context>
<context>
@@ -2545,6 +2630,16 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">បានបោះបង់ចោល</translation>
</message>
<message>
+ <source>%1/unconfirmed</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
+ <translation type="unfinished">%1 មិនទាន់បានបញ្ចាក់</translation>
+ </message>
+ <message>
+ <source>%1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
+ <translation type="unfinished">%1​ ការបញ្ចាក់</translation>
+ </message>
+ <message>
<source>Status</source>
<translation type="unfinished">ស្ážáž¶áž“ភាព</translation>
</message>
@@ -2637,6 +2732,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TransactionDescDialog</name>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">លម្អិហ%1</translation>
+ </message>
+</context>
+<context>
<name>TransactionTableModel</name>
<message>
<source>Date</source>
@@ -2659,6 +2761,14 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">បានបោះបង់</translation>
</message>
<message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">កំពុងបញ្ចាក់(%1 នៃ %2 សáŸáž…ក្ážáž¸áž”ញ្ចាក់ដែលបានណែនាំ)</translation>
+ </message>
+ <message>
+ <source>Confirmed (%1 confirmations)</source>
+ <translation type="unfinished">បានបញ្ចាក់(%1 ការបញ្ចាក់)</translation>
+ </message>
+ <message>
<source>Conflicted</source>
<translation type="unfinished">បានប្រឆាំងážáž‘ល់គ្នា</translation>
</message>
@@ -2692,7 +2802,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(គ្មាន​ស្លាក​)</translation>
+ <translation type="unfinished">(គ្មាន​ស្លាក​សញ្ញា)</translation>
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
@@ -2815,10 +2925,18 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ការនាំចáŸáž‰áž”ានបរាជáŸáž™</translation>
</message>
<message>
+ <source>There was an error trying to save the transaction history to %1.</source>
+ <translation type="unfinished">មានបញ្ហាមួយក្នុងការព្យាយាមរក្សាទុកប្រវážáŸ’ážáž·áž”្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž€áž¶ážš %1។</translation>
+ </message>
+ <message>
<source>Exporting Successful</source>
<translation type="unfinished">កំពុងនាំចáŸáž‰ážŠáŸ„យជោគជáŸáž™</translation>
</message>
<message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">ប្រវážáŸ’ážáž”្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž€áž¶ážšáž”ានទទួលជោគជáŸáž™ និង​បានរក្សាទុក %1។</translation>
+ </message>
+ <message>
<source>Range:</source>
<translation type="unfinished">លំដាប់ពីៈ</translation>
</message>
@@ -2910,10 +3028,18 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ážážáž…ម្លងទុកមិនទទួលបានជោគជáŸáž™</translation>
</message>
<message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation type="unfinished">មានបញ្ហាក្នុងការព្យាយាម រក្សាទុកទិន្នáŸáž™áž€áž¶áž”ូបអáŸáž¡áž·áž…ážáŸ’រូនិច %1។</translation>
+ </message>
+ <message>
<source>Backup Successful</source>
<translation type="unfinished">ចំម្លងទុកដោយជោគជáŸáž™</translation>
</message>
<message>
+ <source>The wallet data was successfully saved to %1.</source>
+ <translation type="unfinished">ទិន្នáŸáž™áž€áž¶áž”ូបអáŸáž¡áž·áž…ážáŸ’រូនិច ážáŸ’រូវបានរក្សាទុកដោយជោគជáŸáž™ %1។</translation>
+ </message>
+ <message>
<source>Cancel</source>
<translation type="unfinished">ចាកចáŸáž‰</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ko.ts b/src/qt/locale/bitcoin_ko.ts
index ebf24eb372..9649183026 100644
--- a/src/qt/locale/bitcoin_ko.ts
+++ b/src/qt/locale/bitcoin_ko.ts
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ì§€ê°‘ì˜ ì´ì „ 비밀번호와 새로운 비밀번호를 입력하세요.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">계ì†í•˜ê¸°</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">뒤로가기</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">ì§€ê°‘ì„ ì•”í˜¸í™” í•´ë„ ì»´í“¨í„°ì— ë°”ì´ëŸ¬ìŠ¤ê°€ 있ì„ì‹œ 안전하지 않다는 ê²ƒì„ ì°¸ê³ í•˜ì„¸ìš”.</translation>
</message>
@@ -421,6 +429,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 기가바ì´íŠ¸</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">기본 지갑</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -730,10 +742,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">개요 탭ì—ì„œ ê°’ì„ ë§ˆìŠ¤í‚¹í•©ë‹ˆë‹¤.</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">기본 지갑</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">사용 가능한 블ë¡ì´ 없습니다.</translation>
</message>
@@ -1088,10 +1096,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">지갑 열기 경고</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">기본 지갑</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">지갑 열기</translation>
@@ -2499,6 +2503,10 @@ BIP70ì˜ ê´‘ë²”ìœ„í•œ 보안 결함으로 ì¸í•´ 모든 가맹ì ì—서는 지ê°
<translation type="unfinished">ë„¤íŠ¸ì›Œí¬ í™œë™ì´ 정지ë˜ì—ˆìŠµë‹ˆë‹¤.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">ì—†ìŒ</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">지갑 ì—†ì´ ëª…ë ¹ 실행</translation>
</message>
@@ -2520,8 +2528,7 @@ For more information on using this console, type %6.
3%3ê³¼ 4%4ì„ ì‚¬ìš©í•˜ì—¬ 글꼴 í¬ê¸° ì¦ê°€ ë˜ëŠ” ê°ì†Œí•˜ì„¸ìš”
사용 가능한 ëª…ë ¹ì˜ ê°œìš”ë¥¼ 보려면 5%5를 입력하십시오.
ì´ ì½˜ì†” ì‚¬ìš©ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì„ ë³´ë ¤ë©´ 6%6ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤.
-7%7 경고: ì‚¬ê¸°ê¾¼ë“¤ì€ ì‚¬ìš©ìžë“¤ì—게 ì—¬ê¸°ì— ëª…ë ¹ì„ ìž…ë ¥í•˜ë¼ê³  ë§í•˜ê³  활발히 ê¸ˆí’ˆì„ í›”ì¹©ë‹ˆë‹¤. 완전히 ì´í•´í•˜ì§€ ì•Šê³  ì´ ì½˜ì†”ì„ ì‚¬ìš©í•˜ì§€ 마십시오. 8%8
-</translation>
+7%7 경고: ì‚¬ê¸°ê¾¼ë“¤ì€ ì‚¬ìš©ìžë“¤ì—게 ì—¬ê¸°ì— ëª…ë ¹ì„ ìž…ë ¥í•˜ë¼ê³  ë§í•˜ê³  활발히 ê¸ˆí’ˆì„ í›”ì¹©ë‹ˆë‹¤. 완전히 ì´í•´í•˜ì§€ ì•Šê³  ì´ ì½˜ì†”ì„ ì‚¬ìš©í•˜ì§€ 마십시오. 8%8</translation>
</message>
<message>
<source>Executing…</source>
@@ -3178,10 +3185,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">메시지 서명(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">ë‹¹ì‹ ì´ í•´ë‹¹ 주소로 비트코ì¸ì„ ë°›ì„ ìˆ˜ 있다는 ê²ƒì„ ì¦ëª…하기 위해 메시지/í•©ì˜ë¬¸ì„ ê·¸ 주소로 서명할 수 있습니다. 피싱 ê³µê²©ì´ ë‹¹ì‹ ì„ ì†ì¼ 수 있으므로 ìž„ì˜ì˜ ë‚´ìš©ì´ë‚˜ 모호한 ë‚´ìš©ì— ì„œëª…í•˜ì§€ ì•Šë„ë¡ ì£¼ì˜í•˜ì„¸ìš”. ë‹¹ì‹ ì´ ë™ì˜í•˜ëŠ” 명확한 조항들ì—만 서명하세요.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">메세지를 서명할 ë¹„íŠ¸ì½”ì¸ ì£¼ì†Œ</translation>
</message>
@@ -3266,10 +3269,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">주소를 확ì¸í•˜ê³  다시 ì‹œë„하십시오.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">입력한 주소는 지갑내 키를 참조하지 않습니다.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">지갑 잠금 해제를 취소했습니다.</translation>
</message>
@@ -3828,11 +3827,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT 복사ë¨</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">í´ë¦½ë³´ë“œë¡œ 복사ë¨</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">ê±°ëž˜ì— ì„œëª… í•  수 없습니다.</translation>
</message>
@@ -3844,10 +3838,6 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Can't display address</source>
<translation type="unfinished">주소를 표시할 수 없습니다.</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">기본 지갑</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3960,10 +3950,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">shshhdchb bdfjj fb rciivfjb doffbfbdjdj</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">ì»´í“¨í„°ì˜ ë‚ ì§œì™€ ì‹œê°„ì´ ì˜¬ë°”ë¥¸ì§€ 확ì¸í•˜ì‹­ì‹œì˜¤! ì‹œê°„ì´ ìž˜ëª»ë˜ë©´ %sì€ ì œëŒ€ë¡œ ë™ìž‘하지 않습니다.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">%sê°€ 유용하다고 ìƒê°í•œë‹¤ë©´ 프로ì íŠ¸ì— 공헌해주세요. ì´ ì†Œí”„íŠ¸ì›¨ì–´ì— ëŒ€í•œ 보다 ìžì„¸í•œ 정보는 %s를 방문해 주십시오.</translation>
</message>
@@ -4036,10 +4022,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempoolì€ ìµœì†Œí•œ %d MB ì´ì–´ì•¼ 합니다</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">ì¹˜ëª…ì  ë‚´ë¶€ 오류 ë°œìƒ. ìƒì„¸í•œ ë‚´ìš©ì„ debug.log ì—ì„œ 확ì¸í•˜ì‹­ì‹œì˜¤</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">%s 주소를 확ì¸í•  수 없습니다: '%s'</translation>
</message>
@@ -4085,13 +4067,11 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Dump file %s does not exist.</source>
- <translation type="unfinished">íŒŒì¼ ë²„ë¦¬ê¸° 1%s 존재 안함
-</translation>
+ <translation type="unfinished">íŒŒì¼ ë²„ë¦¬ê¸° %s 존재 안함</translation>
</message>
<message>
<source>Error creating %s</source>
- <translation type="unfinished">만들기 오류 1%s
-</translation>
+ <translation type="unfinished">만들기 오류 %s</translation>
</message>
<message>
<source>Error initializing block database</source>
@@ -4162,6 +4142,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ê²€ì¦ ì‹¤íŒ¨</translation>
</message>
<message>
+ <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
+ <translation type="unfinished">수수료율 (%s)ì´ ìµœì†Œ 수수료율 설정 (%s)보다 낮습니다.</translation>
+ </message>
+ <message>
+ <source>Ignoring duplicate -wallet %s.</source>
+ <translation type="unfinished">중복 -지갑 %s를 무시합니다.</translation>
+ </message>
+ <message>
<source>Importing…</source>
<translation type="unfinished">불러오는 중...</translation>
</message>
@@ -4258,6 +4246,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ì—스íì—˜ë¼ì´íŠ¸ ë°ì´í„°ë² ì´ìŠ¤ : ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 확ì¸í•˜ëŠ” 실행문 ì¤€ë¹„ì— ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤ : %s.</translation>
</message>
<message>
+ <source>SQLiteDatabase: Failed to read database verification error: %s</source>
+ <translation type="unfinished">ì—스íì—˜ë¼ì´íŠ¸ ë°ì´í„°ë² ì´ìŠ¤ : ë°ì´í„°ë² ì´ìŠ¤ ì½ê¸°ë¥¼ 실패하였습니다: %s</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
<translation type="unfinished">ì—스íì—˜ë¼ì´íŠ¸ ë°ì´í„°ë² ì´ìŠ¤ : ì˜ˆìƒ ëª»í•œ 어플리케ì´ì…˜ ì•„ì´ë””. 예정: %u, ë°›ìŒ: %u</translation>
</message>
@@ -4362,6 +4354,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">알 수 없는 -blockfileterindex 값 %s.</translation>
</message>
<message>
+ <source>Unknown address type '%s'</source>
+ <translation type="unfinished">ì•Œ 수 없는 주소 í˜•ì‹ '%s'</translation>
+ </message>
+ <message>
<source>Unknown change type '%s'</source>
<translation type="unfinished">ì•Œ 수 없는 변경 í˜•ì‹ '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ku.ts b/src/qt/locale/bitcoin_ku.ts
index f8738fd9dc..9dc3995fa0 100644
--- a/src/qt/locale/bitcoin_ku.ts
+++ b/src/qt/locale/bitcoin_ku.ts
@@ -236,11 +236,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Ùایل</translation>
+ <translation type="unfinished">&amp;پەرگە</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;ڕێکخستنەکان</translation>
+ <translation type="unfinished">&amp;سازکارییەکان</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -263,7 +263,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">زانیاری</translation>
+ <translation type="unfinished">Agahî</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -612,7 +612,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(etîket tune)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -660,7 +662,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(etîket tune)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -755,7 +759,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(etîket tune)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -814,10 +820,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>bitcoin-core</name>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">تکایە بپشکنە کە بەروار و کاتی کۆمپیوتەرەکەت ڕاستە! ئەگەر کاژێرەکەت هەڵە بوو، %s بە دروستی کار ناکات.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">تکایە بەشداری بکە ئەگەر %s بەسوودت دۆزیەوە. سەردانی %s بکە بۆ زانیاری زیاتر دەربارەی نەرمواڵەکە.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ku_IQ.ts b/src/qt/locale/bitcoin_ku_IQ.ts
index adbdec36fb..3bec55511b 100644
--- a/src/qt/locale/bitcoin_ku_IQ.ts
+++ b/src/qt/locale/bitcoin_ku_IQ.ts
@@ -236,11 +236,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Ùایل</translation>
+ <translation type="unfinished">&amp;پەرگە</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;ڕێکخستنەکان</translation>
+ <translation type="unfinished">&amp;سازکارییەکان</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -612,7 +612,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ناونیشان نییە)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -660,7 +662,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ناونیشان نییە)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -755,7 +759,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ناونیشان نییە)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -814,10 +820,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>bitcoin-core</name>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">تکایە بپشکنە کە بەروار و کاتی کۆمپیوتەرەکەت ڕاستە! ئەگەر کاژێرەکەت هەڵە بوو، %s بە دروستی کار ناکات.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">تکایە بەشداری بکە ئەگەر %s بەسوودت دۆزیەوە. سەردانی %s بکە بۆ زانیاری زیاتر دەربارەی نەرمواڵەکە.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_la.ts b/src/qt/locale/bitcoin_la.ts
index 40964a4d31..8a564fcd2a 100644
--- a/src/qt/locale/bitcoin_la.ts
+++ b/src/qt/locale/bitcoin_la.ts
@@ -1,187 +1,7 @@
<TS version="2.1" language="la">
<context>
- <name>AddressBookPage</name>
- <message>
- <source>Create a new address</source>
- <translation type="unfinished">Crea novam inscriptionem</translation>
- </message>
- <message>
- <source>&amp;New</source>
- <translation type="unfinished">&amp;Novus</translation>
- </message>
- <message>
- <source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copia inscriptionem iam selectam in latibulum systematis</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation type="unfinished">&amp;Transcribe</translation>
- </message>
- <message>
- <source>C&amp;lose</source>
- <translation type="unfinished">C&amp;laude</translation>
- </message>
- <message>
- <source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Dele active selectam inscriptionem ex enumeratione</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation type="unfinished">Insere inscriptionem vel titulum ut quaeras</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporta data in hac tabella in plicam</translation>
- </message>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">&amp;Exporta</translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation type="unfinished">&amp;Dele</translation>
- </message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished">Elige quam peram mittere pecuniam</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Hae sunt inscriptiones mittendi pensitationes. Semper inspice quantitatem et inscriptionem accipiendi antequam nummos mittis.</translation>
- </message>
- <message>
- <source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;Copia Inscriptionem</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation type="unfinished">Copia &amp;Titulum</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation type="unfinished">&amp;Muta</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation type="unfinished">Exporta Index Inscriptionum</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation type="unfinished">Titulus</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Inscriptio</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(nullus titulus)</translation>
- </message>
-</context>
-<context>
- <name>AskPassphraseDialog</name>
- <message>
- <source>Passphrase Dialog</source>
- <translation type="unfinished">Dialogus Tesserae</translation>
- </message>
- <message>
- <source>Enter passphrase</source>
- <translation type="unfinished">Insere tesseram</translation>
- </message>
- <message>
- <source>New passphrase</source>
- <translation type="unfinished">Nova tessera</translation>
- </message>
- <message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">Itera novam tesseram</translation>
- </message>
- <message>
- <source>Show passphrase</source>
- <translation type="unfinished">Ostende tesseram</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation type="unfinished">Cifra cassidile</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Huic operationi necesse est tessera cassidili tuo ut cassidile reseret.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation type="unfinished">Resera cassidile</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation type="unfinished">Muta tesseram</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation type="unfinished">Confirma cifrationem cassidilis</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Monitio: Si cassidile tuum cifras et tesseram amittis, tu &lt;b&gt;AMITTES OMNES TUOS NUMMOS BITOS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">Certusne es te velle tuum cassidile cifrare?</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation type="unfinished">Cassidile cifratum</translation>
- </message>
- <message>
- <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">GRAVE: Oportet ulla prioria conservata quae fecisti de plica tui cassidilis reponi a nove generata cifrata plica cassidilis. Propter securitatem, prioria conservata de plica non cifrata cassidilis inutilia fiet simul atque incipis uti novo cifrato cassidili.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation type="unfinished">Cassidile cifrare abortum est</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">Cassidile cifrare abortum est propter internum errorem. Tuum cassidile cifratum non est.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Tesserae datae non eaedem sunt.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation type="unfinished">Cassidile reserare abortum est.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">Tessera inserta pro cassidilis decifrando prava erat.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">Tessera cassidilis successa est in mutando.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">Monitio: Litterae ut capitales seratae sunt!</translation>
- </message>
-</context>
-<context>
- <name>BanTableModel</name>
- <message>
- <source>Banned Until</source>
- <translation type="unfinished">Interdictum usque ad</translation>
- </message>
-</context>
-<context>
<name>QObject</name>
<message>
- <source>unknown</source>
- <translation type="unfinished">ignotum</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">Quantitas</translation>
</message>
@@ -365,34 +185,10 @@
<numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
- <message>
- <source>Sent transaction</source>
- <translation type="unfinished">Transactio missa</translation>
- </message>
- <message>
- <source>Incoming transaction</source>
- <translation type="unfinished">Transactio incipiens</translation>
- </message>
- <message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">Cassidile &lt;b&gt;cifratum&lt;/b&gt; est et iam nunc &lt;b&gt;reseratum&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">Cassidile &lt;b&gt;cifratum&lt;/b&gt; est et iam nunc &lt;b&gt;seratum&lt;/b&gt;</translation>
- </message>
</context>
<context>
<name>CoinControlDialog</name>
<message>
- <source>Bytes:</source>
- <translation type="unfinished">Octecti:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Quantitas:</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">Quantitas</translation>
</message>
@@ -414,52 +210,6 @@
</message>
</context>
<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">Cassidile</translation>
- </message>
- </context>
-<context>
- <name>EditAddressDialog</name>
- <message>
- <source>Edit Address</source>
- <translation type="unfinished">Muta Inscriptionem</translation>
- </message>
- <message>
- <source>&amp;Label</source>
- <translation type="unfinished">&amp;Titulus</translation>
- </message>
- <message>
- <source>&amp;Address</source>
- <translation type="unfinished">&amp;Inscriptio</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">Nova inscriptio mittendi</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation type="unfinished">Muta inscriptionem accipiendi</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation type="unfinished">Muta inscriptionem mittendi</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">Inscriptio inserta "%1" non valida inscriptio Bitcoin est.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Non potuisse cassidile reserare</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation type="unfinished">Generare novam clavem abortum est.</translation>
- </message>
-</context>
-<context>
<name>Intro</name>
<message numerus="yes">
<source>%n GB of space available</source>
@@ -492,46 +242,8 @@
</message>
</context>
<context>
- <name>HelpMessageDialog</name>
- <message>
- <source>version</source>
- <translation type="unfinished">versio</translation>
- </message>
- <message>
- <source>Command-line options</source>
- <translation type="unfinished">Optiones mandati initiantis</translation>
- </message>
-</context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">Schema</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Hora postremi frusti</translation>
- </message>
- </context>
-<context>
- <name>OpenURIDialog</name>
- <message>
- <source>Paste address from clipboard</source>
- <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">Glutina inscriptionem ex latibulo</translation>
- </message>
-</context>
-<context>
<name>OptionsDialog</name>
<message>
- <source>Options</source>
- <translation type="unfinished">Optiones</translation>
- </message>
- <message>
- <source>&amp;Main</source>
- <translation type="unfinished">&amp;Princeps</translation>
- </message>
- <message>
<source>Reset all client options to default.</source>
<translation type="unfinished">Reconstitue omnes optiones clientis ad praedefinita.</translation>
</message>
@@ -673,202 +385,14 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">Resultato URI nimis longo, conare minuere verba pro titulo / nuntio.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Error codificandi URI in codicem QR.</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">Salva codicem QR</translation>
- </message>
- </context>
-<context>
- <name>RPCConsole</name>
- <message>
- <source>Client version</source>
- <translation type="unfinished">Versio clientis</translation>
- </message>
- <message>
- <source>&amp;Information</source>
- <translation type="unfinished">&amp;Informatio</translation>
- </message>
- <message>
- <source>Startup time</source>
- <translation type="unfinished">Tempus initiandi</translation>
- </message>
- <message>
- <source>Network</source>
- <translation type="unfinished">Rete</translation>
- </message>
- <message>
- <source>Number of connections</source>
- <translation type="unfinished">Numerus conexionum</translation>
- </message>
- <message>
- <source>Block chain</source>
- <translation type="unfinished">Catena frustorum</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Hora postremi frusti</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished">&amp;Aperi</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">&amp;Terminale</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">Debug catalogi plica</translation>
- </message>
- <message>
- <source>Clear console</source>
- <translation type="unfinished">Vacuefac terminale</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">Ad</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">Ab</translation>
- </message>
- </context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>&amp;Amount:</source>
- <translation type="unfinished">Quantitas:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Titulus:</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">Nuntius:</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Non potuisse cassidile reserare</translation>
- </message>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Quantitas:</translation>
- </message>
- <message>
- <source>Label:</source>
- <translation type="unfinished">Titulus:</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Nuntius:</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">&amp;Copia Inscriptionem</translation>
- </message>
- </context>
-<context>
<name>RecentRequestsTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">Dies</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Titulus</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Nuntius</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(nullus titulus)</translation>
</message>
</context>
<context>
<name>SendCoinsDialog</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">Mitte Nummos</translation>
- </message>
- <message>
- <source>Insufficient funds!</source>
- <translation type="unfinished">Inopia nummorum</translation>
- </message>
- <message>
- <source>Bytes:</source>
- <translation type="unfinished">Octecti:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Quantitas:</translation>
- </message>
- <message>
- <source>Transaction Fee:</source>
- <translation type="unfinished">Transactionis merces:</translation>
- </message>
- <message>
- <source>Send to multiple recipients at once</source>
- <translation type="unfinished">Mitte pluribus accipientibus simul</translation>
- </message>
- <message>
- <source>Add &amp;Recipient</source>
- <translation type="unfinished">Adde &amp;Accipientem</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">Vacuefac &amp;Omnia</translation>
- </message>
- <message>
- <source>Balance:</source>
- <translation type="unfinished">Pendendum:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation type="unfinished">Confirma actionem mittendi</translation>
- </message>
- <message>
- <source>S&amp;end</source>
- <translation type="unfinished">&amp;Mitte</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation type="unfinished">Copia quantitatem</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">Transactionis merces</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation type="unfinished">Confirma mittendum nummorum</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">Oportet quantitatem ad pensandum maiorem quam 0 esse.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation type="unfinished">Quantitas est ultra quod habes.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">Quantitas est ultra quod habes cum merces transactionis %1 includitur.</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -882,187 +406,7 @@
</message>
</context>
<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>A&amp;mount:</source>
- <translation type="unfinished">&amp;Quantitas:</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">Pensa &amp;Ad:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Titulus:</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Glutina inscriptionem ex latibulo</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Nuntius:</translation>
- </message>
- </context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Signationes - Signa / Verifica nuntium</translation>
- </message>
- <message>
- <source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;Signa Nuntium</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Glutina inscriptionem ex latibulo</translation>
- </message>
- <message>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished">Insere hic nuntium quod vis signare</translation>
- </message>
- <message>
- <source>Signature</source>
- <translation type="unfinished">Signatio</translation>
- </message>
- <message>
- <source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">Copia signationem in latibulum systematis</translation>
- </message>
- <message>
- <source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Signa nuntium ut demonstres hanc inscriptionem Bitcoin a te possessa esse</translation>
- </message>
- <message>
- <source>Sign &amp;Message</source>
- <translation type="unfinished">Signa &amp;Nuntium</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">Reconstitue omnes campos signandi nuntii</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">Vacuefac &amp;Omnia</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">&amp;Verifica Nuntium</translation>
- </message>
- <message>
- <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Verifica nuntium ut cures signatum esse cum specifica inscriptione Bitcoin</translation>
- </message>
- <message>
- <source>Verify &amp;Message</source>
- <translation type="unfinished">Verifica &amp;Nuntium</translation>
- </message>
- <message>
- <source>Reset all verify message fields</source>
- <translation type="unfinished">Reconstitue omnes campos verificandi nuntii</translation>
- </message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Clicca "Signa Nuntium" ut signatio generetur</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation type="unfinished">Inscriptio inserta non valida est.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation type="unfinished">Sodes inscriptionem proba et rursus conare.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Inserta inscriptio clavem non refert.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation type="unfinished">Cassidilis reserare cancellatum est.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation type="unfinished">Clavis privata absens est pro inserta inscriptione.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation type="unfinished">Nuntium signare abortum est.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation type="unfinished">Nuntius signatus.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation type="unfinished">Signatio decodificari non potuit.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">Sodes signationem proba et rursus conare.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation type="unfinished">Signatio non convenit digesto nuntii</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation type="unfinished">Nuntium verificare abortum est.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">Nuntius verificatus.</translation>
- </message>
-</context>
-<context>
<name>TransactionDesc</name>
- <message>
- <source>%1/unconfirmed</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
- <translation type="unfinished">%1/non confirmata</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
- <translation type="unfinished">%1 confirmationes</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Dies</translation>
- </message>
- <message>
- <source>Source</source>
- <translation type="unfinished">Fons</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation type="unfinished">Generatum</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">Ab</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">ignotum</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">Ad</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">inscriptio propria</translation>
- </message>
- <message>
- <source>label</source>
- <translation type="unfinished">titulus</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation type="unfinished">Creditum</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -1071,199 +415,28 @@
</translation>
</message>
<message>
- <source>not accepted</source>
- <translation type="unfinished">non acceptum</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation type="unfinished">Debitum</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">Transactionis merces</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation type="unfinished">Cuncta quantitas</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Nuntius</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">Annotatio</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation type="unfinished">ID transactionis</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation type="unfinished">Informatio de debug</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation type="unfinished">Transactio</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation type="unfinished">Lectenda</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">Quantitas</translation>
</message>
- <message>
- <source>true</source>
- <translation type="unfinished">verum</translation>
- </message>
- <message>
- <source>false</source>
- <translation type="unfinished">falsum</translation>
- </message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
- <message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Haec tabula monstrat descriptionem verbosam transactionis</translation>
- </message>
</context>
<context>
<name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">Dies</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">Typus</translation>
</message>
<message>
- <source>Label</source>
- <translation type="unfinished">Titulus</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">Confirmatum (%1 confirmationes)</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation type="unfinished">Generatum sed non acceptum</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Acceptum cum</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation type="unfinished">Acceptum ab</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Missum ad</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Fossa</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(nullus titulus)</translation>
</message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">Status transactionis. Supervola cum mure ut monstretur numerus confirmationum.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation type="unfinished">Dies et tempus quando transactio accepta est.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation type="unfinished">Typus transactionis.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Quantitas remota ex pendendo aut addita ei.</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionView</name>
<message>
- <source>All</source>
- <translation type="unfinished">Omne</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">Hodie</translation>
- </message>
- <message>
- <source>This week</source>
- <translation type="unfinished">Hac hebdomade</translation>
- </message>
- <message>
- <source>This month</source>
- <translation type="unfinished">Hoc mense</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation type="unfinished">Postremo mense</translation>
- </message>
- <message>
- <source>This year</source>
- <translation type="unfinished">Hoc anno</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Acceptum cum</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Missum ad</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Fossa</translation>
- </message>
- <message>
- <source>Other</source>
- <translation type="unfinished">Alia</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation type="unfinished">Quantitas minima</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">Confirmatum</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Dies</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">Typus</translation>
</message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Titulus</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Inscriptio</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation type="unfinished">Intervallum:</translation>
- </message>
- <message>
- <source>to</source>
- <translation type="unfinished">ad</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletFrame</name>
<message>
@@ -1271,97 +444,4 @@
<translation type="unfinished">Creare novum cassidilium</translation>
</message>
</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">Mitte Nummos</translation>
- </message>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">&amp;Exporta</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporta data in hac tabella in plicam</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation type="unfinished">Conserva cassidile</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation type="unfinished">Conservare abortum est.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation type="unfinished">Successum in conservando</translation>
- </message>
- </context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <translation type="unfinished">Hoc est prae-dimittum experimentala aedes - utere eo periculo tuo proprio - nolite utere fodendo vel applicationibus mercatoriis</translation>
- </message>
- <message>
- <source>Corrupted block database detected</source>
- <translation type="unfinished">Corruptum databasum frustorum invenitur</translation>
- </message>
- <message>
- <source>Do you want to rebuild the block database now?</source>
- <translation type="unfinished">Visne reficere databasum frustorum iam?</translation>
- </message>
- <message>
- <source>Done loading</source>
- <translation type="unfinished">Completo lengendi</translation>
- </message>
- <message>
- <source>Error initializing block database</source>
- <translation type="unfinished">Error initiando databasem frustorum</translation>
- </message>
- <message>
- <source>Error initializing wallet database environment %s!</source>
- <translation type="unfinished">Error initiando systematem databasi cassidilis %s!</translation>
- </message>
- <message>
- <source>Error loading block database</source>
- <translation type="unfinished">Error legendo frustorum databasem</translation>
- </message>
- <message>
- <source>Error opening block database</source>
- <translation type="unfinished">Error aperiendo databasum frustorum</translation>
- </message>
- <message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Non potuisse auscultare in ulla porta. Utere -listen=0 si hoc vis.</translation>
- </message>
- <message>
- <source>Insufficient funds</source>
- <translation type="unfinished">Inopia nummorum</translation>
- </message>
- <message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">Inopia descriptorum plicarum.</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">Signandum transactionis abortum est</translation>
- </message>
- <message>
- <source>Transaction amount too small</source>
- <translation type="unfinished">Magnitudo transactionis nimis parva</translation>
- </message>
- <message>
- <source>Transaction too large</source>
- <translation type="unfinished">Transactio nimis magna</translation>
- </message>
- <message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">Ignotum rete specificatum in -onlynet: '%s'</translation>
- </message>
- </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_lt.ts b/src/qt/locale/bitcoin_lt.ts
index 1b7471cd92..d589420a97 100644
--- a/src/qt/locale/bitcoin_lt.ts
+++ b/src/qt/locale/bitcoin_lt.ts
@@ -94,6 +94,10 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Bandant išsaugoti adresų sąrašą - įvyko klaida keliant į %1. Prašome bandyti dar kartą.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">SiunÄiami adresai -%1</translation>
+ </message>
+ <message>
<source>Receiving addresses - %1</source>
<translation type="unfinished">Gaunami adresai - %1</translation>
</message>
@@ -339,7 +343,11 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">numatyta piniginÄ—</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -552,10 +560,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Rodyti %1 pagalbos žinutę su Bitcoin pasirinkimo komandomis</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">numatyta piniginÄ—</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Piniginių nėra</translation>
</message>
@@ -826,10 +830,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Piniginės atidarymo įspėjimas</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">numatyta piniginÄ—</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Atidaryti PiniginÄ™</translation>
@@ -1797,6 +1797,10 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Tinklo veikla išjungta</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">NÄ— vienas</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Vykdyti komandÄ… be jokios piniginÄ—s</translation>
</message>
@@ -2359,10 +2363,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Patikrinkite adresÄ… ir bandykite dar kartÄ….</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Įvestas adresas nėra susijęs su raktu.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Piniginės atrakinimas buvo atšauktas.</translation>
</message>
@@ -2806,11 +2806,7 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<source>Could not commit transaction</source>
<translation type="unfinished">Nepavyko įvykdyti sandorio</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">numatyta piniginÄ—</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_lv.ts b/src/qt/locale/bitcoin_lv.ts
index 6cea8ba1aa..467811a0e3 100644
--- a/src/qt/locale/bitcoin_lv.ts
+++ b/src/qt/locale/bitcoin_lv.ts
@@ -287,6 +287,10 @@
<translation type="unfinished">&amp;Par %1</translation>
</message>
<message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">RÄdÄ«t informÄciju par %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">Par &amp;Qt</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mi.ts b/src/qt/locale/bitcoin_mi.ts
index 8dc535cd68..92ac490e8e 100644
--- a/src/qt/locale/bitcoin_mi.ts
+++ b/src/qt/locale/bitcoin_mi.ts
@@ -244,7 +244,7 @@ Ko te whakakÄ« i Ä“nei whakaaronga e taea ana anake ki ngÄ whakararuraru o te m
</message>
<message>
<source>Runaway exception</source>
- <translation type="unfinished">&lt;text_to_translate&gt;TÅ«kino whakawhiti&lt;/text_to_translate&gt;</translation>
+ <translation type="unfinished">TÅ«kino whakawhiti</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
@@ -632,10 +632,6 @@ Ko te whakakÄ« i Ä“nei whakaaronga e taea ana anake ki ngÄ whakararuraru o te m
<translation type="unfinished">He whakawhitiwhitinga nui rawa te whakapau kaha</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">KÄore e taea te whakararuraru i te mahere mÅ te -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">KÄore e taea te whakakÅtuitui ki %s i tÄ“nei rorohiko (kua whakahoki te whakakÅtuitui i te hapa %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mk.ts b/src/qt/locale/bitcoin_mk.ts
index 9fd41c2646..805cd3bfd2 100644
--- a/src/qt/locale/bitcoin_mk.ts
+++ b/src/qt/locale/bitcoin_mk.ts
@@ -365,6 +365,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Паричник по подразбирање</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -463,7 +467,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Шифрирање на личните клучеви што припаѓаат на вашиот паричник</translation>
+ <translation type="unfinished">Криптирај ги приватните клучеви кои припаѓаат на твојот паричник</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -515,7 +519,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;ПоÑтавки</translation>
+ <translation type="unfinished">&amp;ПодеÑувања</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -571,7 +575,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 зад</translation>
+ <translation type="unfinished">%1 позади</translation>
</message>
<message>
<source>Catching up…</source>
@@ -591,7 +595,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Внимание</translation>
+ <translation type="unfinished">Предупредување</translation>
</message>
<message>
<source>Information</source>
@@ -635,7 +639,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Отвори го паричникот</translation>
+ <translation type="unfinished">Отвори паричник</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -672,10 +676,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Прикриј ги вредноÑтите во разделот Преглед</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Паричник по подразбирање</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ðема доÑтапни паричници</translation>
</message>
@@ -894,10 +894,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Паричник по подразбирање</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Отвори паричник</translation>
@@ -1343,11 +1339,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">ИÑпраќање</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Паричник по подразбирање</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_ml.ts b/src/qt/locale/bitcoin_ml.ts
index 675e8da4a8..15cb5e8cfa 100644
--- a/src/qt/locale/bitcoin_ml.ts
+++ b/src/qt/locale/bitcoin_ml.ts
@@ -89,6 +89,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">കോമയാൽ വേർതിരിചàµà´š ഫയൽ (* .csv)</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">à´¸àµà´µàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨ വിലാസങàµà´™àµ¾ - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">à´¸àµà´µàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨ വിലാസങàµà´™àµ¾ - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">കയറàµà´±àµà´®à´¤à´¿ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ</translation>
</message>
@@ -338,7 +346,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">à´¸àµà´¥à´¿à´°à´‚ ആയ വാലറàµà´±àµ</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -395,7 +407,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet:</source>
- <translation type="unfinished">പണസഞàµà´šà´¿ </translation>
+ <translation type="unfinished">വാലറàµà´±àµ:</translation>
</message>
<message>
<source>Network activity disabled.</source>
@@ -599,10 +611,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">അവലോകന ടാബിൽ മൂലàµà´¯à´™àµà´™àµ¾ മാസàµà´•àµ ചെയàµà´¯àµà´•</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">à´¸àµà´¥à´¿à´°à´‚ ആയ വാലറàµà´±àµ</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">വാലറàµà´±àµ à´’à´¨àµà´¨àµà´‚ ലഭàµà´¯à´‚ à´…à´²àµà´² </translation>
</message>
@@ -857,10 +865,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">à´¸àµà´¥à´¿à´°à´‚ ആയ വാലറàµà´±àµ</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">വാലറàµà´±àµ à´¤àµà´±à´•àµà´•àµà´• </translation>
@@ -1477,13 +1481,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">à´¸àµà´¥à´¿à´°à´‚ ആയ വാലറàµà´±àµ</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_mn.ts b/src/qt/locale/bitcoin_mn.ts
index 222018e036..ac0b17d952 100644
--- a/src/qt/locale/bitcoin_mn.ts
+++ b/src/qt/locale/bitcoin_mn.ts
@@ -243,6 +243,10 @@
<translation type="unfinished">ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð°Ð°Ñ Ð“Ð°Ñ€Ð°Ñ…</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;Тухай %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">&amp;Клиентийн тухай</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ms.ts b/src/qt/locale/bitcoin_ms.ts
index 613a118e45..7dfe4c38e7 100644
--- a/src/qt/locale/bitcoin_ms.ts
+++ b/src/qt/locale/bitcoin_ms.ts
@@ -36,8 +36,7 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">
-Alihkan fail data ke dalam tab semasa</translation>
+ <translation type="unfinished">Alihkan fail data ke dalam tab semasa</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -81,8 +80,12 @@ Alihkan fail data ke dalam tab semasa</translation>
<translation type="unfinished">Terdapat ralat semasa cubaan menyimpan senarai alamat kepada %1. Sila cuba lagi.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Alamat Kirim - %1</translation>
+ </message>
+ <message>
<source>Receiving addresses - %1</source>
- <translation type="unfinished">Alamat Terima - %1</translation>
+ <translation type="unfinished">Alamat Penerima - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -228,7 +231,12 @@ Alihkan fail data ke dalam tab semasa</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">dompet lalai
+</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -373,11 +381,6 @@ Alihkan fail data ke dalam tab semasa</translation>
<source>Close wallet</source>
<translation type="unfinished">Tutup Wallet</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">dompet lalai
-</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -396,11 +399,6 @@ Alihkan fail data ke dalam tab semasa</translation>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">dompet lalai
-</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Buka Wallet</translation>
@@ -548,14 +546,6 @@ Alihkan fail data ke dalam tab semasa</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">dompet lalai
-</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
@@ -563,8 +553,7 @@ Alihkan fail data ke dalam tab semasa</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">
-Alihkan fail data ke dalam tab semasa</translation>
+ <translation type="unfinished">Alihkan fail data ke dalam tab semasa</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_mt.ts b/src/qt/locale/bitcoin_mt.ts
index e26087fe80..45e55cab45 100644
--- a/src/qt/locale/bitcoin_mt.ts
+++ b/src/qt/locale/bitcoin_mt.ts
@@ -340,7 +340,11 @@ L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">kartiera default</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -640,10 +644,6 @@ L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</translation>
<translation type="unfinished">Maskra l-valuri fit-tab Ħarsa ġenerali</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">kartiera default</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ebda kartieri disponibbli</translation>
</message>
@@ -839,10 +839,6 @@ L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</translation>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">kartiera default</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Iftaħ Kartiera</translation>
@@ -1057,13 +1053,6 @@ L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">kartiera default</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts
index 015496d587..06b99f7d5b 100644
--- a/src/qt/locale/bitcoin_nb.ts
+++ b/src/qt/locale/bitcoin_nb.ts
@@ -175,6 +175,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Skriv inn den gamle passordfrasen og den nye passordfrasen for lommeboken.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Fortsett</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Husk at å kryptere lommeboken ikke vil beskytte dine bitcoins fullstendig fra å bli stjålet av skadevare som infiserer datamaskinen din.</translation>
</message>
@@ -382,7 +386,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n år</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standard lommebok</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -434,6 +442,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Lag en ny lommebok</translation>
</message>
<message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">&amp;Minimer</translation>
+ </message>
+ <message>
<source>Wallet:</source>
<translation type="unfinished">Lommebok:</translation>
</message>
@@ -456,7 +468,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Endre passordfrasen for kryptering av lommeboken</translation>
+ <translation type="unfinished">Endre passordsetningen for kryptering av lommeboken</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -680,10 +692,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Masker verdiene i oversiktstabben</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standard lommebok</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ingen lommebøker tilgjengelig</translation>
</message>
@@ -1005,10 +1013,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Advasel om åpen lommebok.</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standard lommebok</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ã…pne Lommebok</translation>
@@ -1981,6 +1985,14 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Datamappe</translation>
</message>
<message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">For å spesifisere en ikke-standardplassering av datakatalogen, bruk alternativet '%1'.</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">For å spesifisere en ikke-standardplassering for blokkeringsmappen bruker du alternativet '%1'.</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">Oppstartstidspunkt</translation>
</message>
@@ -2282,6 +2294,10 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Nettverksaktivitet avskrudd</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ingen</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Utfør kommando uten noen lommebok</translation>
</message>
@@ -2684,6 +2700,14 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Cr &amp; eate Usignert</translation>
</message>
<message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">Oppretter en delvis signert Bitcoin-transaksjon (PSBT) for bruk med f.eks. en offline%1 lommebok eller en PSBT-kompatibel maskinvarelommebok.</translation>
+ </message>
+ <message>
+ <source>%1 to '%2'</source>
+ <translation type="unfinished">%1 til '%2'</translation>
+ </message>
+ <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 til %2</translation>
</message>
@@ -2895,10 +2919,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">&amp;Signer Melding</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Du kan signere meldinger/avtaler med adresser for å bevise at du kan motta bitcoins sendt til dem. Vær forsiktig med å signere noe vagt eller tilfeldig, siden phishing-angrep kan prøve å lure deg til å signere din identitet over til dem. Bare signer fullt detaljerte utsagn som du er enig i.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-adressen meldingen skal signeres med</translation>
</message>
@@ -2983,10 +3003,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Sjekk adressen og prøv igjen.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Innskrevet adresse refererer ikke til noen nøkkel.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Opplåsning av lommebok ble avbrutt.</translation>
</message>
@@ -3520,10 +3536,6 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<source>Can't display address</source>
<translation type="unfinished">Kan ikke vise adresse</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standard lommebok</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3612,10 +3624,6 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<translation type="unfinished">Mer enn en onion adresse har blitt gitt. Bruker %s for den automatisk lagde Tor onion tjenesten.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Sjekk at din datamaskins dato og klokke er stilt rett! Hvis klokka er feil, vil ikke %s fungere ordentlig.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Bidra hvis du finner %s nyttig. Besøk %s for mer informasjon om programvaren.</translation>
</message>
@@ -3672,6 +3680,10 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<translation type="unfinished">Advarsel: Dumpfil lommebokformat "%s" stemmer ikke med format "%s" spesifisert i kommandolinje.</translation>
</message>
<message>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">Advarsel: Private nøkler oppdaget i lommeboken {%s} med deaktiverte private nøkler</translation>
+ </message>
+ <message>
<source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
<translation type="unfinished">Advarsel: Vi ser ikke ut til å være i full overenstemmelse med våre likemenn! Du kan trenge å oppgradere, eller andre noder kan trenge å oppgradere.</translation>
</message>
@@ -3688,10 +3700,6 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<translation type="unfinished">-maxmempool må være minst %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">En fatal intern feil oppstod, se debug.log for detaljer.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Kunne ikke slå opp -%s-adresse: "%s"</translation>
</message>
@@ -3706,6 +3714,10 @@ Unable to restore backup of wallet.</source>
Kunne ikke gjenopprette sikkerhetskopi av lommebok.</translation>
</message>
<message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <translation type="unfinished">Konfigurasjonsinnstilling for%s brukes bare på%s nettverk når du er i delen [%s].</translation>
+ </message>
+ <message>
<source>Copyright (C) %i-%i</source>
<translation type="unfinished">Kopirett © %i-%i</translation>
</message>
@@ -3754,6 +3766,10 @@ Kunne ikke gjenopprette sikkerhetskopi av lommebok.</translation>
<translation type="unfinished">Feil ved lasting av %s</translation>
</message>
<message>
+ <source>Error loading %s: Private keys can only be disabled during creation</source>
+ <translation type="unfinished">Feil ved lasting av%s: Private nøkler kan bare deaktiveres under opprettelsen</translation>
+ </message>
+ <message>
<source>Error loading %s: Wallet corrupted</source>
<translation type="unfinished">Feil under innlasting av %s: Skadet lommebok</translation>
</message>
@@ -3858,6 +3874,10 @@ Kunne ikke gjenopprette sikkerhetskopi av lommebok.</translation>
<translation type="unfinished">Ugyldig -mellomtjeneradresse eller vertsnavn: "%s"</translation>
</message>
<message>
+ <source>Invalid P2P permission: '%s'</source>
+ <translation type="unfinished">Ugyldig P2P-tillatelse: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Ugyldig beløp for -%s=&lt;amount&gt;: "%s"</translation>
</message>
@@ -4023,6 +4043,10 @@ Mangler løsningsdata for å estimere transaksjonsstørrelse</translation>
<translation type="unfinished">Kan ikke binde til %s på denne datamaskinen. Sannsynligvis kjører %s allerede.</translation>
</message>
<message>
+ <source>Unable to create the PID file '%s': %s</source>
+ <translation type="unfinished">Kan ikke opprette PID-filen '%s':%s</translation>
+ </message>
+ <message>
<source>Unable to generate initial keys</source>
<translation type="unfinished">Klarte ikke lage første nøkkel</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ne.ts b/src/qt/locale/bitcoin_ne.ts
index c54fb40a37..268520f062 100644
--- a/src/qt/locale/bitcoin_ne.ts
+++ b/src/qt/locale/bitcoin_ne.ts
@@ -849,10 +849,6 @@
<context>
<name>SignVerifyMessageDialog</name>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">आफà¥à¤¨à¥‹ ठेगानामा पठाइà¤à¤•à¥‹ बिटकोइन पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ सकिनà¥à¤› भनेर पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤ गरà¥à¤¨ तपाईंले ती ठेगानाले सनà¥à¤¦à¥‡à¤¶/समà¥à¤à¥Œà¤¤à¤¾à¤¹à¤°à¥‚मा हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› । फिसिङ आकà¥à¤°à¤®à¤£à¤²à¥‡ तपाईंलाई छकà¥à¤¯à¤¾à¤à¤° अरूका लागि तपाईंको परिचयमा हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° गराउने पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨ सकà¥à¤¨à¥‡ भà¤à¤•à¤¾à¤²à¥‡ असà¥à¤ªà¤·à¥à¤Ÿ वा जथाभावीमा हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° गरà¥à¤¦à¤¾ धà¥à¤¯à¤¾à¤¨ दिनà¥à¤¹à¥‹à¤¸à¥ । आफू सहमत भà¤à¤•à¥‹ पूरà¥à¤£ विसà¥à¤¤à¥ƒà¤¤-कथनमा मातà¥à¤° हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।</translation>
- </message>
- <message>
<source>Choose previously used address</source>
<translation type="unfinished">पहिला पà¥à¤°à¤¯à¥‹à¤— गरिà¤à¤•à¥‹ ठेगाना पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥</translation>
</message>
diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts
index eec0318d3c..b8a2c4fe1f 100644
--- a/src/qt/locale/bitcoin_nl.ts
+++ b/src/qt/locale/bitcoin_nl.ts
@@ -180,6 +180,10 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Voer de oude wachtwoordzin en de nieuwe wachtwoordzin in voor de portemonnee.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Doorgaan</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Onthoud dat het versleutelen van uw portemonnee uw bitcoins niet volledig kan beschermen tegen diefstal, bijvoorbeeld door malware die uw computer infecteert.</translation>
</message>
@@ -419,6 +423,10 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<source>%1 GB</source>
<translation type="unfinished">%1 Gb</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standaard portemonnee</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -733,10 +741,6 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Maskeer de waarden op het tabblad Overzicht</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standaard portemonnee</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Geen portefeuilles beschikbaar</translation>
</message>
@@ -1117,10 +1121,6 @@ Het migratieproces maakt voorafgaand aan het migreren een backup van de wallet.
<translation type="unfinished">Wallet openen waarschuwing</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standaard portemonnee</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Portemonnee Openen</translation>
@@ -2277,10 +2277,6 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">De transport layer versie: %1</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">De BIP324 sessie ID string in hex, indien aanwezig.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">Sessie ID</translation>
</message>
@@ -2383,6 +2379,10 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">Richting/Type</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">De BIP324 sessie ID string in hex.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Het netwerkprotocol waarmee deze peer verbonden is: IPv4, IPv6, Onion, I2P, of CJDNS.</translation>
</message>
@@ -2555,6 +2555,10 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">Netwerkactiviteit uitgeschakeld</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Geen</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Uitvoeren van commando zonder gebruik van een wallet</translation>
</message>
@@ -3237,10 +3241,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">&amp;Onderteken bericht</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">U kunt berichten/overeenkomsten ondertekenen met uw adres om te bewijzen dat u Bitcoins kunt versturen. Wees voorzichtig met het ondertekenen van iets vaags of willekeurigs, omdat phishingaanvallen u kunnen proberen te misleiden tot het ondertekenen van overeenkomsten om uw identiteit aan hen toe te vertrouwen. Onderteken alleen volledig gedetailleerde verklaringen voordat u akkoord gaat.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Het Bitcoin adres om bericht mee te ondertekenen</translation>
</message>
@@ -3325,10 +3325,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Controleer het adres en probeer het opnieuw.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Het opgegeven adres verwijst niet naar een sleutel.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Wallet ontsleutelen werd geannuleerd.</translation>
</message>
@@ -3862,11 +3858,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">PSBT is gekopieerd</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Gekopieerd naar het klembord</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Kan transactie niet ondertekenen.</translation>
</message>
@@ -3878,10 +3869,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<source>Can't display address</source>
<translation type="unfinished">Adres kan niet weergegeven worden</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standaard portemonnee</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4014,10 +4001,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Geen walletbestandsformaat opgegeven. Om createfromdump te gebruiken, moet -format=&lt;format&gt; opgegeven worden.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Waarschuwing: Controleer dat de datum en tijd van uw computer correct zijn ingesteld! Bij een onjuist ingestelde klok zal %s niet goed werken.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Gelieve bij te dragen als je %s nuttig vindt. Bezoek %s voor meer informatie over de software.</translation>
</message>
@@ -4126,10 +4109,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">-maxmempool moet minstens %d MB zijn</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Een fatale interne fout heeft zich voor gedaan, zie debug.log voor details</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Kan -%s adres niet herleiden: '%s'</translation>
</message>
@@ -4714,10 +4693,6 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Transactie te groot</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Kan geen geheugen toekennen voor -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Niet in staat om aan %s te binden op deze computer (bind gaf error %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pam.ts b/src/qt/locale/bitcoin_pam.ts
index e5675cda24..8e402e4c18 100644
--- a/src/qt/locale/bitcoin_pam.ts
+++ b/src/qt/locale/bitcoin_pam.ts
@@ -803,10 +803,6 @@
<translation type="unfinished">Maliaring pakilawe pasibayu ing address at pasibayuan ya iti.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Ing milub a address ali ya mag-refer king metung a key.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Me-kansela ya ing pamag-unlock king wallet.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts
index dce4d498c5..94d87252d0 100644
--- a/src/qt/locale/bitcoin_pl.ts
+++ b/src/qt/locale/bitcoin_pl.ts
@@ -46,6 +46,14 @@
<translation type="unfinished">&amp;Usuń</translation>
</message>
<message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Wybierz adres, na który chcesz wysłać monety</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">Wybierz adres, na który chcesz otrzymywać monety</translation>
+ </message>
+ <message>
<source>C&amp;hoose</source>
<translation type="unfinished">Wybierz</translation>
</message>
@@ -138,6 +146,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Wprowadź stare i nowe hasło portfela. </translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Kontynuuj</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Pamiętaj, że zaszyfrowanie portfela nie pomoże w zapobiegnięciu kradzieży twoich bitcoinów jeśli komputer zostanie zainfekowany przez złośliwe oprogramowanie.</translation>
</message>
@@ -375,7 +387,11 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<numerusform>%n lata</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">domyślny portfel</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -690,10 +706,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Schowaj wartości w zakładce Podsumowanie</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">domyślny portfel</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Brak dostępnych portfeli</translation>
</message>
@@ -1101,10 +1113,6 @@ Proces migracji utworzy kopiÄ™ zapasowÄ… portfela przed migracjÄ…. Plik kopii za
<translation type="unfinished">Ostrzeżenie przy otworzeniu potrfela</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">domyślny portfel</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otwórz Portfel</translation>
@@ -2297,10 +2305,6 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Transfer</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">ID sesji BIP324 jest szestnastkowym ciągiem znaków, jeśli istnieje.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">ID sesji</translation>
</message>
@@ -2399,6 +2403,10 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Uprawnienia</translation>
</message>
<message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">Kierunek i typ połączenia równorzędnego: %1</translation>
+ </message>
+ <message>
<source>Direction/Type</source>
<translation type="unfinished">Kierunek/Rodzaj</translation>
</message>
@@ -2595,6 +2603,10 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Aktywność sieciowa wyłączona</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Żaden</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">WykonujÄ™ komendÄ™ bez portfela</translation>
</message>
@@ -2607,6 +2619,23 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Wykonuję komendę używając portfela "%1"</translation>
</message>
<message>
+ <source>Welcome to the %1 RPC console.
+Use up and down arrows to navigate history, and %2 to clear screen.
+Use %3 and %4 to increase or decrease the font size.
+Type %5 for an overview of available commands.
+For more information on using this console, type %6.
+
+%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
+ <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
+ <translation type="unfinished">Witaj w %1 konsoli RPC.
+Użyj strzałek do góry oraz w dół, aby nawigować po historii oraz %2 w celu wyczyszczenia ekranu.
+Użyj %3 oraz %4 aby zwiększyć lub zmniejszyć rozmiar czcionki.
+Wpisz %5 w celu wyświetlenia dostępnych komend.
+Aby uzyskać więcej informacji na temat używania tej konsoli wpisz %6.
+
+%7UWAGA: Oszuści są wszędzie i potrafią namawiać użytkowników do wpisywania złych komend w celu wykradania zawartości ich porfeli. Nie używaj tej konsoli jeżeli nie znasz wszystkich konsekwencji danej komendy.%8</translation>
+ </message>
+ <message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished">WykonujÄ™...</translation>
@@ -3294,10 +3323,6 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za
<translation type="unfinished">Podpi&amp;sz Wiadomość</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Możesz podpisywać wiadomości swoimi adresami aby udowodnić, że jesteś ich właścicielem. Uważaj, aby nie podpisywać niczego co wzbudza Twoje podejrzenia, ponieważ ktoś może stosować phishing próbując nakłonić Cię do ich podpisania. Akceptuj i podpisuj tylko w pełni zrozumiałe komunikaty i wiadomości.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Adres Bitcoin, za pomocą którego podpisać wiadomość</translation>
</message>
@@ -3383,10 +3408,6 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
<translation type="unfinished">Proszę sprawdzić adres i spróbować ponownie.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Wprowadzony adres nie odnosi siÄ™ do klucza.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Odblokowanie portfela zostało anulowane.</translation>
</message>
@@ -3868,8 +3889,7 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<translation type="unfinished">Portfel nie został wybrany.
-Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
-</translation>
+Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.</translation>
</message>
<message>
<source>Create a new wallet</source>
@@ -3948,11 +3968,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Skopiowano PSBT</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Skopiowane do schowka</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Nie można podpisać transakcji.</translation>
</message>
@@ -3964,10 +3979,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<source>Can't display address</source>
<translation type="unfinished">Nie można wyświetlić adresu</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">domyślny portfel</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4069,7 +4080,7 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=1.</translation>
+ <translation type="unfinished">Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
@@ -4077,11 +4088,7 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
</message>
<message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=1.</translation>
- </message>
- <message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Proszę sprawdzić czy data i czas na Twoim komputerze są poprawne! Jeżeli ustawienia zegara będą złe, %s nie będzie działał prawidłowo.</translation>
+ <translation type="unfinished">Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=&lt;format&gt;.</translation>
</message>
<message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
@@ -4176,10 +4183,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">-maxmempool musi być przynajmniej %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Błąd: Wystąpił fatalny błąd wewnętrzny, sprawdź szczegóły w debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Nie można rozpoznać -%s adresu: '%s'</translation>
</message>
@@ -4605,8 +4608,7 @@ Nie można przywrócić kopii zapasowej portfela</translation>
</message>
<message>
<source>Specified blocks directory "%s" does not exist.</source>
- <translation type="unfinished">Podany folder bloków "%s" nie istnieje.
-</translation>
+ <translation type="unfinished">Podany folder bloków "%s" nie istnieje.</translation>
</message>
<message>
<source>Specified data directory "%s" does not exist.</source>
@@ -4673,10 +4675,6 @@ Nie można przywrócić kopii zapasowej portfela</translation>
<translation type="unfinished">Transakcja zbyt duża</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Nie mogę zalokować pamięci dla -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Nie można przywiązać do %s na tym komputerze (bind zwrócił błąd %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt.ts b/src/qt/locale/bitcoin_pt.ts
index c7975c0edf..56fe047bba 100644
--- a/src/qt/locale/bitcoin_pt.ts
+++ b/src/qt/locale/bitcoin_pt.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Clique com o botão direito para editar o endereço ou etiqueta</translation>
+ <translation type="unfinished">Clique com o botão direito do rato para editar o endereço ou a etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -153,7 +153,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Unlock wallet</source>
- <translation type="unfinished">Desbloquear carteira</translation>
+ <translation type="unfinished">Desbloquear a carteira</translation>
</message>
<message>
<source>Change passphrase</source>
@@ -184,6 +184,14 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Insira a frase de segurança antiga e a nova para a carteira.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Voltar</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Lembre-se que a encriptação da sua carteira não impede totalmente os seus bitcoins de serem roubados por programas maliciosos (malware) que infetem o seu computador.</translation>
</message>
@@ -410,7 +418,11 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
<numerusform>%n anos </numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">carteira predefinida</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -476,7 +488,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished"> O proxy está &lt;b&gt;ativado&lt;/b&gt;: %1</translation>
+ <translation type="unfinished">O proxy está &lt;b&gt;ativado&lt;/b&gt;: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -504,7 +516,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Encriptar carteira…</translation>
+ <translation type="unfinished">Carteira &amp;encriptada…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -532,11 +544,11 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar mensagens para garantir que foram assinadas com endereços Bitcoin especificados</translation>
+ <translation type="unfinished">Verifique mensagens para assegurar que foram assinadas com o endereço Bitcoin especificado</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Carregar PSBT do ficheiro…</translation>
+ <translation type="unfinished">&amp;Carregar PSBT do ficheiro...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -568,11 +580,11 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">Barra de ferramentas das abas</translation>
+ <translation type="unfinished">Barra de ferramentas dos separadores</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">A sincronizar cabeçalhos (%1%)…</translation>
+ <translation type="unfinished">A sincronizar cabeçalhos (%1%)...</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -592,7 +604,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Pedir pagamentos (gera códigos QR e bitcoin: URIs)</translation>
+ <translation type="unfinished">Solicitar pagamentos (gera códigos QR e bitcoin: URIs)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -604,7 +616,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">Opções da linha de &amp;comandos</translation>
+ <translation type="unfinished">&amp;Opções da linha de &amp;comando</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -615,11 +627,11 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 atrás</translation>
+ <translation type="unfinished">%1 em atraso</translation>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">A recuperar o atraso…</translation>
+ <translation type="unfinished">Recuperando o atraso...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -627,7 +639,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">As transações posteriores a esta data ainda não serão visíveis.</translation>
+ <translation type="unfinished">As transações depois de isto ainda não serão visíveis.</translation>
</message>
<message>
<source>Error</source>
@@ -651,7 +663,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Carregar PSBT da área de transferência…</translation>
+ <translation type="unfinished">Carregar PSBT da área de transferência...</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
@@ -663,23 +675,23 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Abrir a consola de diagnóstico e depuração de nó</translation>
+ <translation type="unfinished">Abrir o depurador de nó e o console de diagnóstico</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Endereços de envio</translation>
+ <translation type="unfinished">&amp;Endereço de envio</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">Endereços de &amp;receção</translation>
+ <translation type="unfinished">&amp;Endereços de receção</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Abrir um bitcoin: URI</translation>
+ <translation type="unfinished">Abrir um bitcoin URI</translation>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Abrir carteira</translation>
+ <translation type="unfinished">Abrir Carteira</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -687,7 +699,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Close wallet</source>
- <translation type="unfinished">Fechar carteira</translation>
+ <translation type="unfinished">Fechar a carteira</translation>
</message>
<message>
<source>Restore Wallet…</source>
@@ -701,7 +713,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Fechar todas carteiras</translation>
+ <translation type="unfinished">Fechar todas carteiras.</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -713,19 +725,15 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Mostrar a mensagem de ajuda %1 para obter uma lista com as possíveis opções de linha de comandos do Bitcoin</translation>
+ <translation type="unfinished">Mostrar a mensagem de ajuda %1 para obter uma lista com possíveis opções a usar na linha de comandos.</translation>
</message>
<message>
<source>&amp;Mask values</source>
- <translation type="unfinished">&amp;Mascarar valores</translation>
+ <translation type="unfinished">&amp;Valores de Máscara</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Mascarar os valores na aba Resumo</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">carteira predefinida</translation>
+ <translation type="unfinished">Mascare os valores na aba de visão geral</translation>
</message>
<message>
<source>No wallets available</source>
@@ -739,7 +747,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Carregar cópia de segurança da carteira</translation>
+ <translation type="unfinished">Carregar cópia de segurança de carteira</translation>
</message>
<message>
<source>Restore Wallet</source>
@@ -749,7 +757,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nome da carteira</translation>
+ <translation type="unfinished">Nome da Carteira</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -769,7 +777,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">&amp;Ocultar</translation>
+ <translation type="unfinished">Ocultar</translation>
</message>
<message>
<source>S&amp;how</source>
@@ -779,8 +787,8 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n conexão ativa com a rede Bitcoin.</numerusform>
- <numerusform>%n conexões ativas com a rede Bitcoin.</numerusform>
+ <numerusform>%n conexão ativa na rede Bitcoin.</numerusform>
+ <numerusform>%n conexões ativas na rede Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -791,7 +799,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
<message>
<source>Show Peers tab</source>
<extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">Mostra aba Pares</translation>
+ <translation type="unfinished">Mostra aba de pares</translation>
</message>
<message>
<source>Disable network activity</source>
@@ -919,7 +927,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Após a taxa:</translation>
+ <translation type="unfinished">Depois da taxa:</translation>
</message>
<message>
<source>Change:</source>
@@ -927,7 +935,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>(un)select all</source>
- <translation type="unfinished">(des)selecionar tudo</translation>
+ <translation type="unfinished">(des)selecionar todos</translation>
</message>
<message>
<source>Tree mode</source>
@@ -959,11 +967,11 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmado</translation>
+ <translation type="unfinished">Confirmada</translation>
</message>
<message>
<source>Copy amount</source>
- <translation type="unfinished">Copiar quantia</translation>
+ <translation type="unfinished">Copiar valor</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -979,7 +987,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
- <translation type="unfinished">Copiar o &amp;ID da transação e o índice de saída</translation>
+ <translation type="unfinished">Copiar &amp;ID da transação e index do output</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
@@ -999,7 +1007,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar após a taxa</translation>
+ <translation type="unfinished">Copiar depois da taxa</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -1015,7 +1023,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished">Pode variar +/- %1 satoshi(s) por entrada.</translation>
+ <translation type="unfinished">Pode variar +/- %1 satoshi(s) por input.</translation>
</message>
<message>
<source>(no label)</source>
@@ -1035,7 +1043,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
<message>
<source>Create Wallet</source>
<extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">Criar carteira</translation>
+ <translation type="unfinished">Criar Carteira</translation>
</message>
<message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1069,7 +1077,7 @@ A assinatura só é possível com endereços do tipo "legado".</translation>
<message>
<source>Loading wallets…</source>
<extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">A carregar carteiras…</translation>
+ <translation type="unfinished">A carregar carteiras...</translation>
</message>
</context>
<context>
@@ -1120,7 +1128,7 @@ O processo de migração criará uma cópia de segurança da carteira antes da m
</message>
<message>
<source>Migration Successful</source>
- <translation type="unfinished">Êxito na migração</translation>
+ <translation type="unfinished">Migração bem sucedida</translation>
</message>
</context>
<context>
@@ -1134,10 +1142,6 @@ O processo de migração criará uma cópia de segurança da carteira antes da m
<translation type="unfinished">Aviso de carteira aberta</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">carteira predefinida</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir carteira</translation>
@@ -1574,7 +1578,7 @@ O processo de migração criará uma cópia de segurança da carteira antes da m
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">Caminho completo para um script compatível %1 (exemplo C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Cuidado: um programa malicioso (malware) pode roubar as suas moedas!</translation>
+ <translation type="unfinished">Caminho completo para um script compatível %1 com Bitcoin Core (exemplo C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Cuidado: um programa malicioso (malware) pode roubar as suas moedas!</translation>
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
@@ -1710,7 +1714,7 @@ O processo de migração criará uma cópia de segurança da carteira antes da m
</message>
<message>
<source>Map port using NA&amp;T-PMP</source>
- <translation type="unfinished">Mapear porta usando &amp;NAT-PMP</translation>
+ <translation type="unfinished">Mapear porta usando NA&amp;T-PMP</translation>
</message>
<message>
<source>Accept connections from outside.</source>
@@ -2213,7 +2217,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Erro ao codificar URI em código QR.</translation>
+ <translation type="unfinished">Erro ao codificar o URI em código QR</translation>
</message>
<message>
<source>QR code support not available.</source>
@@ -2280,6 +2284,14 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Número de conexões</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Endereços locais</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Endereços de rede que seu nó Bitcoin está usando atualmente para se comunicar com outros nós.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadeia de blocos</translation>
</message>
@@ -2328,6 +2340,10 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Selecione um par para ver informação detalhada.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalhes dos pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versão da camada de transporte: %1</translation>
</message>
@@ -2336,10 +2352,6 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">A string do ID da sessão BIP324 em hexadecimal, se houver.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">ID da sessão</translation>
</message>
@@ -2446,6 +2458,10 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Direção / tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">A cadeia de ID da sessão BIP324 em hexadecimal.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">O protocolo de rede pelo qual este par está conectado: IPv4, IPv6, Onion, I2P ou CJDNS.</translation>
</message>
@@ -2560,7 +2576,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<message>
<source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
<extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">Manual de saída: adicionado utilizando as opções de configuração RPC %1 ou %2/%3</translation>
+ <translation type="unfinished">Saída manual: adicionado utilizando as opções de configuração RPC %1 ou %2/%3</translation>
</message>
<message>
<source>Outbound Feeler: short-lived, for testing addresses</source>
@@ -2580,7 +2596,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<message>
<source>v1: unencrypted, plaintext transport protocol</source>
<extracomment>Explanatory text for v1 transport type.</extracomment>
- <translation type="unfinished">v1: protocolo de transporte de texto simples e não encriptado</translation>
+ <translation type="unfinished">v1: protocolo de transporte de texto simples não encriptado</translation>
</message>
<message>
<source>v2: BIP324 encrypted transport protocol</source>
@@ -2638,6 +2654,10 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Atividade de rede desativada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nenhum</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">A executar o comando sem qualquer carteira</translation>
</message>
@@ -3069,7 +3089,7 @@ Nota: como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar após a taxa</translation>
+ <translation type="unfinished">Copiar depois da taxa</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -3160,7 +3180,7 @@ Nota: como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<message>
<source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
- <translation type="unfinished">Por favor, reveja a sua proposta de transação. Isto produzirá uma transação Bitcoin parcialmente assinada (PSBT) que pode guardar ou copiar e depois assinar com, por exemplo, uma carteira %1 offline, ou uma carteira de hardware compatível com PSBT.</translation>
+ <translation type="unfinished">Por favor, reveja sua proposta de transação. Isto irá produzir uma Transação de Bitcoin parcialmente assinada (PSBT, sigla em inglês) a qual pode guardar ou copiar e então assinar com por exemplo uma carteira %1 offine ou uma PSBT compatível com carteira de hardware.</translation>
</message>
<message>
<source>%1 from wallet '%2'</source>
@@ -3352,8 +3372,8 @@ Nota: como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">&amp;Assinar mensagem</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Pode assinar mensagens/acordos com os seus endereços para provar que pode receber bitcoins enviados para eles. Tenha cuidado para não assinar nada vago ou aleatório, pois os ataques de phishing podem tentar induzi-lo a assinar a sua identidade. Assine apenas declarações totalmente detalhadas com as quais concorda.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Você pode assinar mensagens com seus endereços legados (P2PKH) para provar que pode receber bitcoins enviados a eles. Tenha cuidado para não assinar nada vago ou aleatório, pois ataques de phishing podem tentar enganá-lo para assinar sua identidade para eles. Assine apenas declarações totalmente detalhadas com as quais você concorda.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3429,7 +3449,7 @@ Nota: como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Clique em "Assinar mensagem" para gerar a assinatura</translation>
+ <translation type="unfinished">Clique "Assinar mensagem" para gerar a assinatura</translation>
</message>
<message>
<source>The entered address is invalid.</source>
@@ -3440,8 +3460,8 @@ Nota: como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Por favor, verifique o endereço e tente novamente.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">O endereço introduzido não se refere a uma chave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">O endereço inserido não se refere a uma chave legada (P2PKH). A assinatura de mensagens para SegWit e outros tipos de endereço não P2PKH não são suportadas nesta versão do %1. Por favor, verifique o endereço e tente novamente.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3817,7 +3837,7 @@ Nota: como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Min amount</source>
- <translation type="unfinished">Quantia mín.</translation>
+ <translation type="unfinished">Quantia mínima</translation>
</message>
<message>
<source>Range…</source>
@@ -4013,9 +4033,8 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
<translation type="unfinished">PSBT copiado</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiado para a área de transferência</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Fee-bump PSBT copiado para a área de transferência</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4026,12 +4045,12 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
<translation type="unfinished">Não foi possível confirmar a transação</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Não é possível visualizar o endereço</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erro do signatário</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">carteira predefinida</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Não é possível visualizar o endereço</translation>
</message>
</context>
<context>
@@ -4082,7 +4101,7 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
</message>
<message>
<source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s corrompido. Tente usar a ferramenta de carteira bitcoin-wallet para guardar ou restaurar uma cópia de segurança.</translation>
+ <translation type="unfinished">%s corrompido. Tente utilizar a ferramenta de carteira bitcoin-wallet para recuperar ou restaurar uma cópia de segurança.</translation>
</message>
<message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
@@ -4165,10 +4184,6 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
<translation type="unfinished">Não foi fornecido nenhum formato de ficheiro de carteira. Para usar createfromdump, é necessário fornecer -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Por favor verifique que a data e hora do seu computador estão certos! Se o relógio não estiver certo, o %s não funcionará corretamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Por favor, contribua se achar que %s é útil. Visite %s para mais informação sobre o software.</translation>
</message>
@@ -4186,7 +4201,7 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
</message>
<message>
<source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
- <translation type="unfinished">A renomeação de '%s' -&gt; '%s' falhou. Deve resolver este problema movendo ou eliminando manualmente o diretório de instantâneos inválido %s, caso contrário, voltará a encontrar o mesmo erro no arranque seguinte.</translation>
+ <translation type="unfinished">Falha ao renomear '%s' -&gt; '%s'. Deve resolver este problema manualmente movendo ou removendo o diretório de cópia inválido %s, caso contrário ocorrerá novamente o mesmo erro na próxima inicialização.</translation>
</message>
<message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
@@ -4277,10 +4292,6 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
<translation type="unfinished">-maxmempool tem de ser pelo menos %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ocorreu um erro interno fatal, ver debug.log para mais pormenores</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Não é possível resolver o endereço de -%s: "%s"</translation>
</message>
@@ -4294,7 +4305,7 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Não foi possível escrever na pasta de dados "%s": verifique as permissões.</translation>
+ <translation type="unfinished">Não foi possível escrever na pasta de dados '%s': verifique as permissões.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -4310,7 +4321,7 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
</message>
<message>
<source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
- <translation type="unfinished">Erro ao ler o ficheiro %s! Todas as chaves foram lidas corretamente, mas os dados da transação ou os metadados do endereço podem estar em falta ou incorretos.</translation>
+ <translation type="unfinished">Erro ao ler %s! Todas as chaves são lidas corretamente, mas os dados de transação ou os metadados de endereço podem estar em falta ou incorretos.</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
@@ -4329,6 +4340,12 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
<translation type="unfinished">Não foi possível calcular as taxas de compensação, porque os UTXOs não confirmados dependem de um enorme conjunto de transações não confirmadas..</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Falha ao remover o diretório do snapshot chainstate (%s). Remova-o manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Falha ao alterar o nome do ficheiro peers.dat inválido. Mova-o ou elimine-o e tente novamente.</translation>
</message>
@@ -4337,6 +4354,14 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
<translation type="unfinished">A estimativa da taxa falhou. A taxa de retrocesso está desativada. Aguardar alguns blocos ou ativar %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falha ao transferir o ficheiro de bloco para o disco. Isto é provavelmente o resultado de um erro de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falha ao transferir o ficheiro undo para o disco. Isto é provavelmente o resultado de um erro de E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opções incompatíveis: "-dnsseed=1" foi explicitamente especificada, mas "-onlynet" proíbe conexões para IPv4/IPv6</translation>
</message>
@@ -4345,6 +4370,14 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
<translation type="unfinished">Quantia inválida para %s=&lt;amount&gt;: '%s' (tem de ser, pelo menos, a taxa mínima de retransmissão de %s para evitar transações bloqueadas)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">O peso máximo da transação é inferior ao peso da transação sem entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">O peso máximo da transação é demasiado baixo, não pode acomodar a saída de mudança</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Conexões de saída restritas ao CJDNS (-onlynet=cjdns) mas -cjdnsreachable não é fornecido</translation>
</message>
@@ -4361,6 +4394,14 @@ Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
<translation type="unfinished">Conexões de saída restringidas ao i2p (-onlynet=i2p) mas não foi fornecido -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Renomear de '%s' -&gt; '%s'falhou. Não é possível limpar o diretório leveldb do chainstate em segundo plano.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">A combinação das entradas pré-selecionadas e a seleção automática de entradas da carteira excede o peso máximo da transação. Tente enviar uma quantia menor ou consolidar manualmente os UTXOs da sua carteira</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">O tamanho das entradas excede o peso máximo. Por favor, tente enviar uma quantia menor ou consolidar manualmente os UTXOs da sua carteira</translation>
</message>
@@ -4403,6 +4444,10 @@ Por favor tente atualizar o software para a última versão.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">A data e a hora do seu computador parecem estar mais de %d minutos fora de sincronia com a rede, isso pode levar a uma falha de consenso. Depois de confirmar o relógio do seu computador, essa mensagem não deve mais aparecer quando você reiniciar seu nó. Sem uma reinicialização, ela deve parar de aparecer automaticamente depois que você se conectar a um número suficiente de novos pares de saída, o que pode levar algum tempo. Você pode inspecionar o campo `timeoffset` dos métodos RPC `getpeerinfo` e `getnetworkinfo` para obter mais informações.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4415,6 +4460,18 @@ Unable to restore backup of wallet.</source>
Não foi possível restaurar a cópia de segurança da carteira.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind só pode ser utilizado para conexões de entrada ("out" foi passado)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ocorreu um fatal internal error, consulte debug.log para obter detalhes:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Não foram encontrados os dados assumeutxo para o blockhash em causa '%s'.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">A verificação do bloco foi interrompida</translation>
</message>
@@ -4427,6 +4484,10 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">Direitos de autor (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bloco corrompido encontrado indicando possível falha de hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Detetada base de dados de blocos corrompida</translation>
</message>
@@ -4455,6 +4516,10 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">O ficheiro de dump %s não existe</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Falha na verificação de integridade da criptografia de curva elíptica. %s está sendo desligado.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Erro ao confirmar a transação da base de dados para remover transações da carteira</translation>
</message>
@@ -4564,7 +4629,7 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
</message>
<message>
<source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Erro: não é possível efetuar uma cópia de segurança da sua carteira</translation>
+ <translation type="unfinished">Erro: não foi possível efetuar uma cópia de segurança da sua carteira</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
@@ -4603,10 +4668,22 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">Erro: a transação da base de dados não pode ser executada para a carteira %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Falha ao conectar o melhor bloco (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Falha ao desconectar o bloco.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Falha ao escutar em qualquer porta. Use -listen=0 se quiser isso.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Falha ao ler o bloco.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Falha ao verificar novamente a carteira durante a inicialização</translation>
</message>
@@ -4619,6 +4696,22 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">Falha ao verificar a base de dados</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Falha ao escrever bloco.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Falha ao escrever na base de dados de índices de blocos.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Falha ao escrever na base de dados de moedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Falha ao escrever dados de anulação.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Falha ao remover a transação: %s</translation>
</message>
@@ -4715,6 +4808,10 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">A carregar a carteira…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">O peso máximo da transação deve estar entre %d e %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta a quantia</translation>
</message>
@@ -4743,6 +4840,10 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">Entrada pré-selecionada %s não solucionável</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Apenas a direção foi definida, sem permissões: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">A redução (prune) não pode ser configurada com um valor negativo.</translation>
</message>
@@ -4787,6 +4888,19 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">A secção [%s] não é reconhecida.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">O signatário não fez eco do endereço</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">O signatário fez eco de um endereço inesperado
+%s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">O signatário retornou erro: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Falha ao assinar a transação</translation>
</message>
@@ -4815,6 +4929,18 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">A iniciar threads de rede…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erro de sistema durante a transferência: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erro do sistema ao carregar arquivo de bloco externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erro do sistema ao salvar bloco no disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">O código-fonte está disponível em %s.</translation>
</message>
@@ -4831,6 +4957,10 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">A carteira evitará pagar menos do que a taxa mínima de retransmissão.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Não há ScriptPubKeyManager para este endereço</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Isto é um software experimental.</translation>
</message>
@@ -4871,10 +5001,6 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">Transação demasiado grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Não foi possível atribuir memória para -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Não foi possível vincular a %s neste computador (a vinculação devolveu o erro %s)</translation>
</message>
@@ -4935,6 +5061,10 @@ Não foi possível restaurar a cópia de segurança da carteira.</translation>
<translation type="unfinished">Ativadas novas regras desconhecidas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opção não reconhecida "%s" fornecido em -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Nível de registo global não suportado %s=%s. Valores válidos: %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt_BR.ts b/src/qt/locale/bitcoin_pt_BR.ts
index 02debe791f..6c2c515066 100644
--- a/src/qt/locale/bitcoin_pt_BR.ts
+++ b/src/qt/locale/bitcoin_pt_BR.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Criar um novo endereço.</translation>
+ <translation type="unfinished">Criar um novo endereço</translation>
</message>
<message>
<source>&amp;New</source>
@@ -184,6 +184,10 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Digite a antiga e a nova senha da carteira</translation>
</message>
<message>
+ <source>Back</source>
+ <translation type="unfinished">Voltar</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Lembre-se que sua carteira criptografada não poderá proteger totalmente os seus bitcoins de serem roubados por softwares maldosos que infectem seu computador.</translation>
</message>
@@ -382,7 +386,11 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<numerusform>%nanos </numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">carteira padrão</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -496,7 +504,7 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Assine mensagens com seus endereços Bitcoin para provar que você é dono deles</translation>
+ <translation type="unfinished">Assine mensagens com seus endereços Bitcoin para provar que você é dono delas</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -504,11 +512,11 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verifique mensagens para assegurar que foram assinadas com o endereço Bitcoin especificado</translation>
+ <translation type="unfinished">Verificar mensagens para se assegurar que elas foram assinadas pelo dono de Endereços Bitcoin específicos</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Carregar PSBT do arquivo...</translation>
+ <translation type="unfinished">&amp;Carregar 'PSBT' do arquivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -619,7 +627,7 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Carregar Transação de Bitcoin Parcialmente Assinada</translation>
+ <translation type="unfinished">Carregar</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -693,11 +701,7 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Mascarar os valores na barra Resumo</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">carteira padrão</translation>
+ <translation type="unfinished">Mascarar os valores na aba de visão geral</translation>
</message>
<message>
<source>No wallets available</source>
@@ -966,7 +970,7 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">Copiar troco</translation>
+ <translation type="unfinished">Copiar alteração</translation>
</message>
<message>
<source>(%1 locked)</source>
@@ -1055,7 +1059,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">Migrar Carteira</translation>
+ <translation type="unfinished">Migrar carteira</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1089,10 +1093,6 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Abrir carteira alerta</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">carteira padrão</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir carteira</translation>
@@ -2156,6 +2156,14 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Número de conexões</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Endereços locais</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Endereços de rede que seu nó Bitcoin está usando atualmente para se comunicar com outros nós.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Corrente de blocos</translation>
</message>
@@ -2204,6 +2212,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Selecione um nó para ver informações detalhadas.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalhes dos pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versão da camada de transporte: %1</translation>
</message>
@@ -2212,10 +2224,6 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">A string do ID da sessão BIP324 em hexadecimal, se houver.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">ID de sessão</translation>
</message>
@@ -2310,6 +2318,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Permissões</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">A cadeia de ID da sessão BIP324 em hexadecimal.</translation>
+ </message>
+ <message>
<source>Services</source>
<translation type="unfinished">Serviços</translation>
</message>
@@ -2427,6 +2439,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Atividade da rede desativada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nenhum</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Executando comando sem nenhuma carteira</translation>
</message>
@@ -2469,7 +2485,7 @@ Utilize %3 e %4 para aumentar ou diminuir a tamanho da fonte.
Digite %5 para ver os comandos disponíveis.
Para mais informações sobre a utilização desse console. digite %6.
-%7 AVISO: Scammers estão ativamente influenciando usuário a digitarem comandos aqui e roubando os conteúdos de suas carteiras; Não use este terminal sem pleno conhecimento dos efeitos de cada comando.%8</translation>
+%7 AVISO: Scammers estão ativamente influenciando usuário a digitarem comandos aqui, roubando os conteúdos de suas carteiras. Não use este terminal sem pleno conhecimento dos efeitos de cada comando.%8</translation>
</message>
<message>
<source>Executing…</source>
@@ -2862,7 +2878,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">Copiar troco</translation>
+ <translation type="unfinished">Copiar alteração</translation>
</message>
<message>
<source>%1 (%2 blocks)</source>
@@ -3104,8 +3120,8 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">&amp;Assinar mensagem</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Você pode assinar mensagens com seus endereços para provar que você pode receber bitcoins enviados por alguém. Cuidado para não assinar nada vago ou aleatório, pois ataques phishing podem tentar te enganar para assinar coisas para eles como se fosse você. Somente assine termos bem detalhados que você concorde.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Você pode assinar mensagens com seus endereços legados (P2PKH) para provar que pode receber bitcoins enviados a eles. Tenha cuidado para não assinar nada vago ou aleatório, pois ataques de phishing podem tentar enganá-lo para assinar sua identidade para eles. Assine apenas declarações totalmente detalhadas com as quais você concorda.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3192,8 +3208,8 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Por gentileza, cheque o endereço e tente novamente.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">O endereço fornecido não se refere a uma chave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">O endereço inserido não se refere a uma chave legada (P2PKH). A assinatura de mensagens para SegWit e outros tipos de endereço não P2PKH não são suportadas nesta versão do %1. Por favor, verifique o endereço e tente novamente.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3724,9 +3740,8 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT copiado</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiado para a área de transferência</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Fee-bump PSBT copiado para a área de transferência</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3737,10 +3752,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Não foi possível mandar a transação</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">carteira padrão</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erro do signatário</translation>
</message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3827,10 +3842,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Mais de um endereço onion associado é fornecido. Usando %s para automaticamento criar serviço onion Tor.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Por favor verifique se a data e o horário de seu computador estão corretos. Se o relógio de seu computador estiver incorreto, %s não funcionará corretamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Por favor contribua se você entender que %s é útil. Visite %s para mais informações sobre o software.</translation>
</message>
@@ -3931,10 +3942,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool deve ser pelo menos %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Aconteceu um erro interno fatal, veja os detalhes em debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Não foi possível encontrar o endereço de -%s: '%s'</translation>
</message>
@@ -3948,7 +3955,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Não foi possível escrever no diretório '%s': verifique as permissões.</translation>
+ <translation type="unfinished">Não foi possível escrever no diretório de dados '%s': verifique as permissões.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -3983,6 +3990,12 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Falha ao calcular as taxas de colisão porque os UTXOs não confirmados dependem de um enorme conjunto de transações não confirmadas.</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Falha ao remover o diretório do snapshot chainstate (%s). Remova-o manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Impossível renomear o arquivo peers.dat (inválido). Por favor mova-o ou delete-o e tente novamente.</translation>
</message>
@@ -3991,6 +4004,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Falha na estimativa de taxa. Fallbackfee desativada. Espere alguns blocos ou ative %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falha ao transferir o ficheiro de bloco para o disco. Isto é provavelmente o resultado de um erro de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falha ao transferir o ficheiro undo para o disco. Isto é provavelmente o resultado de um erro de E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opções incompatíveis: "-dnsseed=1" foi explicitamente específicada, mas "-onlynet" proíbe conexões para IPv4/IPv6</translation>
</message>
@@ -3999,6 +4020,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Montante inválido para %s=&lt;amount&gt;: '%s' (precisa ser pelo menos a taxa de minrelay de %s para prevenir que a transação nunca seja confirmada)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">O peso máximo da transação é inferior ao peso da transação sem entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">O peso máximo da transação é demasiado baixo, não pode acomodar a saída de mudança</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Conexões de saída limitadas a rede CJDNS (-onlynet=cjdns), mas -cjdnsreachable não foi configurado</translation>
</message>
@@ -4015,6 +4044,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Conexões de saída limitadas a rede i2p (-onlynet=i2p), mas -i2psam não foi configurado</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Renomear de '%s' -&gt; '%s'falhou. Não é possível limpar o diretório leveldb do chainstate em segundo plano.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">A combinação das entradas pré-selecionadas e a seleção automática de entradas da carteira excede o peso máximo da transação. Tente enviar uma quantia menor ou consolidar manualmente os UTXOs da sua carteira</translation>
+ </message>
+ <message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
<translation type="unfinished">O tamanho das entradas excede o peso máximo. Por favor, tente enviar uma quantia menor ou consolidar manualmente os UTXOs da sua carteira</translation>
</message>
@@ -4057,6 +4094,10 @@ Por favor tente atualizar o software para a última versão.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">A data e a hora do seu computador parecem estar mais de %d minutos fora de sincronia com a rede, isso pode levar a uma falha de consenso. Depois de confirmar o relógio do seu computador, essa mensagem não deve mais aparecer quando você reiniciar seu nó. Sem uma reinicialização, ela deve parar de aparecer automaticamente depois que você se conectar a um número suficiente de novos pares de saída, o que pode levar algum tempo. Você pode inspecionar o campo `timeoffset` dos métodos RPC `getpeerinfo` e `getnetworkinfo` para obter mais informações.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4069,6 +4110,18 @@ Unable to restore backup of wallet.</source>
Impossível restaurar backup da carteira.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind só pode ser utilizado para conexões de entrada ("out" foi passado)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ocorreu um fatal internal error, consulte debug.log para obter detalhes:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Não foram encontrados os dados assumeutxo para o blockhash em causa '%s'.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">A verificação dos blocos foi interrompida</translation>
</message>
@@ -4077,6 +4130,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">A configuração %s somente é aplicada na rede %s quando na sessão [%s].</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bloco corrompido encontrado indicando possível falha de hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Detectado Banco de dados de blocos corrompido</translation>
</message>
@@ -4101,6 +4158,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Carregamento terminado!</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Falha na verificação de integridade da criptografia de curva elíptica. %s está sendo desligado.</translation>
+ </message>
+ <message>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished">Erro durante commiting db txn para a remoção das transações da carteira.</translation>
</message>
@@ -4213,10 +4274,22 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro: a transação do banco de dados não pode ser executada para a carteira %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Falha ao conectar o melhor bloco (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Falha ao desconectar o bloco.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Falha ao escutar em qualquer porta. Use -listen=0 se você quiser isso.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Falha ao ler o bloco.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Falha ao escanear novamente a carteira durante a inicialização</translation>
</message>
@@ -4229,6 +4302,22 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Falha ao verificar a base de dados</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Falha ao escrever bloco.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Falha ao escrever na base de dados de índices de blocos.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Falha ao escrever na base de dados de moedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Falha ao escrever dados de anulação.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Falha ao remover a transação: %s</translation>
</message>
@@ -4321,6 +4410,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Carregando carteira...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">O peso máximo da transação deve estar entre %d e %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Faltando quantia</translation>
</message>
@@ -4349,6 +4442,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Não há solução para entrada pré-selecionada %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Apenas a direção foi definida, sem permissões: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">O modo prune não pode ser configurado com um valor negativo.</translation>
</message>
@@ -4393,6 +4490,19 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Sessão [%s] não reconhecida.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">O signatário não fez eco do endereço</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">O signatário fez eco de um endereço inesperado
+%s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">O signatário retornou erro: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Assinatura de transação falhou</translation>
</message>
@@ -4421,6 +4531,18 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Iniciando atividades da rede...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erro de sistema durante a transferência: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erro do sistema ao carregar arquivo de bloco externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erro do sistema ao salvar bloco no disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">O código fonte está disponível pelo %s.</translation>
</message>
@@ -4433,6 +4555,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">A carteira irá evitar pagar menos que a taxa mínima de retransmissão.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Não há ScriptPubKeyManager para este endereço</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este é um software experimental.</translation>
</message>
@@ -4473,10 +4599,6 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Transação muito grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossível alocar memória para a opção "-maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Erro ao vincular em %s neste computador (bind retornou erro %s)</translation>
</message>
@@ -4529,6 +4651,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Rede desconhecida especificada em -onlynet: '%s'</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opção não reconhecida "%s" fornecido em -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">Nível de registo global não suportado %s=%s. Valores válidos: %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ro.ts b/src/qt/locale/bitcoin_ro.ts
index 0bb08f5c1e..33a478d217 100644
--- a/src/qt/locale/bitcoin_ro.ts
+++ b/src/qt/locale/bitcoin_ro.ts
@@ -181,6 +181,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
 </translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continua</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Reţineti: criptarea portofelului dvs. nu vă poate proteja în totalitate bitcoin-urile împotriva furtului de malware care vă infectează computerul.</translation>
</message>
@@ -373,7 +377,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<source>%1 kB</source>
<translation type="unfinished">%1kB</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">portofel implicit</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -692,10 +700,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Mascați valorile din fila Prezentare generală</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portofel implicit</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Niciun portofel disponibil</translation>
</message>
@@ -1040,15 +1044,16 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Atenționare la deschiderea portofelului</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portofel implicit</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Deschide portofel</translation>
</message>
- </context>
+ <message>
+ <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
+ <translation type="unfinished">Deschidere Portofel&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+</context>
<context>
<name>RestoreWalletActivity</name>
<message>
@@ -1057,6 +1062,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Restaurare portofel</translation>
</message>
<message>
+ <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
+ <translation type="unfinished">Restabilirea Portofelului&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
<translation type="unfinished">Restaurarea portofelului nereusita</translation>
@@ -2124,6 +2134,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Activitatea retelei a fost oprita.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Niciuna</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Executarea comenzii fara nici un portofel.</translation>
</message>
@@ -2638,10 +2652,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">&amp;Semnează mesaj</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puteţi semna mesaje/contracte cu adresele dvs. pentru a demostra ca puteti primi bitcoini trimisi la ele. Aveţi grijă să nu semnaţi nimic vag sau aleator, deoarece atacurile de tip phishing vă pot păcăli să le transferaţi identitatea. Semnaţi numai declaraţiile detaliate cu care sînteti de acord.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Adresa cu care semnaţi mesajul</translation>
</message>
@@ -2718,10 +2728,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Vă rugăm verificaţi adresa şi încercaţi din nou.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Adresa introdusă nu se referă la o cheie.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Deblocarea portofelului a fost anulata.</translation>
</message>
@@ -3199,11 +3205,6 @@ Mergi la Fisiere&gt;Deschide Portofel ca sa incarci un portofel.
<translation type="unfinished">Confirma cresterea comisionului</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiat in Notite</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Nu s-a reuşit semnarea tranzacţiei</translation>
</message>
@@ -3215,10 +3216,6 @@ Mergi la Fisiere&gt;Deschide Portofel ca sa incarci un portofel.
<source>Can't display address</source>
<translation type="unfinished">Nu se poate afisa adresa</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">portofel implicit</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3271,10 +3268,6 @@ Mergi la Fisiere&gt;Deschide Portofel ca sa incarci un portofel.
<translation type="unfinished">Distribuit sub licenţa de programe MIT, vezi fişierul însoţitor %s sau %s</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Vă rugăm verificaţi dacă data/timpul calculatorului dvs. sînt corecte! Dacă ceasul calcultorului este gresit, %s nu va funcţiona corect.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Va rugam sa contribuiti daca apreciati ca %s va este util. Vizitati %s pentru mai multe informatii despre software.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts
index c7ac89b746..7a54b45768 100644
--- a/src/qt/locale/bitcoin_ru.ts
+++ b/src/qt/locale/bitcoin_ru.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Щелкните правой кнопкой мыши, чтобы отредактировать Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ñтикетку</translation>
+ <translation type="unfinished">Ðажмите правую кнопку мыши, чтобы изменить Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ метку</translation>
</message>
<message>
<source>Create a new address</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Копирование выбранного адреÑа в ÑиÑтемный буфер обмена</translation>
+ <translation type="unfinished">Скопировать выбранные адреÑа в буфер обмена</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -86,12 +86,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Файл, разделенный запÑтыми</translation>
+ <translation type="unfinished">ТекÑÑ‚, разделённый запÑтыми (*.csv)</translation>
</message>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
<extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">Произошла ошибка при попытке Ñохранить ÑпиÑок адреÑов в %1. ПожалуйÑта, попробуйте еще раз.</translation>
+ <translation type="unfinished">Произошла ошибка при Ñохранении ÑпиÑка адреÑов в %1. ПожалуйÑта, попробуйте еще раз.</translation>
</message>
<message>
<source>Sending addresses - %1</source>
@@ -125,23 +125,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation type="unfinished">ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°</translation>
+ <translation type="unfinished">Пароль</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Введите парольную фразу</translation>
+ <translation type="unfinished">Введите пароль</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°</translation>
+ <translation type="unfinished">Ðовый пароль</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Повторите новую парольную фразу</translation>
+ <translation type="unfinished">Повторите новый пароль</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Показать парольную фразу</translation>
+ <translation type="unfinished">Показать пароль</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -149,7 +149,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Ð”Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ фразы Ð´Ð»Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ вашего кошелька.</translation>
+ <translation type="unfinished">Ð”Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ вашего кошелька.</translation>
</message>
<message>
<source>Unlock wallet</source>
@@ -157,7 +157,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change passphrase</source>
- <translation type="unfinished">Изменить парольную фразу</translation>
+ <translation type="unfinished">Изменить пароль</translation>
</message>
<message>
<source>Confirm wallet encryption</source>
@@ -165,7 +165,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Предупреждение: еÑли вы зашифруете кошелёк и потерÑете парольную фразу, вы &lt;b&gt;ПОТЕРЯЕТЕ ВСЕ Ð’ÐШИ БИТКОИÐЫ&lt;/b&gt;!</translation>
+ <translation type="unfinished">Предупреждение: ЕÑли вы зашифруете кошелёк и потерÑете пароль, вы &lt;b&gt;ПОТЕРЯЕТЕ ВСЕ Ð’ÐШИ БИТКОЙÐЫ&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
@@ -177,11 +177,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">Введите новую парольную фразу Ð´Ð»Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°.&lt;br/&gt;ПожалуйÑта, иÑпользуйте парольную фразу из &lt;b&gt;деÑÑти или более Ñлучайных Ñимволов&lt;/b&gt;, либо &lt;b&gt;воÑьми или более Ñлов&lt;/b&gt;.</translation>
+ <translation type="unfinished">Введите новый пароль Ð´Ð»Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°.&lt;br/&gt;ИÑпользуйте пароль, ÑоÑтоÑщий из &lt;b&gt;деÑÑти или более Ñлучайных Ñимволов&lt;/b&gt; или &lt;b&gt;воÑьми или более Ñлов&lt;/b&gt;.</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Введите Ñтарую и новую парольные фразы Ð´Ð»Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°.</translation>
+ <translation type="unfinished">Введите Ñтарый и новый пароли Ð´Ð»Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°.</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished">Продолжить</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Ðазад</translation>
</message>
<message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
@@ -189,7 +197,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet to be encrypted</source>
- <translation type="unfinished">Кошелёк должен быть зашифрован</translation>
+ <translation type="unfinished">Кошелёк, который будет зашифрован</translation>
</message>
<message>
<source>Your wallet is about to be encrypted. </source>
@@ -197,7 +205,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ð°Ñˆ кошелёк зашифрован. </translation>
+ <translation type="unfinished">Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ð°Ñˆ кошелёк зашифрован.</translation>
</message>
<message>
<source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
@@ -205,15 +213,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet encryption failed</source>
- <translation type="unfinished">Шифрование кошелька не удалоÑÑŒ</translation>
+ <translation type="unfinished">Ðе удалоÑÑŒ зашифровать кошелёк</translation>
</message>
<message>
<source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">Шифрование кошелька не удалоÑÑŒ из-за внутренней ошибки. Ваш кошелек не был зашифрован.</translation>
+ <translation type="unfinished">Сбой ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ° из-за внутренней ошибки. Ваш кошелёк не был зашифрован.</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Введенные пароли не Ñовпадают.</translation>
+ <translation type="unfinished">Введённые пароли не Ñовпадают.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
@@ -221,7 +229,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°, Ð²Ð²ÐµÐ´Ñ‘Ð½Ð½Ð°Ñ Ð´Ð»Ñ Ñ€Ð°Ñшифровки кошелька, неверна.</translation>
+ <translation type="unfinished">Пароль, введенный при шифровании кошелька, некорректен.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
@@ -229,15 +237,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° кошелька уÑпешно изменена.</translation>
+ <translation type="unfinished">Пароль кошелька уÑпешно изменён.</translation>
</message>
<message>
<source>Passphrase change failed</source>
- <translation type="unfinished">Ðе удалоÑÑŒ Ñменить парольную фразу</translation>
+ <translation type="unfinished">Ðе удалоÑÑŒ Ñменить пароль</translation>
</message>
<message>
<source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°, Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°, не подходит. Она Ñодержит нулевой байт. ЕÑли Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° была задана в программе верÑии ниже 25.0, пожалуйÑта, попробуйте ввеÑти только Ñимволы до первого нулевого байта, не Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÐµÐ³Ð¾.</translation>
+ <translation type="unfinished">Текущий пароль, введенный Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°, не подходит. Он Ñодержит нулевой байт. ЕÑли пароль была задан в программе верÑии ниже 25.0, пожалуйÑта, попробуйте ввеÑти только Ñимволы до первого нулевого байта, не Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÐµÐ³Ð¾.</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -303,147 +311,60 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">неизвеÑтно</translation>
</message>
<message>
- <source>Amount</source>
- <translation type="unfinished">Сумма</translation>
- </message>
- <message>
- <source>Enter a Bitcoin address (e.g. %1)</source>
- <translation type="unfinished">Введите биткоин-Ð°Ð´Ñ€ÐµÑ (например,%1)</translation>
- </message>
- <message>
- <source>Unroutable</source>
- <translation type="unfinished">Ðемаршрутизируемый</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
- <translation type="unfinished">ВходÑщий</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">ИÑходÑщий</translation>
- </message>
- <message>
- <source>Full Relay</source>
- <extracomment>Peer connection type that relays all network information.</extracomment>
- <translation type="unfinished">Полный ретранÑлÑтор</translation>
- </message>
- <message>
- <source>Block Relay</source>
- <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">РетранÑлÑтор блоков</translation>
- </message>
- <message>
- <source>Manual</source>
- <extracomment>Peer connection type established manually through one of several methods.</extracomment>
- <translation type="unfinished">Вручную</translation>
- </message>
- <message>
- <source>Feeler</source>
- <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Пробный</translation>
- </message>
- <message>
- <source>Address Fetch</source>
- <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
- <translation type="unfinished">Получение адреÑов</translation>
- </message>
- <message>
- <source>%1 d</source>
- <translation type="unfinished">%1 д</translation>
- </message>
- <message>
- <source>%1 h</source>
- <translation type="unfinished">%1 ч</translation>
- </message>
- <message>
- <source>%1 m</source>
- <translation type="unfinished">%1 м</translation>
- </message>
- <message>
- <source>%1 s</source>
- <translation type="unfinished">%1 Ñ</translation>
- </message>
- <message>
- <source>None</source>
- <translation type="unfinished">Ðет</translation>
- </message>
- <message>
- <source>N/A</source>
- <translation type="unfinished">Ð/д</translation>
- </message>
- <message>
- <source>%1 ms</source>
- <translation type="unfinished">%1 мÑ</translation>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">СиÑтемный шрифт по умолчанию "%1"</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform>%n Ñекунда</numerusform>
- <numerusform>%n Ñекунды</numerusform>
- <numerusform>%n Ñекунд</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform>%n минута</numerusform>
- <numerusform>%n минуты</numerusform>
- <numerusform>%n минут</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform>%n чаÑ</numerusform>
- <numerusform>%n чаÑа</numerusform>
- <numerusform>%n чаÑов</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform>%n день</numerusform>
- <numerusform>%n днÑ</numerusform>
- <numerusform>%n дней</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform>%n неделÑ</numerusform>
- <numerusform>%n недели</numerusform>
- <numerusform>%n недель</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
</translation>
</message>
- <message>
- <source>%1 and %2</source>
- <translation type="unfinished">%1 и %2</translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform>%n год</numerusform>
- <numerusform>%n года</numerusform>
- <numerusform>%n лет</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
<message>
- <source>%1 B</source>
- <translation type="unfinished">%1 Б</translation>
- </message>
- <message>
- <source>%1 kB</source>
- <translation type="unfinished">%1 КБ</translation>
- </message>
- <message>
- <source>%1 MB</source>
- <translation type="unfinished">%1 МБ</translation>
- </message>
- <message>
- <source>%1 GB</source>
- <translation type="unfinished">%1 ГБ</translation>
+ <source>default wallet</source>
+ <translation type="unfinished">кошелёк по умолчанию</translation>
</message>
</context>
<context>
@@ -523,7 +444,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Изменить пароль иÑпользуемый Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°</translation>
+ <translation type="unfinished">Изменить пароль, иÑпользуемый Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -539,7 +460,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Зашифровать Кошелёк…</translation>
+ <translation type="unfinished">&amp;Зашифровать Кошелёк...</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -547,15 +468,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Создать резервную копию кошелька…</translation>
+ <translation type="unfinished">&amp;Создать резервную копию кошелька...</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Изменить пароль…</translation>
+ <translation type="unfinished">&amp;Изменить пароль...</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">ПодпиÑать &amp;Ñообщение…</translation>
+ <translation type="unfinished">ПодпиÑать &amp;Ñообщение...</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
@@ -563,7 +484,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Verify message…</source>
- <translation type="unfinished">&amp;Проверить Ñообщение…</translation>
+ <translation type="unfinished">&amp;Проверить Ñообщение</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
@@ -571,23 +492,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Загрузить PSBT из файла…</translation>
+ <translation type="unfinished">&amp;Загрузить PSBT из файла...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
- <translation type="unfinished">Открыть &amp;URI…</translation>
+ <translation type="unfinished">Открыть &amp;URI...</translation>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Закрыть кошелёк…</translation>
+ <translation type="unfinished">Закрыть кошелёк...</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Создать кошелёк…</translation>
+ <translation type="unfinished">Создать кошелёк...</translation>
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">Закрыть вÑе кошельки…</translation>
+ <translation type="unfinished">Закрыть вÑе кошельки...</translation>
</message>
<message>
<source>&amp;File</source>
@@ -607,19 +528,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² (%1%)…</translation>
+ <translation type="unfinished">Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² (%1%)...</translation>
</message>
<message>
<source>Synchronizing with network…</source>
- <translation type="unfinished">Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ñетью…</translation>
+ <translation type="unfinished">Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ñетью...</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
- <translation type="unfinished">ИндекÑÐ°Ñ†Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð² на диÑке…</translation>
+ <translation type="unfinished">ИндекÑÐ°Ñ†Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð² на диÑке...</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Обработка блоков на диÑке…</translation>
+ <translation type="unfinished">Обработка блоков на диÑке...</translation>
</message>
<message>
<source>Connecting to peers…</source>
@@ -631,15 +552,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Показать ÑпиÑок иÑпользованных адреÑов и меток отправки</translation>
+ <translation type="unfinished">Показать ÑпиÑок иÑпользованных адреÑов отправки и меток</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Показать ÑпиÑок иÑпользованных адреÑов и меток получателей</translation>
+ <translation type="unfinished">Показать ÑпиÑок иÑпользованных адреÑов Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸ меток</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">Параметры командной Ñтроки</translation>
+ <translation type="unfinished">&amp;Параметры командной Ñтроки</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -679,7 +600,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">До наÑтоÑщего времени</translation>
+ <translation type="unfinished">Синхронизированно</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -711,7 +632,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Открыть биткойн: URI</translation>
+ <translation type="unfinished">Открыть URI протокола bitcoin:</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -733,7 +654,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Restore a wallet from a backup file</source>
<extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">ВоÑÑтановить кошелёк из резервной копии</translation>
+ <translation type="unfinished">ВоÑÑтановить кошелек из резервной копии</translation>
</message>
<message>
<source>Close all wallets</source>
@@ -760,10 +681,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Скрыть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° вкладке Обзор</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">кошелёк по умолчанию</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ðет доÑтупных кошельков</translation>
</message>
@@ -846,11 +763,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error creating wallet</source>
- <translation type="unfinished">Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°</translation>
+ <translation type="unfinished">Ошибка при Ñоздании кошелька</translation>
</message>
<message>
<source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Ðевозможно Ñоздать новый кошелек, программа была Ñкомпилирована без поддержки sqlite (требуетÑÑ Ð´Ð»Ñ Ð´ÐµÑкрипторных кошельков)</translation>
+ <translation type="unfinished">Ðе удалоÑÑŒ Ñоздать новый кошелёк, так как программа Ñобрана без поддержки SQLite (необходим Ð´Ð»Ñ Ð´ÐµÑкрипторных кошельков)</translation>
</message>
<message>
<source>Error: %1</source>
@@ -898,7 +815,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Sent transaction</source>
- <translation type="unfinished">ÐžÑ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ</translation>
+ <translation type="unfinished">ИÑходÑÑ‰Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ</translation>
</message>
<message>
<source>Incoming transaction</source>
@@ -906,11 +823,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">HD-Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ &lt;b&gt;включена&lt;/b&gt;</translation>
+ <translation type="unfinished">Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ HD-ключей &lt;b&gt;разрешена&lt;/b&gt;</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">HD-Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ &lt;b&gt;выключена&lt;/b&gt;</translation>
+ <translation type="unfinished">Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ HD-ключей &lt;b&gt;запрещена&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -948,7 +865,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">Байты:</translation>
+ <translation type="unfinished">Байтов:</translation>
</message>
<message>
<source>Amount:</source>
@@ -1137,7 +1054,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">ПеренеÑти Кошелек</translation>
+ <translation type="unfinished">ПеренеÑти кошелек</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1148,14 +1065,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Кошелек '%1' был уÑпешно перенеÑён.</translation>
</message>
<message>
- <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Скрипты Watchonly были перенеÑены в новый кошелек под названием '%1'.</translation>
- </message>
- <message>
- <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Решаемые, но не наблюдаемые Ñценарии были перенеÑены в новый кошелек под названием '%1'.</translation>
- </message>
- <message>
<source>Migration failed</source>
<translation type="unfinished">ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð½Ðµ удалÑÑ</translation>
</message>
@@ -1175,13 +1084,9 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Предупреждение при открытии кошелька</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">кошелёк по умолчанию</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Открыть кошелёк</translation>
+ <translation type="unfinished">Открытие кошелька</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1194,7 +1099,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">ВоÑÑтановить кошелёк</translation>
+ <translation type="unfinished">ВоÑÑтановление кошелька</translation>
</message>
<message>
<source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1204,7 +1109,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Ðе удалоÑÑŒ воÑÑтановить кошелек</translation>
+ <translation type="unfinished">Ðе удалоÑÑŒ воÑÑтановить кошелёк</translation>
</message>
<message>
<source>Restore wallet warning</source>
@@ -1251,7 +1156,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Wallet Name</source>
- <translation type="unfinished">Ðазвание кошелька</translation>
+ <translation type="unfinished">Ð˜Ð¼Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°</translation>
</message>
<message>
<source>Wallet</source>
@@ -1271,7 +1176,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Отключить приватные ключи Ð´Ð»Ñ Ñтого кошелька. Ð’ кошельках Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ñ‹Ð¼Ð¸ приватными ключами не ÑохранÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ñ‹Ðµ ключи, в них Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать HD маÑтер-ключ или импортировать приватные ключи. Это удобно Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´Ð°ÑŽÑ‰Ð¸Ñ… кошельков.</translation>
+ <translation type="unfinished">Отключить приватные ключи Ð´Ð»Ñ Ñтого кошелька. Ð’ кошельках Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ñ‹Ð¼Ð¸ приватными ключами не ÑохранÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ñ‹Ðµ ключи, в них Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать HD маÑтер-ключ или импортировать приватные ключи. Это отличный вариант Ð´Ð»Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ¾Ð² Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð·Ð° баланÑом.</translation>
</message>
<message>
<source>Disable Private Keys</source>
@@ -1291,7 +1196,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>External signer</source>
- <translation type="unfinished">ВнешнÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ñторона</translation>
+ <translation type="unfinished">Внешний подпиÑант</translation>
</message>
<message>
<source>Create</source>
@@ -1339,15 +1244,15 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">Введенный Ð°Ð´Ñ€ÐµÑ "%1" недейÑтвителен в Ñети Биткоин.</translation>
+ <translation type="unfinished">Введенный Ð°Ð´Ñ€ÐµÑ "%1" не ÑвлÑетÑÑ Ð´ÐµÐ¹Ñтвительным биткоин-адреÑом.</translation>
</message>
<message>
<source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">ÐÐ´Ñ€ÐµÑ "%1" уже ÑущеÑтвует как Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ "%2", и поÑтому не может быть добавлен как Ð°Ð´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ.</translation>
+ <translation type="unfinished">ÐÐ´Ñ€ÐµÑ "%1" уже ÑущеÑтвует в качеÑтве адреÑа Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹ "%2" и поÑтому не может быть добавлен в качеÑтве адреÑа Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸.</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
- <translation type="unfinished">Введенный Ð°Ð´Ñ€ÐµÑ "%1" уже ÑущеÑтвует в адреÑной книге под именем "%2".</translation>
+ <translation type="unfinished">Введённый Ð°Ð´Ñ€ÐµÑ "%1" уже ÑущеÑтвует в адреÑной книге Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹ "%2".</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -1365,10 +1270,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Будет Ñоздан новый каталог данных.</translation>
</message>
<message>
- <source>name</source>
- <translation type="unfinished">название</translation>
- </message>
- <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">Каталог уже ÑущеÑтвует. Добавьте %1, еÑли хотите Ñоздать здеÑÑŒ новый каталог.</translation>
</message>
@@ -1386,7 +1287,7 @@ The migration process will create a backup of the wallet before migrating. This
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform>%n ГБ меÑта доÑтупен</numerusform>
+ <numerusform>%n ГБ меÑта доÑтупно</numerusform>
<numerusform>%n ГБ меÑта доÑтупно</numerusform>
<numerusform>%n ГБ меÑта доÑтупно</numerusform>
</translation>
@@ -1430,7 +1331,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">%1 загрузит и Ñохранит копию цепочки блоков Bitcoin.</translation>
+ <translation type="unfinished">%1 Ñкачает и Ñохранит копию цепочки блоков Bitcoin.</translation>
</message>
<message>
<source>The wallet will also be stored in this directory.</source>
@@ -1438,7 +1339,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">Ошибка: невозможно Ñоздать указанный каталог данных "%1".</translation>
+ <translation type="unfinished">Ошибка: не удалоÑÑŒ Ñоздать указанный каталог данных "%1".</translation>
</message>
<message>
<source>Error</source>
@@ -1482,7 +1383,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Use the default data directory</source>
- <translation type="unfinished">ИÑпользовать Ñтандартный каталог данных</translation>
+ <translation type="unfinished">ИÑпользовать каталог данных по умолчанию</translation>
</message>
<message>
<source>Use a custom data directory:</source>
@@ -1497,11 +1398,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>About %1</source>
- <translation type="unfinished">О %1</translation>
+ <translation type="unfinished">О программе %1</translation>
</message>
<message>
<source>Command-line options</source>
- <translation type="unfinished">Опции командной Ñтроки</translation>
+ <translation type="unfinished">Параметры командной Ñтроки</translation>
</message>
</context>
<context>
@@ -1512,22 +1413,18 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">Ðе выключайте компьютер, пока Ñто окно не пропадёт.</translation>
+ <translation type="unfinished">Ðе выключайте компьютер, пока Ñто окно не иÑчезнет.</translation>
</message>
</context>
<context>
<name>ModalOverlay</name>
<message>
- <source>Form</source>
- <translation type="unfinished">Форма</translation>
- </message>
- <message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
<translation type="unfinished">Ðедавние транзакции могут быть пока не видны, и поÑтому отображаемый Ð±Ð°Ð»Ð°Ð½Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ кошелька может быть неточной. Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñтанет точной поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñинхронизации Ñ Ñетью биткоина. ПрогреÑÑ Ñинхронизации вы можете видеть Ñнизу.</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">Попытка потратить ÑредÑтва, затронутые не видными пока транзакциÑми, будет отклонена Ñетью.</translation>
+ <translation type="unfinished">Попытка потратить ÑредÑтва, иÑпользованные в транзакциÑÑ…, которые ещё не Ñинхронизированы, будет отклонена Ñетью.</translation>
</message>
<message>
<source>Number of blocks left</source>
@@ -1562,16 +1459,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Скрыть</translation>
</message>
<message>
- <source>Esc</source>
- <translation type="unfinished">Выход</translation>
- </message>
- <message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
<translation type="unfinished">%1 в наÑтоÑщий момент ÑинхронизируетÑÑ. Заголовки и блоки будут ÑкачиватьÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… узлов Ñети и проверÑÑ‚ÑŒÑÑ Ð´Ð¾ тех пор, пока не будет доÑтигнут конец цепочки блоков.</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">ÐеизвеÑтно. СинхронизируютÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ (%1, %2%)…</translation>
+ <translation type="unfinished">ÐеизвеÑтно. Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² (%1, %2%)…</translation>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
@@ -1602,7 +1495,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">ÐвтоматичеÑки запуÑкать %1поÑле входа в ÑиÑтему.</translation>
+ <translation type="unfinished">ÐвтоматичеÑки запуÑкать %1 поÑле входа в ÑиÑтему.</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1626,7 +1519,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
- <translation type="unfinished">IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи (к примеру, IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ <translation type="unfinished">IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи-Ñервера (к примеру, IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
<message>
<source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
@@ -1637,6 +1530,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Сворачивать вмеÑто выхода из Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ закрытии окна. ЕÑли данный параметр включён, приложение закроетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ поÑле Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ "Выход" в меню.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Шрифт на вкладке «Обзор»:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Параметры командной Ñтроки, которые переопределили параметры из Ñтого окна:</translation>
</message>
@@ -1719,10 +1616,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">ЭкÑпертные наÑтройки</translation>
</message>
<message>
- <source>Enable coin &amp;control features</source>
- <translation type="unfinished">Включить возможноÑÑ‚ÑŒ &amp;ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð½ÐµÑ‚Ð°Ð¼Ð¸</translation>
- </message>
- <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">ЕÑли вы отключите трату неподтверждённой Ñдачи, Ñдачу от транзакции Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать до тех пор, пока у Ñтой транзакции не будет Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одного подтверждениÑ. Это также влиÑет на раÑчёт вашего баланÑа.</translation>
</message>
@@ -1866,7 +1759,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Cancel</source>
- <translation type="unfinished">О&amp;тмена</translation>
+ <translation type="unfinished">&amp;Отмена</translation>
</message>
<message>
<source>Compiled without external signing support (required for external signing)</source>
@@ -1889,7 +1782,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
- <translation type="unfinished">Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ изменений необходим перезапуÑк клиента.</translation>
+ <translation type="unfinished">Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк клиента.</translation>
</message>
<message>
<source>Client will be shut down. Do you want to proceed?</source>
@@ -1941,10 +1834,6 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>OverviewPage</name>
<message>
- <source>Form</source>
- <translation type="unfinished">Форма</translation>
- </message>
- <message>
<source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
<translation type="unfinished">ÐžÑ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÐ¼Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть уÑтаревшей. Ваш кошелёк автоматичеÑки ÑинхронизируетÑÑ Ñ Ñетью Bitcoin поÑле подключениÑ, и Ñтот процеÑÑ Ð¿Ð¾ÐºÐ° не завершён.</translation>
</message>
@@ -2008,1104 +1897,35 @@ The migration process will create a backup of the wallet before migrating. This
<source>Mined balance in watch-only addresses that has not yet matured</source>
<translation type="unfinished">Ð‘Ð°Ð»Ð°Ð½Ñ Ð´Ð¾Ð±Ñ‹Ñ‚Ñ‹Ñ… монет на наблюдаемых адреÑах, который ещё не Ñозрел</translation>
</message>
- <message>
- <source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Текущий итоговый Ð±Ð°Ð»Ð°Ð½Ñ Ð½Ð° наблюдаемых адреÑах</translation>
- </message>
- <message>
- <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
- <translation type="unfinished">Включён режим приватноÑти Ð´Ð»Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸ Обзор. Чтобы показать данные, Ñнимите отметку Ñ Ð¿ÑƒÐ½ÐºÑ‚Ð° ÐаÑтройки -&gt; Скрыть значениÑ.</translation>
- </message>
-</context>
-<context>
- <name>PSBTOperationsDialog</name>
- <message>
- <source>PSBT Operations</source>
- <translation type="unfinished">Операции Ñ PSBT</translation>
- </message>
- <message>
- <source>Sign Tx</source>
- <translation type="unfinished">ПодпиÑать транзакцию</translation>
- </message>
- <message>
- <source>Broadcast Tx</source>
- <translation type="unfinished">Отправить транзакцию</translation>
- </message>
- <message>
- <source>Copy to Clipboard</source>
- <translation type="unfinished">Скопировать в буфер обмена</translation>
- </message>
- <message>
- <source>Save…</source>
- <translation type="unfinished">Сохранить…</translation>
- </message>
- <message>
- <source>Close</source>
- <translation type="unfinished">Закрыть</translation>
- </message>
- <message>
- <source>Failed to load transaction: %1</source>
- <translation type="unfinished">Ðе удалоÑÑŒ загрузить транзакцию: %1</translation>
- </message>
- <message>
- <source>Failed to sign transaction: %1</source>
- <translation type="unfinished">Ðе удалоÑÑŒ подпиÑать транзакцию: %1</translation>
- </message>
- <message>
- <source>Cannot sign inputs while wallet is locked.</source>
- <translation type="unfinished">Ðевозможно подпиÑать входы пока кошелёк заблокирован.</translation>
- </message>
- <message>
- <source>Could not sign any more inputs.</source>
- <translation type="unfinished">Ðе удалоÑÑŒ подпиÑать оÑтавшиеÑÑ Ð²Ñ…Ð¾Ð´Ñ‹.</translation>
- </message>
- <message>
- <source>Signed %1 inputs, but more signatures are still required.</source>
- <translation type="unfinished">ПодпиÑано %1 входов, но требуетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ подпиÑей.</translation>
- </message>
- <message>
- <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÑƒÑпешно подпиÑана. Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð° к отправке.</translation>
- </message>
- <message>
- <source>Unknown error processing transaction.</source>
- <translation type="unfinished">ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ транзакции.</translation>
- </message>
- <message>
- <source>Transaction broadcast successfully! Transaction ID: %1</source>
- <translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÑƒÑпешно отправлена! Идентификатор транзакции: %1</translation>
- </message>
- <message>
- <source>Transaction broadcast failed: %1</source>
- <translation type="unfinished">Отправка транзакции не удалаÑÑŒ: %1</translation>
- </message>
- <message>
- <source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT Ñкопирована в буфер обмена.</translation>
- </message>
- <message>
- <source>Save Transaction Data</source>
- <translation type="unfinished">Сохранить данные о транзакции</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (Binary)</source>
- <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">ЧаÑтично подпиÑÐ°Ð½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ (двоичный файл)</translation>
- </message>
- <message>
- <source>PSBT saved to disk.</source>
- <translation type="unfinished">PSBT Ñохранена на диÑк.</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">Ñвой адреÑ</translation>
- </message>
- <message>
- <source>Unable to calculate transaction fee or total transaction amount.</source>
- <translation type="unfinished">Ðе удалоÑÑŒ вычиÑлить Ñумму комиÑÑии или общую Ñумму транзакции.</translation>
- </message>
- <message>
- <source>Pays transaction fee: </source>
- <translation type="unfinished">Платит комиÑÑию: </translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">Ð˜Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñумма</translation>
- </message>
- <message>
- <source>or</source>
- <translation type="unfinished">или</translation>
- </message>
- <message>
- <source>Transaction has %1 unsigned inputs.</source>
- <translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ %1 неподпиÑанных входов.</translation>
- </message>
- <message>
- <source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ недоÑтаточно информации о некоторых входах.</translation>
- </message>
- <message>
- <source>Transaction still needs signature(s).</source>
- <translation type="unfinished">Транзакции требуетÑÑ Ð¿Ð¾ крайней мере ещё одна подпиÑÑŒ.</translation>
- </message>
- <message>
- <source>(But no wallet is loaded.)</source>
- <translation type="unfinished">(Ðо ни один кошелёк не загружен.)</translation>
- </message>
- <message>
- <source>(But this wallet cannot sign transactions.)</source>
- <translation type="unfinished">(Ðо Ñтот кошелёк не может подпиÑывать транзакции.)</translation>
- </message>
- <message>
- <source>(But this wallet does not have the right keys.)</source>
- <translation type="unfinished">(Ðо Ñтот кошелёк не имеет необходимых ключей.)</translation>
- </message>
- <message>
- <source>Transaction is fully signed and ready for broadcast.</source>
- <translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью подпиÑана и готова к отправке.</translation>
- </message>
- <message>
- <source>Transaction status is unknown.</source>
- <translation type="unfinished">Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ неизвеÑтен.</translation>
- </message>
-</context>
-<context>
- <name>PaymentServer</name>
- <message>
- <source>Payment request error</source>
- <translation type="unfinished">Ошибка запроÑа платежа</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить обработчик click-to-pay Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð° bitcoin</translation>
- </message>
- <message>
- <source>URI handling</source>
- <translation type="unfinished">Обработка URI</translation>
- </message>
- <message>
- <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
- <translation type="unfinished">"bitcoin://" — Ñто неверный URI. ИÑпользуйте вмеÑто него "bitcoin:".</translation>
- </message>
- <message>
- <source>Cannot process payment request because BIP70 is not supported.
-Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
-If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">Ðе удалоÑÑŒ обработать транзакцию, потому что BIP70 не поддерживаетÑÑ.
-Из-за широко раÑпроÑтранённых уÑзвимоÑтей в BIP70, наÑтоÑтельно рекомендуетÑÑ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ любые инÑтрукции продавцов Ñменить кошелёк.
-ЕÑли вы получили Ñту ошибку, вам Ñледует попроÑить у продавца URI, ÑовмеÑтимый Ñ BIP21.</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation type="unfinished">Ðе удалоÑÑŒ обработать URI! Это может быть вызвано тем, что биткоин-Ð°Ð´Ñ€ÐµÑ Ð½ÐµÐ²ÐµÑ€ÐµÐ½ или параметры URI Ñформированы неправильно.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation type="unfinished">Обработка файла Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом платежа</translation>
- </message>
-</context>
-<context>
- <name>PeerTableModel</name>
- <message>
- <source>User Agent</source>
- <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
- <translation type="unfinished">ПользовательÑкий агент</translation>
- </message>
- <message>
- <source>Ping</source>
- <extracomment>Title of Peers Table column which indicates the current latency of the connection with the peer.</extracomment>
- <translation type="unfinished">Пинг</translation>
- </message>
- <message>
- <source>Peer</source>
- <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
- <translation type="unfinished">Узел</translation>
- </message>
- <message>
- <source>Age</source>
- <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">ВозраÑÑ‚</translation>
- </message>
- <message>
- <source>Direction</source>
- <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
- <translation type="unfinished">Ðаправление</translation>
- </message>
- <message>
- <source>Sent</source>
- <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
- <translation type="unfinished">Отправлено</translation>
- </message>
- <message>
- <source>Received</source>
- <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
- <translation type="unfinished">Получено</translation>
- </message>
- <message>
- <source>Address</source>
- <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
- <translation type="unfinished">ÐдреÑ</translation>
- </message>
- <message>
- <source>Type</source>
- <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
- <translation type="unfinished">Тип</translation>
- </message>
- <message>
- <source>Network</source>
- <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
- <translation type="unfinished">Сеть</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An Inbound Connection from a Peer.</extracomment>
- <translation type="unfinished">ВходÑщий</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">ИÑходÑщий</translation>
- </message>
-</context>
-<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;Сохранить изображение…</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;Копировать изображение</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">ПолучившийÑÑ URI Ñлишком длинный, попробуйте Ñократить текÑÑ‚ метки или ÑообщениÑ.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Ошибка Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ URI в QR-код.</translation>
- </message>
- <message>
- <source>QR code support not available.</source>
- <translation type="unfinished">Поддержка QR-кодов недоÑтупна.</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">Сохранить QR-код</translation>
- </message>
- <message>
- <source>PNG Image</source>
- <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
- <translation type="unfinished">Изображение PNG</translation>
- </message>
-</context>
+ </context>
<context>
<name>RPCConsole</name>
<message>
- <source>N/A</source>
- <translation type="unfinished">Ð/д</translation>
- </message>
- <message>
- <source>Client version</source>
- <translation type="unfinished">ВерÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°</translation>
- </message>
- <message>
- <source>&amp;Information</source>
- <translation type="unfinished">&amp;ИнформациÑ</translation>
- </message>
- <message>
- <source>General</source>
- <translation type="unfinished">Общие</translation>
- </message>
- <message>
- <source>Datadir</source>
- <translation type="unfinished">Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…</translation>
- </message>
- <message>
- <source>To specify a non-default location of the data directory use the '%1' option.</source>
- <translation type="unfinished">Чтобы указать неÑтандартное раÑположение каталога данных, иÑпользуйте параметр "%1".</translation>
- </message>
- <message>
- <source>Blocksdir</source>
- <translation type="unfinished">Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²</translation>
- </message>
- <message>
- <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">Чтобы указать неÑтандартное раÑположение каталога блоков, иÑпользуйте параметр "%1".</translation>
- </message>
- <message>
- <source>Startup time</source>
- <translation type="unfinished">Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка</translation>
- </message>
- <message>
- <source>Network</source>
- <translation type="unfinished">Сеть</translation>
- </message>
- <message>
- <source>Name</source>
- <translation type="unfinished">Ðазвание</translation>
- </message>
- <message>
- <source>Number of connections</source>
- <translation type="unfinished">КоличеÑтво Ñоединений</translation>
- </message>
- <message>
- <source>Block chain</source>
- <translation type="unfinished">Цепочка блоков</translation>
- </message>
- <message>
- <source>Memory Pool</source>
- <translation type="unfinished">Пул памÑти</translation>
- </message>
- <message>
- <source>Current number of transactions</source>
- <translation type="unfinished">Текущее количеÑтво транзакций</translation>
- </message>
- <message>
- <source>Memory usage</source>
- <translation type="unfinished">ИÑпользование памÑти</translation>
- </message>
- <message>
- <source>Wallet: </source>
- <translation type="unfinished">Кошелёк: </translation>
- </message>
- <message>
- <source>(none)</source>
- <translation type="unfinished">(нет)</translation>
- </message>
- <message>
- <source>&amp;Reset</source>
- <translation type="unfinished">&amp;СброÑ</translation>
- </message>
- <message>
- <source>Received</source>
- <translation type="unfinished">Получено</translation>
- </message>
- <message>
- <source>Sent</source>
- <translation type="unfinished">Отправлено</translation>
- </message>
- <message>
- <source>&amp;Peers</source>
- <translation type="unfinished">&amp;Узлы</translation>
- </message>
- <message>
- <source>Banned peers</source>
- <translation type="unfinished">Заблокированные узлы</translation>
- </message>
- <message>
- <source>Select a peer to view detailed information.</source>
- <translation type="unfinished">Выберите узел Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра подробноÑтей.</translation>
- </message>
- <message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">ВерÑÐ¸Ñ Ñ‚Ñ€Ð°Ð½Ñпортного протокола:%1</translation>
- </message>
- <message>
- <source>Transport</source>
- <translation type="unfinished">ТранÑпортный протокол</translation>
- </message>
- <message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Строка идентификатора ÑеанÑа BIP324 в шеÑтнадцатеричном формате, еÑли таковой имеетÑÑ.</translation>
- </message>
- <message>
- <source>Session ID</source>
- <translation type="unfinished">ID ÑеÑÑии</translation>
- </message>
- <message>
- <source>Version</source>
- <translation type="unfinished">ВерÑиÑ</translation>
- </message>
- <message>
- <source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Предаем ли мы транзакции Ñтому узлу.</translation>
- </message>
- <message>
- <source>Transaction Relay</source>
- <translation type="unfinished">РетранÑлÑтор транзакций</translation>
- </message>
- <message>
- <source>Starting Block</source>
- <translation type="unfinished">Ðачальный блок</translation>
- </message>
- <message>
- <source>Synced Headers</source>
- <translation type="unfinished">Синхронизировано заголовков</translation>
- </message>
- <message>
- <source>Synced Blocks</source>
- <translation type="unfinished">Синхронизировано блоков</translation>
- </message>
- <message>
- <source>Last Transaction</source>
- <translation type="unfinished">ПоÑледнÑÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ</translation>
- </message>
- <message>
- <source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð¾Ð¼Ð½Ð°Ñ ÑиÑтема, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð´Ð¸Ð²ÐµÑ€Ñификации узлов, к которым производитÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ.</translation>
- </message>
- <message>
- <source>Mapped AS</source>
- <translation type="unfinished">ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ð°Ñ ÐС</translation>
- </message>
- <message>
- <source>Whether we relay addresses to this peer.</source>
- <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Передаем ли мы адреÑа Ñтому узлу.</translation>
- </message>
- <message>
- <source>Address Relay</source>
- <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">РетранÑлÑтор адреÑов</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
- <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">КоличеÑтво адреÑов, полученных от Ñтого узла, которые были обработаны (за иÑключением адреÑов, отброшенных из-за ограничений по чаÑтоте).</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
- <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">КоличеÑтво адреÑов, полученных от Ñтого узла, которые были отброшены (не обработаны) из-за ограничений по чаÑтоте.</translation>
- </message>
- <message>
- <source>Addresses Processed</source>
- <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">Обработанные адреÑа</translation>
- </message>
- <message>
- <source>Addresses Rate-Limited</source>
- <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Отброшенные адреÑа</translation>
- </message>
- <message>
- <source>User Agent</source>
- <translation type="unfinished">ПользовательÑкий агент</translation>
- </message>
- <message>
<source>Node window</source>
<translation type="unfinished">Окно узла</translation>
</message>
<message>
- <source>Current block height</source>
- <translation type="unfinished">Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²Ñ‹Ñота блока</translation>
- </message>
- <message>
- <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation type="unfinished">Открыть файл журнала отладки %1 из текущего каталога данных. Ð”Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… файлов журнала Ñто может занÑÑ‚ÑŒ неÑколько Ñекунд.</translation>
- </message>
- <message>
- <source>Decrease font size</source>
- <translation type="unfinished">Уменьшить размер шрифта</translation>
- </message>
- <message>
- <source>Increase font size</source>
- <translation type="unfinished">Увеличить размер шрифта</translation>
- </message>
- <message>
- <source>Permissions</source>
- <translation type="unfinished">РазрешениÑ</translation>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Окно ноды - [%1]</translation>
</message>
- <message>
- <source>The direction and type of peer connection: %1</source>
- <translation type="unfinished">Ðаправление и тип Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð°: %1</translation>
- </message>
- <message>
- <source>Direction/Type</source>
- <translation type="unfinished">Ðаправление/тип</translation>
- </message>
- <message>
- <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">Сетевой протокол, через который подключён Ñтот узел: IPv4, IPv6, Onion, I2P или CJDNS.</translation>
- </message>
- <message>
- <source>Services</source>
- <translation type="unfinished">Службы</translation>
- </message>
- <message>
- <source>High Bandwidth</source>
- <translation type="unfinished">Ð¨Ð¸Ñ€Ð¾ÐºÐ°Ñ Ð¿Ð¾Ð»Ð¾Ñа</translation>
- </message>
- <message>
- <source>Connection Time</source>
- <translation type="unfinished">Ð’Ñ€ÐµÐ¼Ñ ÑоединениÑ</translation>
- </message>
- <message>
- <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
- <translation type="unfinished">Ð’Ñ€ÐµÐ¼Ñ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ блока, прошедшего базовую проверку, от Ñтого узла.</translation>
- </message>
- <message>
- <source>Last Block</source>
- <translation type="unfinished">ПоÑледний блок</translation>
- </message>
- <message>
- <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
- <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">Ð’Ñ€ÐµÐ¼Ñ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° принÑÑ‚Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ транзакции в наш mempool от Ñтого узла.</translation>
- </message>
- <message>
- <source>Last Send</source>
- <translation type="unfinished">ПоÑледнее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸</translation>
- </message>
- <message>
- <source>Last Receive</source>
- <translation type="unfinished">ПоÑледнее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ</translation>
- </message>
- <message>
- <source>Ping Time</source>
- <translation type="unfinished">Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ°</translation>
- </message>
- <message>
- <source>The duration of a currently outstanding ping.</source>
- <translation type="unfinished">Задержка между запроÑом к узлу и ответом от него.</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">Ожидание отклика</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">Минимальное Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ°</translation>
- </message>
- <message>
- <source>Time Offset</source>
- <translation type="unfinished">Временной Ñдвиг</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего блока</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished">&amp;Открыть</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">&amp;КонÑоль</translation>
- </message>
- <message>
- <source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;Сетевой трафик</translation>
- </message>
- <message>
- <source>Totals</source>
- <translation type="unfinished">Ð’Ñего</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">Файл журнала отладки</translation>
- </message>
- <message>
- <source>Clear console</source>
- <translation type="unfinished">ОчиÑтить конÑоль</translation>
- </message>
- <message>
- <source>In:</source>
- <translation type="unfinished">Вход:</translation>
- </message>
- <message>
- <source>Out:</source>
- <translation type="unfinished">Выход:</translation>
- </message>
- <message>
- <source>Inbound: initiated by peer</source>
- <extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">ВходÑщее: инициировано узлом</translation>
- </message>
- <message>
- <source>Outbound Full Relay: default</source>
- <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">ИÑходÑщий полный ретранÑлÑтор: по умолчанию</translation>
- </message>
- <message>
- <source>Outbound Block Relay: does not relay transactions or addresses</source>
- <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">ИÑходÑщий ретранÑлÑтор блоков: не ретранÑлирует транзакции или адреÑа</translation>
- </message>
- <message>
- <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
- <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">ИÑходÑщий ручной: добавлен через RPC %1 или опции конфигурации %2/%3</translation>
- </message>
- <message>
- <source>Outbound Feeler: short-lived, for testing addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">ИÑходÑщий пробный: короткое Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸, Ð´Ð»Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑов</translation>
- </message>
- <message>
- <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">ИÑходÑщий Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑов: короткое Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸, Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа адреÑов</translation>
- </message>
- <message>
- <source>detecting: peer could be v1 or v2</source>
- <extracomment>Explanatory text for "detecting" transport type.</extracomment>
- <translation type="unfinished">обнаружение: пир может быть v1 или v2</translation>
- </message>
- <message>
- <source>v1: unencrypted, plaintext transport protocol</source>
- <extracomment>Explanatory text for v1 transport type.</extracomment>
- <translation type="unfinished">v1: незашифрованный транÑпортный протокол Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ текÑтом</translation>
- </message>
- <message>
- <source>v2: BIP324 encrypted transport protocol</source>
- <extracomment>Explanatory text for v2 transport type.</extracomment>
- <translation type="unfinished">v2: Зашифрованный транÑпортный протокол BIP324</translation>
- </message>
- <message>
- <source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">мы выбрали Ñтот узел Ð´Ð»Ñ ÑˆÐ¸Ñ€Ð¾ÐºÐ¾Ð¿Ð¾Ð»Ð¾Ñной передачи</translation>
- </message>
- <message>
- <source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">Ñтот узел выбрал Ð½Ð°Ñ Ð´Ð»Ñ ÑˆÐ¸Ñ€Ð¾ÐºÐ¾Ð¿Ð¾Ð»Ð¾Ñной передачи</translation>
- </message>
- <message>
- <source>no high bandwidth relay selected</source>
- <translation type="unfinished">широкополоÑный передатчик не выбран</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <extracomment>Context menu action to copy the address of a peer.</extracomment>
- <translation type="unfinished">&amp;Копировать адреÑ</translation>
- </message>
- <message>
- <source>&amp;Disconnect</source>
- <translation type="unfinished">О&amp;тключитьÑÑ</translation>
- </message>
- <message>
- <source>1 &amp;hour</source>
- <translation type="unfinished">1 &amp;чаÑ</translation>
- </message>
- <message>
- <source>1 d&amp;ay</source>
- <translation type="unfinished">1 &amp;день</translation>
- </message>
- <message>
- <source>1 &amp;week</source>
- <translation type="unfinished">1 &amp;неделÑ</translation>
- </message>
- <message>
- <source>1 &amp;year</source>
- <translation type="unfinished">1 &amp;год</translation>
- </message>
- <message>
- <source>&amp;Copy IP/Netmask</source>
- <extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
- <translation type="unfinished">&amp;Копировать IP или маÑку подÑети</translation>
- </message>
- <message>
- <source>&amp;Unban</source>
- <translation type="unfinished">&amp;Разбанить</translation>
- </message>
- <message>
- <source>Network activity disabled</source>
- <translation type="unfinished">Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚ÑŒ отключена</translation>
- </message>
- <message>
- <source>Executing command without any wallet</source>
- <translation type="unfinished">Выполнение команды без кошелька</translation>
- </message>
- <message>
- <source>Executing command using "%1" wallet</source>
- <translation type="unfinished">Выполнение команды Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кошелька "%1"</translation>
- </message>
- <message>
- <source>Welcome to the %1 RPC console.
-Use up and down arrows to navigate history, and %2 to clear screen.
-Use %3 and %4 to increase or decrease the font size.
-Type %5 for an overview of available commands.
-For more information on using this console, type %6.
-
-%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
- <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">Добро пожаловать в RPC-конÑоль %1.
-ИÑпользуйте Ñтрелки вверх и вниз, чтобы перемещатьÑÑ Ð¿Ð¾ иÑтории и %2, чтобы очиÑтить Ñкран.
-Чтобы увеличить или уменьшить размер шрифта, нажмите %3 или %4.
-Ðаберите %5, чтобы получить ÑпиÑок доÑтупных команд.
-Чтобы получить больше информации об Ñтой конÑоли, наберите %6.
-
-%7Ð’ÐИМÐÐИЕ: Мошенники очень чаÑто проÑÑÑ‚ пользователей вводить здеÑÑŒ различные команды и таким образом крадут Ñодержимое кошельков. Ðе иÑпользуйте Ñту конÑоль, еÑли не полноÑтью понимаете поÑледÑÑ‚Ð²Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ команды.%8</translation>
- </message>
- <message>
- <source>Executing…</source>
- <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
- <translation type="unfinished">ВыполнÑетÑÑ…</translation>
- </message>
- <message>
- <source>(peer: %1)</source>
- <translation type="unfinished">(узел: %1)</translation>
- </message>
- <message>
- <source>via %1</source>
- <translation type="unfinished">через %1</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation type="unfinished">Да</translation>
- </message>
- <message>
- <source>No</source>
- <translation type="unfinished">Ðет</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">Кому</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">От кого</translation>
- </message>
- <message>
- <source>Ban for</source>
- <translation type="unfinished">Заблокировать на</translation>
- </message>
- <message>
- <source>Never</source>
- <translation type="unfinished">Ðикогда</translation>
- </message>
- <message>
- <source>Unknown</source>
- <translation type="unfinished">ÐеизвеÑтно</translation>
- </message>
-</context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>&amp;Amount:</source>
- <translation type="unfinished">&amp;Сумма:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Метка:</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">&amp;Сообщение:</translation>
- </message>
- <message>
- <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">ÐеобÑзательное Ñообщение Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа платежа, которое будет показано при открытии запроÑа. Внимание: Ñто Ñообщение не будет отправлено вмеÑте Ñ Ð¿Ð»Ð°Ñ‚ÐµÐ¶Ð¾Ð¼ через Ñеть Bitcoin.</translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address.</source>
- <translation type="unfinished">ÐеобÑÐ·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ адреÑа получениÑ.</translation>
- </message>
- <message>
- <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">ИÑпользуйте Ñту форму, чтобы запроÑить платёж. Ð’Ñе Ð¿Ð¾Ð»Ñ &lt;b&gt;необÑзательны&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
- <translation type="unfinished">Можно указать Ñумму, которую вы хотите запроÑить. ОÑтавьте поле пуÑтым или введите ноль, еÑли не хотите запрашивать конкретную Ñумму.</translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">Можно указать метку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ приÑвоена новому адреÑу Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ (чтобы вы могли идентифицировать выÑтавленный Ñчёт). Она приÑоединÑетÑÑ Ðº запроÑу платежа.</translation>
- </message>
- <message>
- <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
- <translation type="unfinished">Можно ввеÑти Ñообщение, которое приÑоединÑетÑÑ Ðº запроÑу платежа и может быть показано отправителю.</translation>
- </message>
- <message>
- <source>&amp;Create new receiving address</source>
- <translation type="unfinished">&amp;Создать новый Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">ОчиÑтить вÑе Ð¿Ð¾Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹.</translation>
- </message>
- <message>
- <source>Clear</source>
- <translation type="unfinished">ОчиÑтить</translation>
- </message>
- <message>
- <source>Requested payments history</source>
- <translation type="unfinished">ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов платежей</translation>
- </message>
- <message>
- <source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Показать выбранный Ð·Ð°Ð¿Ñ€Ð¾Ñ (двойное нажатие на запиÑи Ñделает то же Ñамое)</translation>
- </message>
- <message>
- <source>Show</source>
- <translation type="unfinished">Показать</translation>
- </message>
- <message>
- <source>Remove the selected entries from the list</source>
- <translation type="unfinished">Удалить выбранные запиÑи из ÑпиÑка</translation>
- </message>
- <message>
- <source>Remove</source>
- <translation type="unfinished">Удалить</translation>
- </message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">Копировать &amp;URI</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">&amp;Копировать адреÑ</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">Копировать &amp;метку</translation>
- </message>
- <message>
- <source>Copy &amp;message</source>
- <translation type="unfinished">Копировать &amp;Ñообщение</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Копировать Ñ&amp;умму</translation>
- </message>
- <message>
- <source>Base58 (Legacy)</source>
- <translation type="unfinished">Base58 (УÑтаревший)</translation>
- </message>
- <message>
- <source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">Ðе рекомендуетÑÑ Ð¸Ð·-за выÑоких комиÑÑий и меньшей уÑтойчивоÑти к опечаткам.</translation>
- </message>
- <message>
- <source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">Создать адреÑ, ÑовмеÑтимый Ñо Ñтарыми кошельками.</translation>
- </message>
- <message>
- <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">Создать segwit Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾ BIP-173, Ðекоторые Ñтарые кошельки не поддерживают такие адреÑа.</translation>
- </message>
- <message>
- <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) — Ñто более Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Bech32, поддержка таких кошельков по-прежнему ограничена.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Ðевозможно разблокировать кошелёк.</translation>
- </message>
- <message>
- <source>Could not generate new %1 address</source>
- <translation type="unfinished">Ðе удалоÑÑŒ Ñгенерировать новый %1 адреÑ</translation>
- </message>
-</context>
+ </context>
<context>
<name>ReceiveRequestDialog</name>
<message>
- <source>Request payment to …</source>
- <translation type="unfinished">ЗапроÑить платёж на …</translation>
- </message>
- <message>
- <source>Address:</source>
- <translation type="unfinished">ÐдреÑ:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Сумма:</translation>
- </message>
- <message>
- <source>Label:</source>
- <translation type="unfinished">Метка:</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Сообщение:</translation>
- </message>
- <message>
<source>Wallet:</source>
<translation type="unfinished">Кошелёк:</translation>
</message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">Копировать &amp;URI</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">Копировать &amp;адреÑ</translation>
- </message>
- <message>
- <source>&amp;Verify</source>
- <translation type="unfinished">&amp;Проверить</translation>
- </message>
- <message>
- <source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">Проверьте Ð°Ð´Ñ€ÐµÑ Ð½Ð°, к примеру, Ñкране аппаратного кошелька</translation>
- </message>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;Сохранить изображение…</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation type="unfinished">Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платеже</translation>
- </message>
- <message>
- <source>Request payment to %1</source>
- <translation type="unfinished">ЗапроÑить платёж на %1</translation>
- </message>
-</context>
+ </context>
<context>
<name>RecentRequestsTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Метка</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Сообщение</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(нет метки)</translation>
</message>
- <message>
- <source>(no message)</source>
- <translation type="unfinished">(нет ÑообщениÑ)</translation>
- </message>
- <message>
- <source>(no amount requested)</source>
- <translation type="unfinished">(Ñумма не указана)</translation>
- </message>
- <message>
- <source>Requested</source>
- <translation type="unfinished">Запрошено</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsDialog</name>
<message>
- <source>Send Coins</source>
- <translation type="unfinished">Отправить монеты</translation>
- </message>
- <message>
- <source>Coin Control Features</source>
- <translation type="unfinished">Функции ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð½ÐµÑ‚Ð°Ð¼Ð¸</translation>
- </message>
- <message>
- <source>automatically selected</source>
- <translation type="unfinished">выбираютÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки</translation>
- </message>
- <message>
- <source>Insufficient funds!</source>
- <translation type="unfinished">ÐедоÑтаточно ÑредÑтв!</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">КоличеÑтво:</translation>
- </message>
- <message>
- <source>Bytes:</source>
- <translation type="unfinished">Байтов:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Сумма:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">КомиÑÑиÑ:</translation>
- </message>
- <message>
- <source>After Fee:</source>
- <translation type="unfinished">ПоÑле комиÑÑии:</translation>
- </message>
- <message>
- <source>Change:</source>
- <translation type="unfinished">Сдача:</translation>
- </message>
- <message>
- <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
- <translation type="unfinished">ЕÑли Ñто выбрано, но Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ñдачи пуÑтой или неверный, Ñдача будет отправлена на новый Ñгенерированный адреÑ.</translation>
- </message>
- <message>
- <source>Custom change address</source>
- <translation type="unfinished">Указать Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ñдачи</translation>
- </message>
- <message>
- <source>Transaction Fee:</source>
- <translation type="unfinished">КомиÑÑÐ¸Ñ Ð·Ð° транзакцию:</translation>
- </message>
- <message>
- <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">ИÑпользование комиÑÑии по умолчанию может привеÑти к отправке транзакции, Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ потребуетÑÑ Ð½ÐµÑколько чаÑов или дней (или ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не подтвердитÑÑ). РекомендуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ комиÑÑию вручную или подождать, пока не закончитÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° вÑей цепочки блоков.</translation>
- </message>
- <message>
- <source>Warning: Fee estimation is currently not possible.</source>
- <translation type="unfinished">Предупреждение: раÑчёт комиÑÑии в данный момент невозможен.</translation>
- </message>
- <message>
- <source>per kilobyte</source>
- <translation type="unfinished">за килобайт</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">Скрыть</translation>
- </message>
- <message>
- <source>Recommended:</source>
- <translation type="unfinished">Рекомендованное значение:</translation>
- </message>
- <message>
- <source>Custom:</source>
- <translation type="unfinished">ПользовательÑкое значение:</translation>
- </message>
- <message>
- <source>Send to multiple recipients at once</source>
- <translation type="unfinished">Отправить неÑкольким получателÑм Ñразу</translation>
- </message>
- <message>
- <source>Add &amp;Recipient</source>
- <translation type="unfinished">Добавить &amp;получателÑ</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">ОчиÑтить вÑе Ð¿Ð¾Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹.</translation>
- </message>
- <message>
- <source>Inputs…</source>
- <translation type="unfinished">Входы…</translation>
- </message>
- <message>
- <source>Choose…</source>
- <translation type="unfinished">Выбрать…</translation>
- </message>
- <message>
- <source>Hide transaction fee settings</source>
- <translation type="unfinished">Скрыть наÑтройки комиÑÑий</translation>
- </message>
- <message>
- <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
-
-Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">Укажите пользовательÑкую комиÑÑию за КБ (1000 байт) виртуального размера транзакции.
-
-Примечание: комиÑÑÐ¸Ñ Ñ€Ð°ÑÑчитываетÑÑ Ð¿Ñ€Ð¾Ð¿Ð¾Ñ€Ñ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾ размеру в байтах. Так при комиÑÑии "100 Ñатоши за kvB (виртуальный КБ)" Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ размером 500 виртуальных байт (половина 1 kvB) комиÑÑÐ¸Ñ Ð±ÑƒÐ´ÐµÑ‚ вÑего 50 Ñатоши.</translation>
- </message>
- <message>
- <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation type="unfinished">Когда объём транзакций меньше, чем проÑтранÑтво в блоках, майнеры и ретранÑлирующие узлы могут уÑтанавливать минимальную комиÑÑию. Платить только Ñту минимальную комиÑÑию вполне допуÑтимо, но примите во внимание, что ваша Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ никогда не подтвердитьÑÑ, еÑли транзакций окажетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ, чем может обработать Ñеть.</translation>
- </message>
- <message>
- <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">Слишком Ð½Ð¸Ð·ÐºÐ°Ñ ÐºÐ¾Ð¼Ð¸ÑÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ привеÑти к невозможноÑти Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ (Ñм. подÑказку)</translation>
- </message>
- <message>
- <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">(Ð£Ð¼Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¸ÑÑÐ¸Ñ Ð¿Ð¾ÐºÐ° не инициализирована. Обычно Ð´Ð»Ñ Ñтого требуетÑÑ Ð½ÐµÑколько блоков…)</translation>
- </message>
- <message>
- <source>Confirmation time target:</source>
- <translation type="unfinished">Целевое Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ:</translation>
- </message>
- <message>
- <source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Включить Replace-By-Fee</translation>
- </message>
- <message>
- <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">С помощью Replace-By-Fee (BIP-125) вы можете увеличить комиÑÑию поÑле отправки транзакции. ЕÑли вы выключите Ñту опцию, рекомендуетÑÑ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ñ‚ÑŒ комиÑÑию перед отправкой, чтобы Ñнизить риÑк задержки транзакции.</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">ОчиÑтить &amp;вÑÑ‘</translation>
- </message>
- <message>
- <source>Balance:</source>
- <translation type="unfinished">БаланÑ:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation type="unfinished">Подтвердить отправку</translation>
- </message>
- <message>
- <source>S&amp;end</source>
- <translation type="unfinished">&amp;Отправить</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">Копировать количеÑтво</translation>
</message>
@@ -3114,833 +1934,70 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Копировать Ñумму</translation>
</message>
<message>
- <source>Copy fee</source>
- <translation type="unfinished">Копировать комиÑÑию</translation>
- </message>
- <message>
<source>Copy after fee</source>
<translation type="unfinished">Копировать Ñумму поÑле комиÑÑии</translation>
</message>
<message>
- <source>Copy bytes</source>
- <translation type="unfinished">Копировать байты</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копировать Ñдачу</translation>
</message>
<message>
- <source>%1 (%2 blocks)</source>
- <translation type="unfinished">%1 (%2 блоков)</translation>
- </message>
- <message>
- <source>Sign on device</source>
- <extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">Подтвердите на уÑтройÑтве</translation>
- </message>
- <message>
- <source>Connect your hardware wallet first.</source>
- <translation type="unfinished">Сначала подключите ваш аппаратный кошелёк.</translation>
- </message>
- <message>
- <source>Set external signer script path in Options -&gt; Wallet</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Укажите внешний Ñкрипт подпиÑи в ÐаÑтройки -&gt; Кошелёк</translation>
- </message>
- <message>
- <source>Cr&amp;eate Unsigned</source>
- <translation type="unfinished">Создать &amp;без подпиÑи</translation>
- </message>
- <message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">Создает чаÑтично подпиÑанную биткоин-транзакцию (PSBT), чтобы иÑпользовать её, например, Ñ Ð¾Ñ„Ð»Ð°Ð¹Ð½Ð¾Ð²Ñ‹Ð¼ кошельком %1, или PSBT-ÑовмеÑтимым аппаратным кошельком.</translation>
- </message>
- <message>
- <source>%1 to '%2'</source>
- <translation type="unfinished">%1 на "%2"</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation type="unfinished">%1 на %2</translation>
- </message>
- <message>
- <source>To review recipient list click "Show Details…"</source>
- <translation type="unfinished">Чтобы проÑмотреть ÑпиÑок получателей, нажмите "Показать подробноÑти…"</translation>
- </message>
- <message>
- <source>Sign failed</source>
- <translation type="unfinished">Ðе удалоÑÑŒ подпиÑать</translation>
- </message>
- <message>
- <source>External signer not found</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Внешний Ñкрипт подпиÑи не найден</translation>
- </message>
- <message>
- <source>External signer failure</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Внешний Ñкрипта подпиÑи вернул ошибку</translation>
- </message>
- <message>
- <source>Save Transaction Data</source>
- <translation type="unfinished">Сохранить данные о транзакции</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (Binary)</source>
- <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">ЧаÑтично подпиÑÐ°Ð½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ (двоичный файл)</translation>
- </message>
- <message>
- <source>PSBT saved</source>
- <extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">PSBT Ñохранена</translation>
- </message>
- <message>
- <source>External balance:</source>
- <translation type="unfinished">Внешний баланÑ:</translation>
- </message>
- <message>
- <source>or</source>
- <translation type="unfinished">или</translation>
- </message>
- <message>
- <source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">Ð’Ñ‹ можете увеличить комиÑÑию позже (иÑпользуетÑÑ Replace-By-Fee, BIP-125).</translation>
- </message>
- <message>
- <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
- <translation type="unfinished">ПожалуйÑта, проверьте черновик вашей транзакции. Будет Ñоздана чаÑтично подпиÑÐ°Ð½Ð½Ð°Ñ Ð±Ð¸Ñ‚ÐºÐ¾Ð¸Ð½-Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ (PSBT), которую можно Ñохранить или Ñкопировать, поÑле чего подпиÑать, например, офлайновым кошельком %1 или PSBT-ÑовмеÑтимым аппаратным кошельком.</translation>
- </message>
- <message>
- <source>Do you want to create this transaction?</source>
- <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
- <translation type="unfinished">Ð’Ñ‹ хотите Ñоздать Ñту транзакцию?</translation>
- </message>
- <message>
- <source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">ПожалуйÑта, проверьте вашу транзакцию. Ð’Ñ‹ можете Ñоздать и отправить Ñту транзакцию, либо Ñоздать чаÑтично подпиÑанную биткоин-транзакцию (PSBT), которую можно Ñохранить или Ñкопировать, поÑле чего подпиÑать, например, офлайновым кошельком %1 или PSBT-ÑовмеÑтимым аппаратным кошельком.</translation>
- </message>
- <message>
- <source>Please, review your transaction.</source>
- <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">ПожалуйÑта, проверьте вашу транзакцию.</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">КомиÑÑÐ¸Ñ Ð·Ð° транзакцию</translation>
- </message>
- <message>
- <source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">Ðе иÑпользуетÑÑ Replace-By-Fee, BIP-125.</translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">Ð˜Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñумма</translation>
- </message>
- <message>
- <source>Unsigned Transaction</source>
- <comment>PSBT copied</comment>
- <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">ÐеподпиÑÐ°Ð½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ</translation>
- </message>
- <message>
- <source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">PSBT Ñкопирована в буфер обмена. Ð’Ñ‹ можете её Ñохранить.</translation>
- </message>
- <message>
- <source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT Ñохранена на диÑк</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation type="unfinished">Подтвердить отправку монет</translation>
- </message>
- <message>
- <source>Watch-only balance:</source>
- <translation type="unfinished">Ð‘Ð°Ð»Ð°Ð½Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра:</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">ÐÐ´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹. ПожалуйÑта, перепроверьте.</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">Сумма оплаты должна быть больше 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation type="unfinished">Сумма превышает ваш баланÑ.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">Ð˜Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñумма Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ комиÑÑии %1 превышает ваш баланÑ.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">Обнаружен дублирующийÑÑ Ð°Ð´Ñ€ÐµÑ: иÑпользуйте каждый Ð°Ð´Ñ€ÐµÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ один раз.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation type="unfinished">Ðе удалоÑÑŒ Ñоздать транзакцию!</translation>
- </message>
- <message>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">КомиÑÑÐ¸Ñ Ð±Ð¾Ð»ÐµÐµ %1 ÑчитаетÑÑ Ð°Ð±Ñурдно выÑокой.</translation>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1из кошелька '%2'</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Подтверждение ожидаетÑÑ Ñ‡ÐµÑ€ÐµÐ· %n блок.</numerusform>
- <numerusform>Подтверждение ожидаетÑÑ Ñ‡ÐµÑ€ÐµÐ· %n блока.</numerusform>
- <numerusform>Подтверждение ожидаетÑÑ Ñ‡ÐµÑ€ÐµÐ· %n блоков.</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
<message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">Внимание: неверный биткоин-адреÑ</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation type="unfinished">Внимание: неизвеÑтный Ð°Ð´Ñ€ÐµÑ Ñдачи</translation>
- </message>
- <message>
- <source>Confirm custom change address</source>
- <translation type="unfinished">Подтвердите указанный Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ñдачи</translation>
- </message>
- <message>
- <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
- <translation type="unfinished">Выбранный вами Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ñдачи не принадлежит Ñтому кошельку. ЧаÑÑ‚ÑŒ ÑредÑтв, а то и вÑÑ‘ Ñодержимое вашего кошелька будет отправлено на Ñтот адреÑ. Ð’Ñ‹ уверены в Ñвоих дейÑтвиÑÑ…?</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(нет метки)</translation>
</message>
</context>
<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>A&amp;mount:</source>
- <translation type="unfinished">&amp;Сумма:</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">&amp;Отправить на:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Метка:</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">Выбрать ранее иÑпользованный адреÑ</translation>
- </message>
- <message>
- <source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">Биткоин-адреÑ, на который нужно отправить платёж</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Ð’Ñтавить Ð°Ð´Ñ€ÐµÑ Ð¸Ð· буфера обмена</translation>
- </message>
- <message>
- <source>Remove this entry</source>
- <translation type="unfinished">Удалить Ñту запиÑÑŒ</translation>
- </message>
- <message>
- <source>The amount to send in the selected unit</source>
- <translation type="unfinished">Сумма к отправке в выбранных единицах</translation>
- </message>
- <message>
- <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
- <translation type="unfinished">КомиÑÑÐ¸Ñ Ð±ÑƒÐ´ÐµÑ‚ вычтена из отправлÑемой Ñуммы. Получателю придёт меньше биткоинов, чем вы ввели в поле "Сумма". ЕÑли выбрано неÑколько получателей, комиÑÑÐ¸Ñ Ñ€Ð°ÑпределитÑÑ Ð¿Ð¾Ñ€Ð¾Ð²Ð½Ñƒ.</translation>
- </message>
- <message>
- <source>S&amp;ubtract fee from amount</source>
- <translation type="unfinished">Ð’&amp;ычеÑÑ‚ÑŒ комиÑÑию из Ñуммы</translation>
- </message>
- <message>
- <source>Use available balance</source>
- <translation type="unfinished">ВеÑÑŒ доÑтупный баланÑ</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Сообщение:</translation>
- </message>
- <message>
- <source>Enter a label for this address to add it to the list of used addresses</source>
- <translation type="unfinished">Введите метку Ð´Ð»Ñ Ñтого адреÑа, чтобы добавить его в ÑпиÑок иÑпользованных адреÑов</translation>
- </message>
- <message>
- <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Сообщение, которое было прикреплено к URI. Оно будет Ñохранено вмеÑте Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÐµÐ¹ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ удобÑтва. Обратите внимание: Ñто Ñообщение не будет отправлено в Ñеть Bitcoin.</translation>
- </message>
-</context>
-<context>
- <name>SendConfirmationDialog</name>
- <message>
- <source>Send</source>
- <translation type="unfinished">Отправить</translation>
- </message>
- <message>
- <source>Create Unsigned</source>
- <translation type="unfinished">Создать без подпиÑи</translation>
- </message>
-</context>
-<context>
<name>SignVerifyMessageDialog</name>
<message>
- <source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">ПодпиÑи - подпиÑать / проверить Ñообщение</translation>
- </message>
- <message>
- <source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;ПодпиÑать Ñообщение</translation>
- </message>
- <message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Ð’Ñ‹ можете подпиÑывать ÑообщениÑ/ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ñвоими адреÑами, чтобы доказать, что вы можете получать биткоины на них. Будьте оÑторожны и не подпиÑывайте непонÑтные или Ñлучайные ÑообщениÑ, так как мошенники могут таким образом пытатьÑÑ Ð¿Ñ€Ð¸Ñвоить вашу личноÑÑ‚ÑŒ. ПодпиÑывайте только такие ÑообщениÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы ÑоглаÑны вплоть до мелочей.</translation>
- </message>
- <message>
- <source>The Bitcoin address to sign the message with</source>
- <translation type="unfinished">Биткоин-адреÑ, которым подпиÑать Ñообщение</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">Выбрать ранее иÑпользованный адреÑ</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Ð’Ñтавить Ð°Ð´Ñ€ÐµÑ Ð¸Ð· буфера обмена</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Ð’Ñ‹ можете подпиÑывать ÑообщениÑ/ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ñвоими уÑтаревшими (P2PKH) адреÑами, чтобы доказать, что вы можете получать биткоины на них. Будьте оÑторожны и не подпиÑывайте непонÑтные или Ñлучайные ÑообщениÑ, так как мошенники могут таким образом пытатьÑÑ Ð¿Ñ€Ð¸Ñвоить вашу личноÑÑ‚ÑŒ. ПодпиÑывайте только такие ÑообщениÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы ÑоглаÑны вплоть до мелочей.</translation>
</message>
<message>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished">Введите здеÑÑŒ Ñообщение, которое вы хотите подпиÑать</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">Введенный Ð°Ð´Ñ€ÐµÑ Ð½Ðµ отноÑитÑÑ Ðº уÑтаревшему (P2PKH) ключу. ПодпиÑывание Ñообщений Ð´Ð»Ñ SegWit и других не--P2PKH типов адреÑов не поддерживаетÑÑ Ð² Ñтой верÑии %1. ПожалуйÑта, проверьте Ð°Ð´Ñ€ÐµÑ Ð¸ попробуйте ещё раз.</translation>
</message>
- <message>
- <source>Signature</source>
- <translation type="unfinished">ПодпиÑÑŒ</translation>
- </message>
- <message>
- <source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">Скопировать текущую подпиÑÑŒ в буфер обмена</translation>
- </message>
- <message>
- <source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">ПодпиÑать Ñообщение, чтобы доказать владение биткоин-адреÑом</translation>
- </message>
- <message>
- <source>Sign &amp;Message</source>
- <translation type="unfinished">ПодпиÑать &amp;Ñообщение</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">СброÑить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñех полей</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">ОчиÑтить &amp;вÑÑ‘</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">П&amp;роверить Ñообщение</translation>
- </message>
- <message>
- <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
- <translation type="unfinished">Введите ниже Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ, Ñообщение (убедитеÑÑŒ, что переводы Ñтрок, пробелы, знаки табулÑции и Ñ‚.п. Ñкопированы в точноÑти) и подпиÑÑŒ, чтобы проверить Ñообщение. Ðе придавайте Ñообщению большего ÑмыÑла, чем в нём ÑодержитÑÑ, чтобы не Ñтать жертвой атаки "человек поÑередине". Обратите внимание, что подпиÑÑŒ доказывает лишь то, что подпиÑавший может получать биткоины на Ñтот адреÑ, но никак не то, что он отправил какую-либо транзакцию!</translation>
- </message>
- <message>
- <source>The Bitcoin address the message was signed with</source>
- <translation type="unfinished">Биткоин-адреÑ, которым было подпиÑано Ñообщение</translation>
- </message>
- <message>
- <source>The signed message to verify</source>
- <translation type="unfinished">ПодпиÑанное Ñообщение Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸</translation>
- </message>
- <message>
- <source>The signature given when the message was signed</source>
- <translation type="unfinished">ПодпиÑÑŒ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¸ подпиÑании ÑообщениÑ</translation>
- </message>
- <message>
- <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Проверить Ñообщение, чтобы убедитьÑÑ, что оно дейÑтвительно подпиÑано указанным биткоин-адреÑом</translation>
- </message>
- <message>
- <source>Verify &amp;Message</source>
- <translation type="unfinished">Проверить &amp;Ñообщение</translation>
- </message>
- <message>
- <source>Reset all verify message fields</source>
- <translation type="unfinished">СброÑить вÑе Ð¿Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑообщениÑ</translation>
- </message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Ðажмите "ПодпиÑать Ñообщение" Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation type="unfinished">Введенный Ð°Ð´Ñ€ÐµÑ Ð½ÐµÐ´ÐµÐ¹Ñтвителен.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation type="unfinished">Проверьте Ð°Ð´Ñ€ÐµÑ Ð¸ попробуйте ещё раз.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Введённый Ð°Ð´Ñ€ÐµÑ Ð½Ðµ ÑвÑзан Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation type="unfinished">Разблокирование кошелька было отменено.</translation>
- </message>
- <message>
- <source>No error</source>
- <translation type="unfinished">Без ошибок</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation type="unfinished">Приватный ключ Ð´Ð»Ñ Ð²Ð²ÐµÐ´Ñ‘Ð½Ð½Ð¾Ð³Ð¾ адреÑа недоÑтупен.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation type="unfinished">Ðе удалоÑÑŒ подпиÑать Ñообщение.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation type="unfinished">Сообщение подпиÑано.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation type="unfinished">Ðевозможно декодировать подпиÑÑŒ.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">ПожалуйÑта, проверьте подпиÑÑŒ и попробуйте ещё раз.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation type="unfinished">ПодпиÑÑŒ не ÑоответÑтвует Ñ…Ñшу ÑообщениÑ.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation type="unfinished">Сообщение не прошло проверку.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">Сообщение проверено.</translation>
- </message>
-</context>
-<context>
- <name>SplashScreen</name>
- <message>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(нажмите q, чтобы завершить работу и продолжить позже)</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">нажмите q Ð´Ð»Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ</translation>
- </message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
- <message>
- <source>kB/s</source>
- <translation type="unfinished">кБ/Ñ</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionDesc</name>
- <message>
- <source>conflicted with a transaction with %1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
- <translation type="unfinished">конфликтует Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÐµÐ¹ Ñ %1 подтверждениÑми</translation>
- </message>
- <message>
- <source>0/unconfirmed, in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/нет подтверждений, в пуле памÑти</translation>
- </message>
- <message>
- <source>0/unconfirmed, not in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/нет подтверждений, не в пуле памÑти</translation>
- </message>
- <message>
- <source>abandoned</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
- <translation type="unfinished">отброшена</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
- <translation type="unfinished">%1/нет подтверждений</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
- <translation type="unfinished">%1 подтверждений</translation>
- </message>
- <message>
- <source>Status</source>
- <translation type="unfinished">СтатуÑ</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
- <source>Source</source>
- <translation type="unfinished">ИÑточник</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation type="unfinished">Сгенерировано</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">От кого</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">неизвеÑтно</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">Кому</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">Ñвой адреÑ</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">наблюдаемый</translation>
- </message>
- <message>
- <source>label</source>
- <translation type="unfinished">метка</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation type="unfinished">Кредит</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>Ñозреет через %n блок</numerusform>
- <numerusform>Ñозреет через %n блока</numerusform>
- <numerusform>Ñозреет через %n блоков</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<message>
- <source>not accepted</source>
- <translation type="unfinished">не принÑÑ‚</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation type="unfinished">Дебет</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation type="unfinished">Итого дебет</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation type="unfinished">Итого кредит</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">КомиÑÑÐ¸Ñ Ð·Ð° транзакцию</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation type="unfinished">ЧиÑÑ‚Ð°Ñ Ñумма</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Сообщение</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">Комментарий</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation type="unfinished">Идентификатор транзакции</translation>
- </message>
- <message>
- <source>Transaction total size</source>
- <translation type="unfinished">Общий размер транзакции</translation>
- </message>
- <message>
- <source>Transaction virtual size</source>
- <translation type="unfinished">Виртуальный размер транзакции</translation>
- </message>
- <message>
- <source>Output index</source>
- <translation type="unfinished">Ð˜Ð½Ð´ÐµÐºÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð°</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation type="unfinished">Продавец</translation>
- </message>
- <message>
- <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation type="unfinished">Сгенерированные монеты должны Ñозреть в течение %1 блоков, прежде чем Ñмогут быть потрачены. Когда вы Ñгенерировали Ñтот блок, он был отправлен в Ñеть Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² цепочку блоков. ЕÑли он не попадёт в цепочку, его ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑÑ Ð½Ð° "не принÑÑ‚", и монеты будут недейÑтвительны. Это иногда проиÑходит в Ñлучае, еÑли другой узел Ñгенерирует блок на неÑколько Ñекунд раньше ваÑ.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation type="unfinished">ÐžÑ‚Ð»Ð°Ð´Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation type="unfinished">ТранзакциÑ</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation type="unfinished">Входы</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Сертификат не был подтверждён)</translation>
</message>
<message>
<source>Amount</source>
<translation type="unfinished">Сумма</translation>
</message>
- <message>
- <source>true</source>
- <translation type="unfinished">иÑтина</translation>
- </message>
- <message>
- <source>false</source>
- <translation type="unfinished">ложь</translation>
- </message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
- <message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Ðа Ñтой панели показано подробное опиÑание транзакции</translation>
- </message>
- <message>
- <source>Details for %1</source>
- <translation type="unfinished">ПодробноÑти по %1</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation type="unfinished">Тип</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Метка</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation type="unfinished">Ðе подтверждена</translation>
- </message>
- <message>
- <source>Abandoned</source>
- <translation type="unfinished">Отброшена</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation type="unfinished">ПодтверждаетÑÑ (%1 из %2 рекомендуемых подтверждений)</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">Подтверждена (%1 подтверждений)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation type="unfinished">Конфликтует</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">ÐÐµÐ·Ñ€ÐµÐ»Ð°Ñ (%1 подтверждений, будет доÑтупно поÑле %2)</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation type="unfinished">Сгенерирован, но не принÑÑ‚</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Получено на</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation type="unfinished">Получено от</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Отправлено на</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Добыто</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">наблюдаемый</translation>
- </message>
- <message>
- <source>(n/a)</source>
- <translation type="unfinished">(н/д)</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(нет метки)</translation>
</message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸. Ðаведите курÑор на Ñто поле Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва подтверждений.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation type="unfinished">Дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation type="unfinished">Тип транзакции.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">ИÑпользовалÑÑ Ð»Ð¸ в транзакции наблюдаемый адреÑ.</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation type="unfinished">ОпределÑемое пользователем назначение/цель транзакции.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Сумма, Ð²Ñ‹Ñ‡Ñ‚ÐµÐ½Ð½Ð°Ñ Ð¸Ð· баланÑа или Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ðº нему.</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionView</name>
<message>
- <source>All</source>
- <translation type="unfinished">Ð’Ñе</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">СегоднÑ</translation>
- </message>
- <message>
- <source>This week</source>
- <translation type="unfinished">Ðа Ñтой неделе</translation>
- </message>
- <message>
- <source>This month</source>
- <translation type="unfinished">Ð’ Ñтом меÑÑце</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation type="unfinished">Ð’ прошлом меÑÑце</translation>
- </message>
- <message>
- <source>This year</source>
- <translation type="unfinished">Ð’ Ñтом году</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Получено на</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Отправлено на</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Добыто</translation>
- </message>
- <message>
- <source>Other</source>
- <translation type="unfinished">Другое</translation>
- </message>
- <message>
- <source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">Введите адреÑ, идентификатор транзакции, или метку Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation type="unfinished">ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма</translation>
- </message>
- <message>
- <source>Range…</source>
- <translation type="unfinished">Диапазон…</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">&amp;Копировать адреÑ</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">Копировать &amp;метку</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Копировать Ñ&amp;умму</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Копировать ID &amp;транзакции</translation>
- </message>
- <message>
- <source>Copy &amp;raw transaction</source>
- <translation type="unfinished">Копировать &amp;иÑходный код транзакции</translation>
- </message>
- <message>
- <source>Copy full transaction &amp;details</source>
- <translation type="unfinished">Копировать &amp;вÑе подробноÑти транзакции</translation>
- </message>
- <message>
- <source>&amp;Show transaction details</source>
- <translation type="unfinished">&amp;Показать подробноÑти транзакции</translation>
- </message>
- <message>
- <source>Increase transaction &amp;fee</source>
- <translation type="unfinished">Увеличить комиÑÑию</translation>
- </message>
- <message>
- <source>A&amp;bandon transaction</source>
- <translation type="unfinished">&amp;Отказ от транзакции</translation>
- </message>
- <message>
- <source>&amp;Edit address label</source>
- <translation type="unfinished">&amp;Изменить метку адреÑа</translation>
- </message>
- <message>
- <source>Show in %1</source>
- <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
- <translation type="unfinished">Показать в %1</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation type="unfinished">ЭкÑпортировать иÑторию транзакций</translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Файл, разделенный запÑтыми</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">Подтверждена</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation type="unfinished">ÐаблюдаемаÑ</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">Тип</translation>
</message>
@@ -4068,9 +2125,8 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT Ñкопирована</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Скопировано в буфер обмена</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">PSBT Ñкопирована в буфер обмена.</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4081,12 +2137,12 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Ðе удалоÑÑŒ отправить транзакцию</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Ðе удалоÑÑŒ отобразить адреÑ</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Ошибка подпиÑи</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">кошелёк по умолчанию</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ отобразить адреÑ</translation>
</message>
</context>
<context>
@@ -4110,7 +2166,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Backup Failed</source>
- <translation type="unfinished">Резервное копирование не удалоÑÑŒ</translation>
+ <translation type="unfinished">Создание резервной копии кошелька завершилоÑÑŒ неудачей</translation>
</message>
<message>
<source>There was an error trying to save the wallet data to %1.</source>
@@ -4220,10 +2276,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Ðе указан формат файла кошелька. Чтобы иÑпользовать createfromdump, необходимо указать -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">ПожалуйÑта, убедитеÑÑŒ, что на вашем компьютере верно уÑтановлены дата и времÑ. ЕÑли ваши чаÑÑ‹ ÑбилиÑÑŒ, %s будет работать неправильно.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">ПожалуйÑта, внеÑите Ñвой вклад, еÑли вы Ñчитаете %s полезным. ПоÑетите %s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации о программном обеÑпечении.</translation>
</message>
@@ -4288,10 +2340,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Указан неизвеÑтный формат файла кошелька "%s". Укажите "bdb" либо "sqlite".</translation>
</message>
<message>
- <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
- <translation type="unfinished">Ðеподдерживаемый уровень региÑтрации по категориÑм %1$s=%2$s. ОжидаетÑÑ %1$s=&lt;category&gt;:&lt;loglevel&gt;. ДопуÑтимые категории: %3$s. ДопуÑтимые уровни региÑтрации: %4$s.</translation>
- </message>
- <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Обнаружен неподдерживаемый формат базы данных ÑоÑтоÑÐ½Ð¸Ñ Ñ†ÐµÐ¿Ð¾Ñ‡ÐºÐ¸ блоков. ПожалуйÑта, перезапуÑтите программу Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ -reindex-chainstate. Это переÑтроит базу данных ÑоÑтоÑÐ½Ð¸Ñ Ñ†ÐµÐ¿Ð¾Ñ‡ÐºÐ¸ блоков.</translation>
</message>
@@ -4301,7 +2349,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
- <translation type="unfinished">Кошелек уÑпешно загружен. УÑтаревший тип кошелька, поддержка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÑƒÑтаревших кошельков будет удалена в будущем. УÑтаревшие кошельки можно перенеÑти на деÑкрипторный кошелек Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ функции migratewallet.</translation>
+ <translation type="unfinished">Кошелёк уÑпешно Ñоздан. Старый формат кошелька признан уÑтаревшим. Поддержка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ° в Ñтом формате и его открытие в будущем будут удалены.</translation>
</message>
<message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
@@ -4332,10 +2380,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool должен быть минимум %d МБ</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Произошла критичеÑÐºÐ°Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°, подробноÑти в файле debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Ðе удаетÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ -%s адреÑ: "%s"</translation>
</message>
@@ -4349,7 +2393,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ запиÑÑŒ в каталог данных "%s"; проверьте разрешениÑ.</translation>
+ <translation type="unfinished">Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ запиÑÑŒ в каталог данных '%s'; проверьте разрешениÑ.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -4388,10 +2432,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Ðе удалоÑÑŒ переименовать файл peers.dat. ПожалуйÑта, перемеÑтите или удалите его и попробуйте Ñнова.</translation>
</message>
<message>
- <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">Оценка Ð²Ð¾Ð·Ð½Ð°Ð³Ñ€Ð°Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ удалаÑÑŒ. Fallbackfee отключен. Подождите неÑколько блоков или включите %s.</translation>
- </message>
- <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">ÐеÑовмеÑтимые ключи: был Ñвно указан -dnsseed=1, но -onlynet не разрешены ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· IPv4/IPv6</translation>
</message>
@@ -4570,10 +2610,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Ошибка: на диÑке недоÑтаточно меÑта Ð´Ð»Ñ %s</translation>
</message>
<message>
- <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">Ошибка: контрольные Ñуммы дамп-файла не Ñовпадают. ВычиÑлено %s, ожидалоÑÑŒ %s</translation>
- </message>
- <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">Ошибка: не удалоÑÑŒ Ñоздать кошелёк только на проÑмотр</translation>
</message>
@@ -4622,372 +2658,20 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Ошибка: не удалоÑÑŒ прочитать вÑе запиÑи из базе данных</translation>
</message>
<message>
- <source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Ошибка: не удалоÑÑŒ удалить данные из адреÑной книги только Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ</translation>
- </message>
- <message>
- <source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">Ошибка: невозможно произвеÑти запиÑÑŒ в новый кошелёк</translation>
- </message>
- <message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Ðе удалоÑÑŒ открыть никакой порт на проÑлушивание. ИÑпользуйте -listen=0, еÑли Ð²Ð°Ñ Ñто уÑтроит.</translation>
- </message>
- <message>
- <source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">Ðе удалоÑÑŒ переÑканировать кошелёк во Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸</translation>
- </message>
- <message>
- <source>Failed to start indexes, shutting down..</source>
- <translation type="unfinished">Ðе удалоÑÑŒ запуÑтить индекÑÑ‹, завершение работы...</translation>
- </message>
- <message>
- <source>Failed to verify database</source>
- <translation type="unfinished">Ðе удалоÑÑŒ проверить базу данных</translation>
- </message>
- <message>
- <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
- <translation type="unfinished">Уровень комиÑÑии (%s) меньше, чем значение наÑтройки минимального ÑƒÑ€Ð¾Ð²Ð½Ñ ÐºÐ¾Ð¼Ð¸ÑÑии (%s).</translation>
- </message>
- <message>
- <source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">ИгнорируютÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ñ‹Ðµ параметры -wallet %s.</translation>
- </message>
- <message>
- <source>Importing…</source>
- <translation type="unfinished">Импорт…</translation>
- </message>
- <message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">Ðеверный или отÑутÑтвующий начальный блок. Ðеверно указана Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… Ð´Ð»Ñ Ñтой Ñети?</translation>
- </message>
- <message>
- <source>Initialization sanity check failed. %s is shutting down.</source>
- <translation type="unfinished">ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° иÑправноÑти не удалаÑÑŒ. %s завершает работу.</translation>
- </message>
- <message>
- <source>Input not found or already spent</source>
- <translation type="unfinished">Вход Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð·Ð°ÐºÑ†Ð¸Ð¸ не найден или уже иÑпользован</translation>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ отключить блок</translation>
</message>
<message>
- <source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">ÐедоÑтаточное значение dbcache Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ блока</translation>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ прочитать блок</translation>
</message>
<message>
- <source>Insufficient funds</source>
- <translation type="unfinished">ÐедоÑтаточно ÑредÑтв</translation>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ запиÑать блок</translation>
</message>
<message>
- <source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ Ñ…Ð¾Ñта в -i2psam: "%s"</translation>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ Ñоздать кошелёк 1%s</translation>
</message>
- <message>
- <source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">Ðеверный -onion Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ Ñ…Ð¾Ñта: "%s"</translation>
- </message>
- <message>
- <source>Invalid -proxy address or hostname: '%s'</source>
- <translation type="unfinished">Ðеверный Ð°Ð´Ñ€ÐµÑ -proxy или Ð¸Ð¼Ñ Ñ…Ð¾Ñта: "%s"</translation>
- </message>
- <message>
- <source>Invalid P2P permission: '%s'</source>
- <translation type="unfinished">Ðеверные Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ P2P: "%s"</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Ðеверное количеÑтво Ð´Ð»Ñ %s=&lt;amount&gt;: '%s' (должно быть минимум %s)</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Ðеверное количеÑтво Ð´Ð»Ñ %s=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñумма Ð´Ð»Ñ -%s=&lt;amount&gt;: "%s"</translation>
- </message>
- <message>
- <source>Invalid netmask specified in -whitelist: '%s'</source>
- <translation type="unfinished">Указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÐµÑ‚ÐµÐ²Ð°Ñ Ð¼Ð°Ñка в -whitelist: "%s"</translation>
- </message>
- <message>
- <source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Ðеверный порт указан в %s: '%s'</translation>
- </message>
- <message>
- <source>Invalid pre-selected input %s</source>
- <translation type="unfinished">ÐедопуÑтимый предварительно выбранный ввод %s</translation>
- </message>
- <message>
- <source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">Ошибка при проÑлушивании входÑщих подключений (%s)</translation>
- </message>
- <message>
- <source>Loading P2P addresses…</source>
- <translation type="unfinished">Загрузка P2P адреÑов…</translation>
- </message>
- <message>
- <source>Loading banlist…</source>
- <translation type="unfinished">Загрузка черного ÑпиÑка…</translation>
- </message>
- <message>
- <source>Loading block index…</source>
- <translation type="unfinished">Загрузка индекÑа блоков…</translation>
- </message>
- <message>
- <source>Loading wallet…</source>
- <translation type="unfinished">Загрузка кошелька…</translation>
- </message>
- <message>
- <source>Missing amount</source>
- <translation type="unfinished">ОтÑутÑтвует Ñумма</translation>
- </message>
- <message>
- <source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">ÐедоÑтаточно данных Ð´Ð»Ñ Ð¾Ñ†ÐµÐ½ÐºÐ¸ размера транзакции</translation>
- </message>
- <message>
- <source>Need to specify a port with -whitebind: '%s'</source>
- <translation type="unfinished">Ðеобходимо указать порт Ñ -whitebind: "%s"</translation>
- </message>
- <message>
- <source>No addresses available</source>
- <translation type="unfinished">Ðет доÑтупных адреÑов</translation>
- </message>
- <message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">ÐедоÑтаточно доÑтупных файловых деÑкрипторов.</translation>
- </message>
- <message>
- <source>Not found pre-selected input %s</source>
- <translation type="unfinished">Ðе найден предварительно выбранный ввод %s</translation>
- </message>
- <message>
- <source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Ðе решаемый заранее выбранный ввод %s</translation>
- </message>
- <message>
- <source>Prune cannot be configured with a negative value.</source>
- <translation type="unfinished">Обрезка блоков не может иÑпользовать отрицательное значение.</translation>
- </message>
- <message>
- <source>Prune mode is incompatible with -txindex.</source>
- <translation type="unfinished">Режим обрезки неÑовмеÑтим Ñ -txindex.</translation>
- </message>
- <message>
- <source>Pruning blockstore…</source>
- <translation type="unfinished">Сокращение хранилища блоков…</translation>
- </message>
- <message>
- <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
- <translation type="unfinished">Уменьшение -maxconnections Ñ %d до %d из-за ограничений ÑиÑтемы.</translation>
- </message>
- <message>
- <source>Replaying blocks…</source>
- <translation type="unfinished">ПереÑборка блоков…</translation>
- </message>
- <message>
- <source>Rescanning…</source>
- <translation type="unfinished">Повторное Ñканирование…</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: не удалоÑÑŒ выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ базы данных: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: не удалоÑÑŒ подготовить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ базы данных: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to read database verification error: %s</source>
- <translation type="unfinished">SQLiteDatabase: ошибка при проверке базы данных: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
- <translation type="unfinished">SQLiteDatabase: неожиданный id приложениÑ. ОжидалоÑÑŒ %u, но получено %u</translation>
- </message>
- <message>
- <source>Section [%s] is not recognized.</source>
- <translation type="unfinished">Ð¡ÐµÐºÑ†Ð¸Ñ [%s] не раÑпознана.</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">ПодпиÑание транзакции не удалоÑÑŒ</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" does not exist</source>
- <translation type="unfinished">Указанный -walletdir "%s" не ÑущеÑтвует</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" is a relative path</source>
- <translation type="unfinished">Указанный -walletdir "%s" ÑвлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительным путем</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" is not a directory</source>
- <translation type="unfinished">Указанный -walletdir "%s" не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼</translation>
- </message>
- <message>
- <source>Specified blocks directory "%s" does not exist.</source>
- <translation type="unfinished">Указанный каталог блоков "%s" не ÑущеÑтвует.</translation>
- </message>
- <message>
- <source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">Указанный каталог данных "%s" не ÑущеÑтвует.</translation>
- </message>
- <message>
- <source>Starting network threads…</source>
- <translation type="unfinished">ЗапуÑк Ñетевых потоков…</translation>
- </message>
- <message>
- <source>The source code is available from %s.</source>
- <translation type="unfinished">ИÑходный код доÑтупен по адреÑу %s.</translation>
- </message>
- <message>
- <source>The specified config file %s does not exist</source>
- <translation type="unfinished">Указанный конфигурационный файл %s не ÑущеÑтвует</translation>
- </message>
- <message>
- <source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">Сумма транзакции Ñлишком мала Ð´Ð»Ñ ÑƒÐ¿Ð»Ð°Ñ‚Ñ‹ комиÑÑии</translation>
- </message>
- <message>
- <source>The wallet will avoid paying less than the minimum relay fee.</source>
- <translation type="unfinished">Кошелёк будет ÑтаратьÑÑ Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚ÑŒ не меньше минимальной комиÑÑии Ð´Ð»Ñ Ñ€ÐµÑ‚Ñ€Ð°Ð½ÑлÑции.</translation>
- </message>
- <message>
- <source>This is experimental software.</source>
- <translation type="unfinished">Это ÑкÑпериментальное программное обеÑпечение.</translation>
- </message>
- <message>
- <source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">Это Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¼Ð¸ÑÑиÑ, которую вы платите Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð¹ транзакции.</translation>
- </message>
- <message>
- <source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">Это размер комиÑÑии, которую вы заплатите при отправке транзакции.</translation>
- </message>
- <message>
- <source>Transaction amount too small</source>
- <translation type="unfinished">Размер транзакции Ñлишком мал</translation>
- </message>
- <message>
- <source>Transaction amounts must not be negative</source>
- <translation type="unfinished">Сумма транзакции не должна быть отрицательной</translation>
- </message>
- <message>
- <source>Transaction change output index out of range</source>
- <translation type="unfinished">Ð˜Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð°Ð´Ñ€ÐµÑа Ñдачи вне диапазона</translation>
- </message>
- <message>
- <source>Transaction must have at least one recipient</source>
- <translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° иметь Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одного получателÑ</translation>
- </message>
- <message>
- <source>Transaction needs a change address, but we can't generate it.</source>
- <translation type="unfinished">Ð”Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ требуетÑÑ Ð°Ð´Ñ€ÐµÑ Ñдачи, но Ñгенерировать его не удалоÑÑŒ.</translation>
- </message>
- <message>
- <source>Transaction too large</source>
- <translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ñлишком большаÑ</translation>
- </message>
- <message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Ðе удалоÑÑŒ выделить памÑÑ‚ÑŒ Ð´Ð»Ñ -maxsigcachesize: "%s" МиБ</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">Ðевозможно привÑзатьÑÑ (bind) к %s на Ñтом компьютере (ошибка %s)</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer. %s is probably already running.</source>
- <translation type="unfinished">Ðевозможно привÑзатьÑÑ (bind) к %s на Ñтом компьютере. Возможно, %s уже запущен.</translation>
- </message>
- <message>
- <source>Unable to create the PID file '%s': %s</source>
- <translation type="unfinished">Ðе удалоÑÑŒ Ñоздать PID-файл "%s": %s</translation>
- </message>
- <message>
- <source>Unable to find UTXO for external input</source>
- <translation type="unfinished">Ðе удалоÑÑŒ найти UTXO Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ входа</translation>
- </message>
- <message>
- <source>Unable to generate initial keys</source>
- <translation type="unfinished">Ðевозможно Ñгенерировать начальные ключи</translation>
- </message>
- <message>
- <source>Unable to generate keys</source>
- <translation type="unfinished">Ðевозможно Ñгенерировать ключи</translation>
- </message>
- <message>
- <source>Unable to open %s for writing</source>
- <translation type="unfinished">Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ %s Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи</translation>
- </message>
- <message>
- <source>Unable to parse -maxuploadtarget: '%s'</source>
- <translation type="unfinished">Ошибка при разборе параметра -maxuploadtarget: "%s"</translation>
- </message>
- <message>
- <source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">Ðевозможно запуÑтить HTTP-Ñервер. ПодробноÑти в файле debug.log.</translation>
- </message>
- <message>
- <source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Ðе удалоÑÑŒ выгрузить кошелёк перед миграцией</translation>
- </message>
- <message>
- <source>Unknown -blockfilterindex value %s.</source>
- <translation type="unfinished">ÐеизвеÑтное значение -blockfilterindex %s.</translation>
- </message>
- <message>
- <source>Unknown address type '%s'</source>
- <translation type="unfinished">ÐеизвеÑтный тип адреÑа "%s"</translation>
- </message>
- <message>
- <source>Unknown change type '%s'</source>
- <translation type="unfinished">ÐеизвеÑтный тип Ñдачи "%s"</translation>
- </message>
- <message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">Ð’ -onlynet указана неизвеÑÑ‚Ð½Ð°Ñ Ñеть: "%s"</translation>
- </message>
- <message>
- <source>Unknown new rules activated (versionbit %i)</source>
- <translation type="unfinished">Ð’ Ñилу вÑтупили неизвеÑтные правила (versionbit %i)</translation>
- </message>
- <message>
- <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
- <translation type="unfinished">Ðеподдерживаемый уровень глобального Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %s=%s. ДопуÑтимые значениÑ: %s.</translation>
- </message>
- <message>
- <source>acceptstalefeeestimates is not supported on %s chain.</source>
- <translation type="unfinished">acceptstalefeeestimates не поддерживаетÑÑ Ð² цепочке %s.</translation>
- </message>
- <message>
- <source>Unsupported logging category %s=%s.</source>
- <translation type="unfinished">Ðеподдерживаемый уровень Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° %s=%s.</translation>
- </message>
- <message>
- <source>User Agent comment (%s) contains unsafe characters.</source>
- <translation type="unfinished">Комментарий User Agent (%s) Ñодержит небезопаÑные Ñимволы.</translation>
- </message>
- <message>
- <source>Verifying blocks…</source>
- <translation type="unfinished">Проверка блоков…</translation>
- </message>
- <message>
- <source>Verifying wallet(s)…</source>
- <translation type="unfinished">Проверка кошелька(ов)…</translation>
- </message>
- <message>
- <source>Wallet needed to be rewritten: restart %s to complete</source>
- <translation type="unfinished">Ðеобходимо перезапиÑать кошелёк. ПерезапуÑтите %s Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸</translation>
- </message>
- <message>
- <source>Settings file could not be read</source>
- <translation type="unfinished">Файл наÑтроек не может быть прочитан</translation>
- </message>
- <message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">Файл наÑтроек не может быть запиÑан</translation>
- </message>
-</context>
+ </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_si.ts b/src/qt/locale/bitcoin_si.ts
index 5206b23486..cc6b40c945 100644
--- a/src/qt/locale/bitcoin_si.ts
+++ b/src/qt/locale/bitcoin_si.ts
@@ -294,7 +294,11 @@
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">පෙරනිමි පසුම්බිය</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -368,7 +372,7 @@
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;පසුම්බිය උපස්ථය…</translation>
+ <translation type="unfinished">&amp;පසුම්බිය උපස්ථකරන්න…</translation>
</message>
<message>
<source>Close Wallet…</source>
@@ -396,7 +400,7 @@
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">(%1%) à·à·Šâ€à¶»à·“ර්ෂ සමමුහූර්ත වෙමින්…</translation>
+ <translation type="unfinished">(%1%) à·à·“ර්ෂ සමමුහූර්ත වෙමින්…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -422,6 +426,10 @@
<translation type="unfinished">තොරතුර</translation>
</message>
<message>
+ <source>Up to date</source>
+ <translation type="unfinished">යà·à·€à¶­à·Šà¶šà·à¶½à·“නයි</translation>
+ </message>
+ <message>
<source>&amp;Sending addresses</source>
<translation type="unfinished">&amp;යවන ලිපින</translation>
</message>
@@ -431,11 +439,11 @@
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">පසුම්බිය බලන්න</translation>
+ <translation type="unfinished">පසුම්බිය විවෘත කරන්න</translation>
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">පසුම්බියක් බලන්න</translation>
+ <translation type="unfinished">පසුම්බියක් විවෘත කරන්න</translation>
</message>
<message>
<source>Close wallet</source>
@@ -451,10 +459,6 @@
<translation type="unfinished">සියළු පසුම්බි වසන්න</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">පෙරනිමි පසුම්බිය</translation>
- </message>
- <message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
<translation type="unfinished">පසුම්බියේ දත්ත</translation>
@@ -631,10 +635,6 @@
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">පෙරනිමි පසුම්බිය</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">පසුම්බිය බලන්න</translation>
@@ -1231,11 +1231,7 @@
<source>Send Coins</source>
<translation type="unfinished">කà·à·ƒà·’ යවන්න</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">පෙරනිමි පසුම්බිය</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts
index d0e8b11fe8..855bfd371d 100644
--- a/src/qt/locale/bitcoin_sk.ts
+++ b/src/qt/locale/bitcoin_sk.ts
@@ -167,6 +167,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Zadajte starú a novú frázu pre túto peňaženku.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">PokraÄovaÅ¥</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Pamätajte, že zaÅ¡ifrovanie peňaženky neochráni úplne vaÅ¡e bitcoiny pred ukradnutím Å¡kodlivými programami vo vaÅ¡om poÄítaÄi.</translation>
</message>
@@ -387,7 +391,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n rokov</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">predvolená peňaženka</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -637,7 +645,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Okno uzlov</translation>
+ <translation type="unfinished">Uzlové okno</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
@@ -694,10 +702,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Skryť hodnoty v karte "Prehľad"</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">predvolená peňaženka</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nie je dostupná žiadna peňaženka</translation>
</message>
@@ -1050,10 +1054,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Varovanie otvárania peňaženky</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">predvolená peňaženka</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otvoriť peňaženku</translation>
@@ -2253,7 +2253,7 @@ Ak ste dostali túto chybu mali by ste požiadaÅ¥ obchodníka o URI kompatibilnÃ
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Okno uzlov</translation>
+ <translation type="unfinished">Uzlové okno</translation>
</message>
<message>
<source>Current block height</source>
@@ -2461,6 +2461,10 @@ Ak ste dostali túto chybu mali by ste požiadaÅ¥ obchodníka o URI kompatibilnÃ
<translation type="unfinished">Sieťová aktivita zakázaná</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Žiadne</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Príkaz sa vykonáva bez peňaženky</translation>
</message>
@@ -3146,10 +3150,6 @@ Poznámka: KeÄže poplatok je poÄítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">&amp;Podpísať Správu</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Môžete podpísaÅ¥ správy svojou adresou a dokázaÅ¥, že viete prijímaÅ¥ mince zaslané na túto adresu. BuÄte vÅ¡ak opatrní a podpíšte len podrobné prehlásenia, s ktorými plne súhlasíte, nakoľko útoky typu "phishing" Vás môžu lákaÅ¥ k podpísaniu nejasných alebo príliÅ¡ vÅ¡eobecných tvrdení Äím prevezmú vaÅ¡u identitu.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin adresa pre podpísanie správy s</translation>
</message>
@@ -3234,10 +3234,6 @@ Poznámka: KeÄže poplatok je poÄítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Prosím skontrolujte adresu a skúste znova.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Vložená adresa nezodpovedá žiadnemu kľúÄu.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Odomknutie peňaženky bolo zrušené.</translation>
</message>
@@ -3801,10 +3797,6 @@ ChoÄte do Súbor &gt; OtvoriÅ¥ Peňaženku, pre naÄítanie peňaženky.
<source>Can't display address</source>
<translation type="unfinished">Nemôžem zobraziť adresu</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">predvolená peňaženka</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3925,10 +3917,6 @@ ChoÄte do Súbor &gt; OtvoriÅ¥ Peňaženku, pre naÄítanie peňaženky.
<translation type="unfinished">Nezadaný formát súboru peňaženky. Pre použitie createfromdump musíte zadať -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Prosím skontrolujte systémový Äas a dátum. KeÄ je váš Äas nesprávny, %s nebude fungovaÅ¥ správne.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">KeÄ si myslíte, že %s je užitoÄný, podporte nás. Pre viac informácií o software navÅ¡tívte %s.</translation>
</message>
@@ -4021,10 +4009,6 @@ ChoÄte do Súbor &gt; OtvoriÅ¥ Peňaženku, pre naÄítanie peňaženky.
<translation type="unfinished">-maxmempool musí byť najmenej %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Nastala fatálna interná chyba, pre viac informácií pozrite debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Nedá preložiť -%s adresu: '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sl.ts b/src/qt/locale/bitcoin_sl.ts
index a9a8cef968..5dea2adaaa 100644
--- a/src/qt/locale/bitcoin_sl.ts
+++ b/src/qt/locale/bitcoin_sl.ts
@@ -176,6 +176,10 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Vnesite staro geslo in novo geslo za denarnico.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nadaljuj</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Pomnite, da Å¡ifriranje denarnice ne more prepreÄiti morebitnim virusom na vaÅ¡em raÄunalniku, da bi ukradli vaÅ¡e bitcoine.</translation>
</message>
@@ -271,8 +275,7 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<message>
<source>Do you want to reset settings to default values, or to abort without making changes?</source>
<extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">Želite ponastaviti nastavitve na privzete vrednosti ali prekiniti urejanje brez sprememb?
-</translation>
+ <translation type="unfinished">Želite ponastaviti nastavitve na privzete vrednosti ali prekiniti urejanje brez sprememb?</translation>
</message>
<message>
<source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
@@ -400,7 +403,11 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<numerusform>%n let</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">privzeta denarnica</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -529,65 +536,73 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">&amp;Naloži DPBT iz datoteke...</translation>
</message>
<message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">Povezujem se s soležniki...</translation>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Odpri &amp;URI...</translation>
</message>
<message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Zahtevajte plaÄilo (ustvarite zahtevek s QR-kodo in URI tipa bitcoin:)</translation>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Zapri denarnico...</translation>
</message>
<message>
- <source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Prikaži seznam naslovov in oznak, na katere ste kdaj poslali plaÄila</translation>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Ustvari denarnico...</translation>
</message>
<message>
- <source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Prikaži seznam naslovov in oznak, na katere ste kdaj prejeli plaÄila</translation>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Zapri vse denarnice...</translation>
</message>
<message>
- <source>&amp;Command-line options</source>
- <translation type="unfinished">Možnosti &amp;ukazne vrstice</translation>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Datoteka</translation>
</message>
- <message numerus="yes">
- <source>Processed %n block(s) of transaction history.</source>
- <translation type="unfinished">
- <numerusform>Obdelan %n blok zgodovine transakcij.</numerusform>
- <numerusform>Obdelana %n bloka zgodovine transakcij.</numerusform>
- <numerusform>Obdelani %n bloki zgodovine transakcij.</numerusform>
- <numerusform>Obdelanih %n blokov zgodovine transakcij.</numerusform>
- </translation>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Nastavitve</translation>
</message>
<message>
- <source>%1 behind</source>
- <translation type="unfinished">%1 zaostanka</translation>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;PomoÄ</translation>
</message>
<message>
- <source>Catching up…</source>
- <translation type="unfinished">Dohitevam...</translation>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Orodna vrstica zavihkov</translation>
</message>
<message>
- <source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Zadnji prejeti blok je star %1.</translation>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Sinhroniziram zaglavja (%1%)...</translation>
</message>
<message>
- <source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Novejše transakcije še ne bodo vidne.</translation>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Dohitevam omrežje ...</translation>
</message>
<message>
- <source>Error</source>
- <translation type="unfinished">Napaka</translation>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Izdelujem kazalo blokov na disku...</translation>
</message>
<message>
- <source>Warning</source>
- <translation type="unfinished">Opozorilo</translation>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Procesiram bloke na disku...</translation>
</message>
<message>
- <source>Information</source>
- <translation type="unfinished">Informacije</translation>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Povezujem se s soležniki…</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp;Možnosti iz ukazne vrstice</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform>Obdelan %n blok zgodovine transakcij.</numerusform>
+ <numerusform>Obdelana %n bloka zgodovine transakcij.</numerusform>
+ <numerusform>Obdelani %n bloki zgodovine transakcij.</numerusform>
+ <numerusform>Obdelanih %n blokov zgodovine transakcij.</numerusform>
+ </translation>
</message>
<message>
- <source>Up to date</source>
- <translation type="unfinished">Ažurno</translation>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Naloži delno podpisano bitcoin-transakcijo</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -656,10 +671,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Zamaskiraj vrednosti v zavihku Pregled</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">privzeta denarnica</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ni denarnic na voljo</translation>
</message>
@@ -688,6 +699,18 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">O&amp;kno</translation>
</message>
<message>
+ <source>Zoom</source>
+ <translation type="unfinished">PoveÄava</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">Glavno okno</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">Odjemalec %1</translation>
+ </message>
+ <message>
<source>&amp;Hide</source>
<translation type="unfinished">&amp;Skrij</translation>
</message>
@@ -932,6 +955,10 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Kopiraj vraÄilo</translation>
</message>
<message>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1 zaklenjeno)</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Lahko se razlikuje za +/- %1 sat na vhod.</translation>
</message>
@@ -1001,10 +1028,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Opozorilo pri odpiranju denarnice</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">privzeta denarnica</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Odpri denarnico</translation>
@@ -2473,6 +2496,10 @@ Svetujemo, da prodajalca prosite, naj vam priskrbi URI na podlagi BIP21.</transl
<translation type="unfinished">Omrežna aktivnost onemogoÄena.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Jih ni</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Izvajam ukaz brez denarnice</translation>
</message>
@@ -3189,10 +3216,6 @@ Opomba: Ker se provizija izraÄuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">&amp;PodpiÅ¡i sporoÄilo</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">S svojimi naslovi lahko podpisujete sporoÄila ali dogovore in s tem dokazujete, da na teh naslovih lahko prejemate kovance. Bodite previdni in ne podpisujte niÄesar nejasnega ali nakljuÄnega, ker vas zlikovci preko ribarjenja (phishing) lahko prelisiÄijo, da na njih prepiÅ¡ete svojo identiteto. Podpisujte samo podrobno opisane izjave, s katerimi se strinjate.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-naslov, s katerim podpisujete sporoÄilo</translation>
</message>
@@ -3277,10 +3300,6 @@ Opomba: Ker se provizija izraÄuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Prosimo, preverite naslov in poskusite znova.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">VneÅ¡eni naslov se ne nanaÅ¡a na kljuÄ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Odklepanje denarnice je bilo preklicano.</translation>
</message>
@@ -3848,11 +3867,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">DPBT kopirana</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Kopirano na odložiÅ¡Äe</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Ne morem podpisati transakcije.</translation>
</message>
@@ -3864,10 +3878,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<source>Can't display address</source>
<translation type="unfinished">Ne morem prikazati naslova</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">privzeta denarnica</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3988,10 +3998,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">Potrebno je doloÄiti obliko izvozne (dump) datoteke. Z ukazom createfromdump morate uporabiti možnost -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Opozorilo: Preverite, Äe sta datum in ura na vaÅ¡em raÄunalniku toÄna! %s ne bo deloval pravilno, Äe je nastavljeni Äas nepravilen.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Prosimo, prispevajte, Äe se vam zdi %s uporaben. Za dodatne informacije o programski opremi obiÅ¡Äite %s.</translation>
</message>
@@ -4088,10 +4094,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">-maxmempool mora biti vsaj %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Prišlo je do usodne notranje napake. Za podrobnosti glejte datoteko debug.log.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Naslova -%s ni mogoÄe razreÅ¡iti: '%s'</translation>
</message>
@@ -4104,6 +4106,10 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">Nastavitev -peerblockfilters ni veljavna brez nastavitve -blockfilterindex.</translation>
</message>
<message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">Nimam dostopa za pisanje v podatkovni mapi '%s'; preveri dovoljenja.</translation>
+ </message>
+ <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Nezdružljivi nastavitvi: navedene so specifiÄne povezave in hkrati se uporablja addrman za iskanje izhodnih povezav.</translation>
</message>
@@ -4217,7 +4223,7 @@ Obnovitev varnostne kopije denarnice ni bila mogoÄa.</translation>
</message>
<message>
<source>Error reading configuration file: %s</source>
- <translation type="unfinished">Napaka pri branju nastavitvene datoteke: 1%s</translation>
+ <translation type="unfinished">Napaka pri branju nastavitvene datoteke: %s</translation>
</message>
<message>
<source>Error reading from database, shutting down.</source>
@@ -4516,10 +4522,6 @@ Obnovitev varnostne kopije denarnice ni bila mogoÄa.</translation>
<translation type="unfinished">Transkacija je prevelika</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Spodletelo je dodeljevanje pomnilnika za -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Na tem raÄunalniku ni bilo mogoÄe vezati naslova %s (vrnjena napaka: %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sn.ts b/src/qt/locale/bitcoin_sn.ts
index bfdb6c951b..634e27c1a1 100644
--- a/src/qt/locale/bitcoin_sn.ts
+++ b/src/qt/locale/bitcoin_sn.ts
@@ -247,6 +247,10 @@
<source>N/A</source>
<translation type="unfinished">Hapana</translation>
</message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">Hapana</translation>
+ </message>
</context>
<context>
<name>RecentRequestsTableModel</name>
diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts
index bfd805fd4a..b366aa3b9c 100644
--- a/src/qt/locale/bitcoin_sr.ts
+++ b/src/qt/locale/bitcoin_sr.ts
@@ -184,6 +184,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">УнеÑи Ñтару лозинку и нову лозинку новчаника.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nastavi</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Упамти, шифрирање новчаника не може у потуноÑти заштити твоје биткоине од крађе од Ñтране малвера инфицира твој рачунар.</translation>
</message>
@@ -413,7 +417,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished">%1 килобајта</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">подразумевани новчаник</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -719,10 +727,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Филтрирај вредноÑти у картици за преглед</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ðема доÑтупних новчаника</translation>
</message>
@@ -1061,10 +1065,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Упозорење приликом отварања новчаника</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Отвори новчаник</translation>
@@ -2380,6 +2380,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ÐктивноÑÑ‚ мреже онемогућена</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nijedan</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Извршење команде без новчаника</translation>
</message>
@@ -3051,8 +3055,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ПотпиÑи - Потпиши / Потврди поруку</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Можете потпиÑати поруку/Ñпоразум Ñа вашом адреÑом да би Ñте доказали да можете примити биткоин поÑлат ка њима. Будите опрезни да не потпиÑујете ништа нејаÑно или Ñлучајно, јер Ñе може деÑити напад крађе идентитета, да потпишете ваш идентитет нападачу. Потпишите Ñамо потпуно детаљне изјаве Ñа којима Ñе Ñлажете.</translation>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">&amp;Потпиши поруку</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3139,10 +3143,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Молим проверите адреÑу и покушајте поново.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">УнеÑена адреÑа Ñе не одноÑи на кључ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Откључавање новчаника је отказано.</translation>
</message>
@@ -3200,6 +3200,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<context>
<name>TransactionDesc</name>
<message>
+ <source>conflicted with a transaction with %1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
+ <translation type="unfinished">поÑтоји неуÑаглашеноÑÑ‚ Ñа транÑакцијом Ñа %1 потврда</translation>
+ </message>
+ <message>
<source>abandoned</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
<translation type="unfinished">напуштено</translation>
@@ -3679,11 +3684,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Could not commit transaction</source>
<translation type="unfinished">ТранÑакција није могућа</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3739,10 +3740,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ДиÑтрибуирано под MIT ÑофтверÑком лиценцом, погледајте придружени документ %s или %s</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Молим проверите да Ñу време и датум на вашем рачунару тачни. Уколико је Ñат нетачан, %s неће радити иÑправно.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Молим донирајте, уколико Ñматрате %s кориÑним. ПоÑетите %s за више информација о Ñофтверу.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
index b4558fe4c4..b4c3906a17 100644
--- a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
+++ b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
@@ -184,6 +184,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">УнеÑи Ñтару лозинку и нову лозинку новчаника.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nastavi</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Упамти, шифрирање новчаника не може у потуноÑти заштити твоје биткоине од крађе од Ñтране малвера инфицира твој рачунар.</translation>
</message>
@@ -409,7 +413,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished">%1 килобајта</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">подразумевани новчаник</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -499,7 +507,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Options…</source>
- <translation type="unfinished">&amp;Опције...</translation>
+ <translation type="unfinished">&amp;Opcije…</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
@@ -627,11 +635,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Грешка</translation>
+ <translation type="unfinished">Greska</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Упозорење</translation>
+ <translation type="unfinished">Upozorenje</translation>
</message>
<message>
<source>Information</source>
@@ -715,10 +723,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Филтрирај вредноÑти у картици за преглед</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ðема доÑтупних новчаника</translation>
</message>
@@ -1057,10 +1061,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Упозорење приликом отварања новчаника</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otvori novÄanik</translation>
@@ -2376,6 +2376,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ÐктивноÑÑ‚ мреже онемогућена</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nijedan</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Извршење команде без новчаника</translation>
</message>
@@ -3047,8 +3051,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ПотпиÑи - Потпиши / Потврди поруку</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Можете потпиÑати поруку/Ñпоразум Ñа вашом адреÑом да би Ñте доказали да можете примити биткоин поÑлат ка њима. Будите опрезни да не потпиÑујете ништа нејаÑно или Ñлучајно, јер Ñе може деÑити напад крађе идентитета, да потпишете ваш идентитет нападачу. Потпишите Ñамо потпуно детаљне изјаве Ñа којима Ñе Ñлажете.</translation>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">&amp;Потпиши поруку</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3135,10 +3139,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Молим проверите адреÑу и покушајте поново.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">УнеÑена адреÑа Ñе не одноÑи на кључ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Откључавање новчаника је отказано.</translation>
</message>
@@ -3196,6 +3196,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<context>
<name>TransactionDesc</name>
<message>
+ <source>conflicted with a transaction with %1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
+ <translation type="unfinished">поÑтоји неуÑаглашеноÑÑ‚ Ñа транÑакцијом Ñа %1 потврда</translation>
+ </message>
+ <message>
<source>abandoned</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
<translation type="unfinished">напуштено</translation>
@@ -3675,11 +3680,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Could not commit transaction</source>
<translation type="unfinished">ТранÑакција није могућа</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3735,10 +3736,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ДиÑтрибуирано под MIT ÑофтверÑком лиценцом, погледајте придружени документ %s или %s</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Молим проверите да Ñу време и датум на вашем рачунару тачни. Уколико је Ñат нетачан, %s неће радити иÑправно.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Молим донирајте, уколико Ñматрате %s кориÑним. ПоÑетите %s за више информација о Ñофтверу.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr@latin.ts b/src/qt/locale/bitcoin_sr@latin.ts
index c596202a49..395752767d 100644
--- a/src/qt/locale/bitcoin_sr@latin.ts
+++ b/src/qt/locale/bitcoin_sr@latin.ts
@@ -184,6 +184,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Unesite u novÄanik staru lozinku i novu lozinku.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nastavi</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Упамти, шифрирање новчаника не може у потуноÑти заштити твоје биткоине од крађе од Ñтране малвера инфицира твој рачунар.</translation>
</message>
@@ -409,7 +413,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished">%1 килобајта</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">подразумевани новчаник</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -499,7 +507,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Options…</source>
- <translation type="unfinished">&amp;Опције...</translation>
+ <translation type="unfinished">&amp;Opcije…</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
@@ -715,10 +723,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Филтрирај вредноÑти у картици за преглед</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ðема доÑтупних новчаника</translation>
</message>
@@ -1057,10 +1061,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Упозорење приликом отварања новчаника</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otvori novÄanik</translation>
@@ -2372,6 +2372,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ÐктивноÑÑ‚ мреже онемогућена</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nijedan</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Извршење команде без новчаника</translation>
</message>
@@ -3043,8 +3047,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ПотпиÑи - Потпиши / Потврди поруку</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Можете потпиÑати поруку/Ñпоразум Ñа вашом адреÑом да би Ñте доказали да можете примити биткоин поÑлат ка њима. Будите опрезни да не потпиÑујете ништа нејаÑно или Ñлучајно, јер Ñе може деÑити напад крађе идентитета, да потпишете ваш идентитет нападачу. Потпишите Ñамо потпуно детаљне изјаве Ñа којима Ñе Ñлажете.</translation>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">&amp;Потпиши поруку</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3131,10 +3135,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Молим проверите адреÑу и покушајте поново.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">УнеÑена адреÑа Ñе не одноÑи на кључ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Откључавање новчаника је отказано.</translation>
</message>
@@ -3192,6 +3192,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<context>
<name>TransactionDesc</name>
<message>
+ <source>conflicted with a transaction with %1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
+ <translation type="unfinished">поÑтоји неуÑаглашеноÑÑ‚ Ñа транÑакцијом Ñа %1 потврда</translation>
+ </message>
+ <message>
<source>abandoned</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
<translation type="unfinished">напуштено</translation>
@@ -3671,11 +3676,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Could not commit transaction</source>
<translation type="unfinished">ТранÑакција није могућа</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3731,10 +3732,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ДиÑтрибуирано под MIT ÑофтверÑком лиценцом, погледајте придружени документ %s или %s</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Молим проверите да Ñу време и датум на вашем рачунару тачни. Уколико је Ñат нетачан, %s неће радити иÑправно.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Молим донирајте, уколико Ñматрате %s кориÑним. ПоÑетите %s за више информација о Ñофтверу.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts
index 618a3acbb0..1bf74501cc 100644
--- a/src/qt/locale/bitcoin_sv.ts
+++ b/src/qt/locale/bitcoin_sv.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Högerklicka för att redigera adressen eller etiketten.</translation>
+ <translation type="unfinished">Adresi veya etiketi düzenlemek için sağ tıklayın.</translation>
</message>
<message>
<source>Create a new address</source>
@@ -26,10 +26,6 @@
<translation type="unfinished">S&amp;täng</translation>
</message>
<message>
- <source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Ta bort den valda adressen från listan</translation>
- </message>
- <message>
<source>Enter address or label to search</source>
<translation type="unfinished">Ange en adress eller etikett att söka efter</translation>
</message>
@@ -50,10 +46,6 @@
<translation type="unfinished">Välj en adress att skicka transaktionen till</translation>
</message>
<message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">Välj en adress att ta emot transaktionen med</translation>
- </message>
- <message>
<source>C&amp;hoose</source>
<translation type="unfinished">V&amp;älj</translation>
</message>
@@ -62,11 +54,6 @@
<translation type="unfinished">Detta är dina Bitcoin-adresser för att skicka betalningar. Kontrollera alltid belopp och mottagaradress innan du skickar bitcoin.</translation>
</message>
<message>
- <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
-Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">Detta är dina Bitcoinadresser för att ta emot betalningar. Använd knappen 'Skapa ny mottagaradress' i mottagsfliken för att skapa nya adresser. Signering är bara tillgänglig för adresser av typen 'legacy'</translation>
- </message>
- <message>
<source>&amp;Copy Address</source>
<translation type="unfinished">&amp;Kopiera adress</translation>
</message>
@@ -94,10 +81,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
Försök igen.</translation>
</message>
<message>
- <source>Sending addresses - %1</source>
- <translation type="unfinished">Avsändaradresser - %1</translation>
- </message>
- <message>
<source>Receiving addresses - %1</source>
<translation type="unfinished">Mottagaradresser - %1</translation>
</message>
@@ -184,6 +167,14 @@ Försök igen.</translation>
<translation type="unfinished">Ange den gamla lösenfrasen och den nya lösenfrasen för plånboken.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Fortsätt</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Tillbaka</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Kom ihåg att kryptering av din plånbok inte helt kan skydda dig från stöld av dina bitcoins om skadlig kod infekterat din dator.</translation>
</message>
@@ -296,13 +287,17 @@ Försök igen.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 har inte avslutats korrekt ännu...</translation>
+ <translation type="unfinished">%1 har inte avslutats korrekt än...</translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished">okänd</translation>
</message>
<message>
+ <source>Custom…</source>
+ <translation type="unfinished">Anpassad...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Belopp</translation>
</message>
@@ -341,36 +336,36 @@ Försök igen.</translation>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
</translation>
</message>
<message>
@@ -380,11 +375,15 @@ Försök igen.</translation>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standardplånbok</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -558,7 +557,7 @@ Försök igen.</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Processar block på disken…</translation>
+ <translation type="unfinished">Behandlar block på disken…</translation>
</message>
<message>
<source>Connecting to peers…</source>
@@ -694,10 +693,6 @@ Försök igen.</translation>
<translation type="unfinished">Dölj värden i översiktsfliken</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standardplånbok</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Inga plånböcker tillgängliga</translation>
</message>
@@ -739,7 +734,7 @@ Försök igen.</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">&amp;Dölj</translation>
+ <translation type="unfinished">och göm</translation>
</message>
<message>
<source>S&amp;how</source>
@@ -1054,7 +1049,7 @@ Försök igen.</translation>
</message>
<message>
<source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Är du säker att du vill migrera plånboken 1 %1 1 ?</translation>
+ <translation type="unfinished">Är du säker att du vill migrera plånboken &lt;i&gt;%1&lt;/i&gt; ?</translation>
</message>
<message>
<source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
@@ -1098,10 +1093,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Öppna plånboksvarning</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standardplånbok</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Öppna plånbok</translation>
@@ -2246,6 +2237,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Riktning/Typ</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">BIP324 sessions ID-strängen i hex.</translation>
+ </message>
+ <message>
<source>Services</source>
<translation type="unfinished">Tjänster</translation>
</message>
@@ -2361,10 +2356,18 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Nätverksaktivitet inaktiverad</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ingen</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Utför instruktion utan plånbok</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Nodfönster - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Utför instruktion med plånbok "%1"</translation>
</message>
@@ -2784,6 +2787,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Verifiera ditt transaktionsförslag. Det kommer skapas en delvis signerad Bitcoin transaktion (PSBT) som du kan spara eller kopiera och sen signera med t.ex. en offline %1 plånbok, eller en PSBT-kompatibel hårdvaruplånbok.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 från plånbok '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Vill du skapa den här transaktionen?</translation>
@@ -2840,8 +2847,8 @@ Om den här plånboken innehåller lösbara</translation>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
<message>
@@ -2946,10 +2953,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">&amp;Signera meddelande</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Du kan signera meddelanden/avtal med dina adresser för att bevisa att du kan ta emot bitcoin som skickats till dem. Var försiktig så du inte signerar något oklart eller konstigt, eftersom phishing-angrepp kan försöka få dig att signera över din identitet till dem. Signera endast väldetaljerade meddelanden som du godkänner.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-adress att signera meddelandet med</translation>
</message>
@@ -3034,10 +3037,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Kontrollera adressen och försök igen.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Den angivna adressen refererar inte till en nyckel.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Upplåsningen av plånboken avbröts.</translation>
</message>
@@ -3150,8 +3149,8 @@ Om den här plånboken innehåller lösbara</translation>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<message>
@@ -3548,6 +3547,10 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">PSBT kopierad</translation>
</message>
<message>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Avgifts-höjande PSBT kopierad till urklipp</translation>
+ </message>
+ <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Kan ej signera transaktion.</translation>
</message>
@@ -3556,12 +3559,12 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">Kunde inte skicka transaktion</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Kan inte visa adress</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Signeringsfel</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standardplånbok</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Kan inte visa adress</translation>
</message>
</context>
<context>
@@ -3627,10 +3630,6 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">Fler än en onion-adress finns tillgänglig. Den automatiskt skapade Tor-tjänsten kommer använda %s.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Kontrollera att din dators datum och tid är korrekt! Om klockan går fel kommer %s inte att fungera korrekt.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Var snäll och bidra om du finner %s användbar. Besök %s för mer information om mjukvaran.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sw.ts b/src/qt/locale/bitcoin_sw.ts
index e084f3df88..0497444d5e 100644
--- a/src/qt/locale/bitcoin_sw.ts
+++ b/src/qt/locale/bitcoin_sw.ts
@@ -243,6 +243,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Faili ya mipangilio ya asilimia %1 inaweza kuwa mbovu au batili.</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">Ubaguzi wa kukimbia</translation>
</message>
@@ -321,7 +325,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">mkoba chaguo-msingi</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -383,7 +391,7 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">Proxy imeamilishwa: %1</translation>
+ <translation type="unfinished">Proxy &lt;b&gt;imeamilishwa&lt;/b&gt;: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -410,10 +418,19 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">&amp;Chaguo...</translation>
</message>
<message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Simba Mkoba...</translation>
+ </message>
+ <message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">Funga funguo za siri zinazomiliki mkoba wako.</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Hifadhi Mkoba...
+</translation>
+ </message>
+ <message>
<source>&amp;Change Passphrase…</source>
<translation type="unfinished">&amp;Badilisha Nenosiri...</translation>
</message>
@@ -426,10 +443,18 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Saini ujumbe na anwani zako za Bitcoin ili kuthibitisha umiliki wao.</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Thibitisha ujumbe...</translation>
+ </message>
+ <message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
<translation type="unfinished">Hakikisha ujumbe umethibitishwa kuwa ulisainiwa na anwani za Bitcoin zilizotajwa</translation>
</message>
<message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Pakia PSBT kutoka faili...</translation>
+ </message>
+ <message>
<source>Open &amp;URI…</source>
<translation type="unfinished">Fungua &amp;URI ...</translation>
</message>
@@ -487,7 +512,7 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Onyesha orodha ya anuani za kutuma na chapa</translation>
+ <translation type="unfinished">Onyesha orodha ya anuani za kutuma zilizotumika na chapa</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
@@ -505,12 +530,20 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</translation>
</message>
<message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1 nyuma</translation>
+ </message>
+ <message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Inakamata...</translation>
+ </message>
+ <message>
<source>Transactions after this will not yet be visible.</source>
<translation type="unfinished">Shughuli baada ya hii bado hazitaonekana.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Onyo</translation>
+ <translation type="unfinished">Kosa</translation>
</message>
<message>
<source>Warning</source>
@@ -521,12 +554,105 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Habari</translation>
</message>
<message>
+ <source>Up to date</source>
+ <translation type="unfinished">Imesasishwa</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Pakia Muamala wa Bitcoin Uliosainiwa Kiasi</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Pakia PSBT kutoka &amp;clipboard...</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">Pakia Muamala wa Bitcoin Uliosainiwa Kiasi kutoka kwenye ubao wa kunakili</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Dirisha la nodi</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Fungua utatuzi wa nodi na koni ya uchunguzi</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">&amp;Anwani za kutuma</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">&amp;Inapokea anwani</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">Fungua bitcoin: URI</translation>
+ </message>
+ <message>
<source>Open Wallet</source>
<translation type="unfinished">Fungua Pochi</translation>
</message>
<message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Fungua pochi</translation>
+ </message>
+ <message>
<source>Close wallet</source>
- <translation type="unfinished">Funga Pochi</translation>
+ <translation type="unfinished">Funga pochi</translation>
+ </message>
+ <message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Rejesha Pochi...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Rejesha mkoba kutoka kwa faili ya chelezo</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Funga pochi zote</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Hamisha Pochi</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Hamisha mkoba</translation>
+ </message>
+ <message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished">Onyesha %1 ujumbe wa usaidizi ili kupata orodha na chaguo zinazowezekana za mstari wa amri za Bitcoin</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">&amp;Funga maadili</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Ficha maadili kwenye kichupo cha Muhtasari</translation>
+ </message>
+ <message>
+ <source>No wallets available</source>
+ <translation type="unfinished">Hakuna pochi zinazopatikana</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Data ya Pochi</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Pakia Hifadhi Nakala ya Wallet</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Rejesha Pochi</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -534,9 +660,29 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Jina la Wallet</translation>
</message>
<message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Dirisha</translation>
+ </message>
+ <message>
+ <source>Zoom</source>
+ <translation type="unfinished">Kuza</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">Dirisha Kuu</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 mteja</translation>
+ </message>
+ <message>
<source>&amp;Hide</source>
<translation type="unfinished">&amp;Ficha</translation>
</message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">Jinsi &amp; jinsi</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -546,13 +692,98 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</translation>
</message>
<message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">Bofya kwa vitendo zaidi.</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">Onyesha kichupo cha Marika</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Zima shughuli za mtandao</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Washa shughuli za mtandao</translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Kusawazisha Vichwa vya awali (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Hitilafu unapounda pochi</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Haiwezi kuunda pochi mpya, programu iliundwa bila usaidizi wa sqlite (inahitajika kwa pochi za maelezo)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Kosa: %1</translation>
</message>
<message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Onyo: %1</translation>
+ </message>
+ <message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">Tarehe: %1</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation type="unfinished">Kiasi: %1
+</translation>
+ </message>
+ <message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">Pochi: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation type="unfinished">Aina: %1</translation>
+ </message>
+ <message>
<source>Label: %1
</source>
- <translation type="unfinished">Chapa: %1</translation>
+ <translation type="unfinished">Chapa: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation type="unfinished">Anwani: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">Umetuma muamala</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">Muamala unaoingia</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
+ <translation type="unfinished">Uzalishaji wa ufunguo wa HD ni &lt;b&gt;kuwezeshwa &lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Uzalishaji wa ufunguo wa HD ni &lt;b&gt;kutowezeshwa&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Ufunguo wa kibinafsi &lt;b&gt; umezimwa &lt;/b&gt;</translation>
</message>
</context>
<context>
@@ -587,6 +818,13 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Hamisha Pochi</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open Wallet</source>
@@ -597,6 +835,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<context>
<name>RestoreWalletActivity</name>
<message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Rejesha Pochi</translation>
+ </message>
+ <message>
<source>Restore wallet warning</source>
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
<translation type="unfinished">Rejesha onyo la pochi</translation>
@@ -612,6 +855,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
<translation type="unfinished">Kufunga pochi kwa muda mrefu sana kunaweza kusababisha kusawazisha tena mnyororo mzima ikiwa upogoaji umewezeshwa.</translation>
</message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Funga pochi zote</translation>
+ </message>
</context>
<context>
<name>CreateWalletDialog</name>
@@ -725,6 +972,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<context>
<name>OptionsDialog</name>
<message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Dirisha</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">Onyo</translation>
</message>
@@ -745,6 +996,13 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
</context>
<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Dirisha la nodi</translation>
+ </message>
+ </context>
+<context>
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Label:</source>
@@ -920,6 +1178,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">Toa data katika kichupo cha sasa hadi kwenye faili</translation>
</message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Data ya Pochi</translation>
+ </message>
</context>
<context>
<name>bitcoin-core</name>
diff --git a/src/qt/locale/bitcoin_szl.ts b/src/qt/locale/bitcoin_szl.ts
index 81a33250ad..83ba8cb6fb 100644
--- a/src/qt/locale/bitcoin_szl.ts
+++ b/src/qt/locale/bitcoin_szl.ts
@@ -260,7 +260,11 @@
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">wychodny portmanyj</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -427,10 +431,6 @@
<translation type="unfinished">PokÅż pÅmoc %1 coby zobÅczyć wykÅz wszyjskich ôpcyji piski nakÅzaÅ„.</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">wychodny portmanyj</translation>
- </message>
- <message>
<source>&amp;Window</source>
<translation type="unfinished">Ô&amp;kno</translation>
</message>
@@ -622,13 +622,6 @@
</message>
</context>
<context>
- <name>OpenWalletActivity</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">wychodny portmanyj</translation>
- </message>
- </context>
-<context>
<name>CreateWalletDialog</name>
<message>
<source>Wallet</source>
@@ -1593,11 +1586,7 @@
<source>New fee:</source>
<translation type="unfinished">NowŠôpÅ‚Åcka:</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">wychodny portmanyj</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_ta.ts b/src/qt/locale/bitcoin_ta.ts
index 6255126438..797a07b778 100644
--- a/src/qt/locale/bitcoin_ta.ts
+++ b/src/qt/locale/bitcoin_ta.ts
@@ -342,7 +342,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ வாலடà¯</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -408,7 +412,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">பà¯à®°à®¾à®•à¯à®¸à®¿ இயகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯: %1</translation>
+ <translation type="unfinished">பà¯à®°à®¾à®•à¯à®¸à®¿ &lt;b&gt;இயகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯&lt;/b&gt;: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -575,10 +579,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">கணà¯à®£à¯‹à®Ÿà¯à®Ÿà®®à¯ தாவலில௠மதிபà¯à®ªà¯à®•à®³à¯ˆ மறைகà¯à®•à®µà¯à®®à¯</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ வாலடà¯</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">வாலட௠எதà¯à®µà¯à®®à¯ இலà¯à®²à¯ˆ</translation>
</message>
@@ -665,23 +665,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">HD à®®à¯à®•à¯à®•à®¿à®¯ தலைமà¯à®±à¯ˆ இயகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</translation>
+ <translation type="unfinished">HD à®®à¯à®•à¯à®•à®¿à®¯ தலைமà¯à®±à¯ˆ &lt;b&gt;இயகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯&lt;/b&gt;</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">HD à®®à¯à®•à¯à®•à®¿à®¯ தலைமà¯à®±à¯ˆ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯</translation>
+ <translation type="unfinished">HD à®®à¯à®•à¯à®•à®¿à®¯ தலைமà¯à®±à¯ˆ &lt;b&gt;à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</translation>
+ <translation type="unfinished">தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை &lt;b&gt;à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯&lt;/b&gt;</translation>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">Wallet கà¯à®±à®¿à®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ தறà¯à®ªà¯‹à®¤à¯ திறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</translation>
+ <translation type="unfinished">Wallet &lt;b&gt;கà¯à®±à®¿à®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯&lt;/b&gt; தறà¯à®ªà¯‹à®¤à¯ &lt;b&gt;திறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯&lt;/b&gt;</translation>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">Wallet கà¯à®±à®¿à®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ தறà¯à®ªà¯‹à®¤à¯ பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯</translation>
+ <translation type="unfinished">Wallet &lt;b&gt;கà¯à®±à®¿à®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯&lt;/b&gt; தறà¯à®ªà¯‹à®¤à¯ &lt;b&gt;பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -833,10 +833,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">வாலட௠திறதà¯à®¤à®²à¯ எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ வாலடà¯</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">வாலடà¯à®Ÿà¯ˆ திற</translation>
@@ -1788,6 +1784,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">நெடà¯à®µà¯Šà®°à¯à®•à¯ செயலà¯à®ªà®¾à®Ÿà¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">யாரà¯à®®à¯</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">எநà¯à®¤ பணமà¯à®®à¯ இலà¯à®²à®¾à®®à®²à¯ கடà¯à®Ÿà®³à¯ˆà®¯à¯ˆ நிறைவேறà¯à®±à¯à®®à¯</translation>
</message>
@@ -1844,7 +1844,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">பணம௠செலà¯à®¤à¯à®¤ வேணà¯à®Ÿà¯à®®à¯†à®©à®¿à®²à¯ இநà¯à®¤ படிவதà¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯. அனைதà¯à®¤à¯ தà¯à®±à¯ˆà®•à®³à¯ விரà¯à®ªà¯à®ªà®®à®¾à®©à®µà¯ˆ.</translation>
+ <translation type="unfinished">பணம௠செலà¯à®¤à¯à®¤ வேணà¯à®Ÿà¯à®®à¯†à®©à®¿à®²à¯ இநà¯à®¤ படிவதà¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯. அனைதà¯à®¤à¯ தà¯à®±à¯ˆà®•à®³à¯ &lt;b&gt;விரà¯à®ªà¯à®ªà®®à®¾à®©à®µà¯ˆ&lt;/b&gt;.</translation>
</message>
<message>
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
@@ -2157,6 +2157,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">தொகை உஙà¯à®•à®³à¯ இரà¯à®ªà¯à®ªà¯ˆà®¯à¯ˆà®µà®¿à®Ÿ அதிகமாக உளà¯à®³à®¤à¯.</translation>
</message>
<message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">%1 பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®•à¯ கடà¯à®Ÿà®£à®®à¯ சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯à®ªà¯‹à®¤à¯ மொதà¯à®¤ தொகை உஙà¯à®•à®³à¯ மீதம௠உளà¯à®³ தொகையை மீறà¯à®•à®¿à®±à®¤à¯.</translation>
+ </message>
+ <message>
<source>Duplicate address found: addresses should only be used once each.</source>
<translation type="unfinished">நகல௠மà¯à®•à®µà®°à®¿ காணபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯: à®®à¯à®•à®µà®°à®¿à®•à®³à¯ ஒவà¯à®µà¯Šà®©à¯à®±à¯à®®à¯ ஒர௠மà¯à®±à¯ˆ மடà¯à®Ÿà¯à®®à¯‡ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿ வேணà¯à®Ÿà¯à®®à¯.</translation>
</message>
@@ -2164,6 +2168,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Transaction creation failed!</source>
<translation type="unfinished">பரிவரà¯à®¤à¯à®¤à®©à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®®à¯ தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯!</translation>
</message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation type="unfinished">எநà¯à®¤ ஒர௠கடà¯à®Ÿà®£à®®à¯ %1 ஠விட அதிகமாக இரà¯à®¨à¯à®¤à®¾à®²à¯ அத௠அபதà¯à®¤à®®à®¾à®© உயர௠கடà¯à®Ÿà®£à®®à®¾à®• கரà¯à®¤à®ªà¯à®ªà®Ÿà¯à®®à¯.</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -2265,10 +2273,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;செயà¯à®¤à®¿à®¯à¯ˆ கையொபà¯à®ªà®®à®¿à®Ÿà¯à®™à¯à®•à®³à¯</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">மறà¯à®±à®µà®°à¯à®•à®³à¯à®•à¯à®•à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿ பிடà¯à®•à®¾à®¯à®¿à®©à¯à®•à®³à¯ˆà®ªà¯ நீஙà¯à®•à®³à¯ பெறலாம௠எனà¯à®ªà®¤à¯ˆ நிரூபிகà¯à®• உஙà¯à®•à®³à¯ à®®à¯à®•à®µà®°à®¿à®•à®³à¯à®Ÿà®©à¯ செயà¯à®¤à®¿à®•à®³à¯ / ஒபà¯à®ªà®¨à¯à®¤à®™à¯à®•à®³à®¿à®²à¯ கையொபà¯à®ªà®®à®¿à®Ÿà®²à®¾à®®à¯. தெளிவறà¯à®± அலà¯à®²à®¤à¯ சீரறà¯à®± எதையà¯à®®à¯ கையொபà¯à®ªà®®à®¿à®Ÿà®¾à®®à®²à¯ கவனமாக இரà¯à®™à¯à®•à®³à¯, à®à®©à¯†à®©à®¿à®²à¯ ஃபிஷிங௠தாகà¯à®•à¯à®¤à®²à¯à®•à®³à¯ உஙà¯à®•à®³à¯ அடையாளதà¯à®¤à¯ˆ அவரà¯à®•à®³à®¿à®Ÿà®®à¯ கையொபà¯à®ªà®®à®¿à®Ÿà¯à®Ÿà¯ à®à®®à®¾à®±à¯à®± à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à¯à®®à¯. நீஙà¯à®•à®³à¯ ஒபà¯à®ªà¯à®•à¯à®•à¯Šà®³à¯à®³à¯à®®à¯ à®®à¯à®´à¯à®®à¯ˆà®¯à®¾à®© மறà¯à®±à¯à®®à¯ விரிவான அறிகà¯à®•à¯ˆà®•à®³à®¿à®²à¯ மடà¯à®Ÿà¯à®®à¯‡ கையொபà¯à®ªà®®à®¿à®Ÿà¯à®™à¯à®•à®³à¯.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">செயà¯à®¤à®¿à®¯à¯ˆ கையொபà¯à®ªà®®à®¿à®Ÿ பிடà¯à®•à®¾à®¯à®¿à®©à¯ à®®à¯à®•à®µà®°à®¿</translation>
</message>
@@ -2345,10 +2349,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">à®®à¯à®•à®µà®°à®¿à®¯à¯ˆà®šà¯ சரிபாரà¯à®¤à¯à®¤à¯ மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®µà¯à®®à¯.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">உளà¯à®³à®¿à®Ÿà¯à®Ÿ à®®à¯à®•à®µà®°à®¿ எநà¯à®¤ ஒர௠கீயை கà¯à®±à®¿à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">வாலட௠திறதà¯à®¤à®²à¯ ரதà¯à®¤à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.</translation>
</message>
@@ -2552,7 +2552,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>This pane shows a detailed description of the transaction</source>
<translation type="unfinished">இநà¯à®¤ பலகம௠பரிவரà¯à®¤à¯à®¤à®©à¯ˆ பறà¯à®±à®¿à®¯ விரிவான விளகà¯à®•à®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•à®¿à®±à®¤à¯</translation>
</message>
- </context>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">%1 கà¯à®•à®¾à®© விவரஙà¯à®•à®³à¯</translation>
+ </message>
+</context>
<context>
<name>TransactionTableModel</name>
<message>
@@ -2580,10 +2584,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•à®¿à®±à®¤à¯ (%1 ன௠%2 பரிநà¯à®¤à¯à®°à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯à®•à®²à¯)</translation>
</message>
<message>
+ <source>Confirmed (%1 confirmations)</source>
+ <translation type="unfinished">உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ (%1 உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯à®•à®³à¯)</translation>
+ </message>
+ <message>
<source>Conflicted</source>
<translation type="unfinished">à®®à¯à®°à®£à¯à®ªà®¾à®Ÿà¯</translation>
</message>
<message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">à®®à¯à®¤à®¿à®°à¯à®šà¯à®šà®¿à®¯à®Ÿà¯ˆà®¯à®µà®¿à®²à¯à®²à¯ˆ (%1 உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯à®•à®³à¯,%2 கà¯à®•à¯à®ªà¯ பிறக௠கிடைகà¯à®•à¯à®®à¯)</translation>
+ </message>
+ <message>
<source>Generated but not accepted</source>
<translation type="unfinished">உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ ஆனால௠à®à®±à¯à®±à¯à®•à¯à®•à¯Šà®³à¯à®³à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ</translation>
</message>
@@ -2810,11 +2822,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Could not commit transaction</source>
<translation type="unfinished">பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®¯à¯ˆ கமிட௠செயà¯à®¯ à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ வாலடà¯</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2865,10 +2873,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">எமà¯à®à®Ÿà®¿ சாபà¯à®Ÿà¯à®µà¯‡à®°à¯ விதிமà¯à®±à¯ˆà®•à®³à®¿à®©à¯ கீழ௠பகிரà¯à®¨à¯à®¤à®³à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯, அதனà¯à®Ÿà®©à¯ கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³ %s அலà¯à®²à®¤à¯ %s பைல௠஠பாரà¯à®•à¯à®•à®µà¯à®®à¯</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">உஙà¯à®•à®³à¯ கணினியின௠தேதி மறà¯à®±à¯à®®à¯ நேரம௠சரியாக உளà¯à®³à®¤à®¾ எனà¯à®ªà®¤à®©à¯ˆ சரிபாரà¯à®•à¯à®•à®µà¯à®®à¯! உஙà¯à®•à®³à¯ கடிகாரம௠தவறாக இரà¯à®¨à¯à®¤à®¾à®²à¯, %s சரியாக இயஙà¯à®•à®¾à®¤à¯.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">%s பயனà¯à®³à¯à®³à®¤à®¾à®• இரà¯à®¨à¯à®¤à®¾à®²à¯ தயவà¯à®šà¯†à®¯à¯à®¤à¯ பஙà¯à®•à®³à®¿à®¯à¯à®™à¯à®•à®³à¯. இநà¯à®¤ சாஃடà¯à®µà¯‡à®°à¯ பறà¯à®±à®¿à®¯ கூடà¯à®¤à®²à¯ தகவலà¯à®•à¯à®•à¯ %s à®à®ªà¯ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà®µà¯à®®à¯.</translation>
</message>
@@ -3009,6 +3013,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">-%s=&lt;amount&gt;: '%s' கான தவறான தொகை</translation>
</message>
<message>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation type="unfinished">-அனà¯à®®à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿ தவறான நெடà¯à®®à®¾à®¸à¯à®•à¯: '%s'</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation type="unfinished">போதà¯à®®à®¾à®© ஃபைல௠டிஸà¯à®•à®¿à®°à®¿à®ªà¯à®Ÿà®¾à®°à¯ கிடைகà¯à®•à®µà®¿à®²à¯à®²à¯ˆ.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_te.ts b/src/qt/locale/bitcoin_te.ts
index e30f9bebf5..28fabe2339 100644
--- a/src/qt/locale/bitcoin_te.ts
+++ b/src/qt/locale/bitcoin_te.ts
@@ -172,6 +172,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">వాలెటౠకోసం à°•à±à°°à±Šà°¤à±à°¤ పాసà±â€Œà°«à±à°°à±‡à°œà±â€Œà°¨à°¿ నమోదౠచేయండి.&lt;br/&gt; దయచేసి &lt;b&gt;పది లేదా అంతకంటే à°Žà°•à±à°•à±à°µ యాదృచà±à°›à°¿à°• à°…à°•à±à°·à°°à°¾à°²&lt;/b&gt; పాసà±â€Œà°«à±à°°à±‡à°œà±â€Œà°¨à°¿ లేదా &lt;b&gt;ఎనిమిది లేదా అంతకంటే à°Žà°•à±à°•à±à°µ పదాలనౠఉపయోగించండి.&lt;/b&gt;</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">కొనసాగించà±</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">మీ వాలెటà±â€Œà°¨à± à°—à±à°ªà±à°¤à±€à°•à°°à°¿à°‚à°šà°¡à°‚ వలà±à°² మీ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±â€Œà°•à± హాని కలిగించే మాలà±à°µà±‡à°°à± దొంగిలించకà±à°‚à°¡à°¾ మీ బిటà±â€Œà°•à°¾à°¯à°¿à°¨à±â€Œà°²à°¨à± పూరà±à°¤à°¿à°—à°¾ à°°à°•à±à°·à°¿à°‚చలేమని à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹à°‚à°¡à°¿.</translation>
</message>
@@ -379,7 +383,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n సంవతà±à°¸à°°à°‚(à°²à±)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">డిఫాలà±à°Ÿà± వాలెటà±</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -473,7 +481,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;వాలెటà±â€Œà°¨à°¿ à°Žà°¨à±â€Œà°•à±à°°à°¿à°ªà±à°Ÿà± చేయండి...</translation>
+ <translation type="unfinished">&amp;వాలెటà±â€Œà°¨à°¿ à°—à±à°ªà±à°¤à±€à°•à°°à°¿à°‚à°šà±...</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -578,8 +586,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>లావాదేవీ à°šà°°à°¿à°¤à±à°° యొకà±à°• %n à°¬à±à°²à°¾à°•à±(à°²à±) à°ªà±à°°à°¾à°¸à±†à°¸à± చేయబడింది.</numerusform>
- <numerusform>లావాదేవీ à°šà°°à°¿à°¤à±à°° యొకà±à°• %n à°¬à±à°²à°¾à°•à±(à°²à±) à°ªà±à°°à°¾à°¸à±†à°¸à± చేయబడింది.</numerusform>
+ <numerusform>లావాదేవీ %n à°šà°°à°¿à°¤à±à°° యొకà±à°• à°ªà±à°°à°¾à°¸à±†à°¸à± చేయబడిన à°¬à±à°²à°¾à°•à±(à°²à±).</numerusform>
+ <numerusform>లావాదేవీ %n à°šà°°à°¿à°¤à±à°° యొకà±à°• à°ªà±à°°à°¾à°¸à±†à°¸à± చేయబడిన à°¬à±à°²à°¾à°•à±(à°²à±).</numerusform>
</translation>
</message>
<message>
@@ -685,10 +693,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ఓవరà±â€Œà°µà±à°¯à±‚ à°Ÿà±à°¯à°¾à°¬à±â€Œà°²à±‹à°¨à°¿ విలà±à°µà°²à°¨à± à°•à°ªà±à°ªà°¿à°ªà±à°šà±à°šà°¡à°‚ చేయండి</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">డిఫాలà±à°Ÿà± వాలెటà±</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">వాలెటà±à°²à± à°…à°‚à°¦à±à°¬à°¾à°Ÿà±à°²à±‹ లేవà±</translation>
</message>
@@ -734,7 +738,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">S&amp;ఎలా</translation>
+ <translation type="unfinished">&amp;చూపించà±</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -1040,10 +1044,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ఓపెనౠవాలెటౠహెచà±à°šà°°à°¿à°•</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">డిఫాలà±à°Ÿà± వాలెటà±</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">వాలెటౠతెరవండి</translation>
@@ -2136,6 +2136,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;కాపీ à°šà°¿à°°à±à°¨à°¾à°®à°¾</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">à°à°¦à±€ లేదà±</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">à°•à±</translation>
</message>
@@ -2494,13 +2498,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">డిఫాలà±à°Ÿà± వాలెటà±</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
@@ -2611,10 +2608,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">లావాదేవీ చాలా పెదà±à°¦à°¦à°¿</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">-maxsigcacheize కోసం మెమరీని కేటాయించడం సాధà±à°¯à°‚ కాలేదà±: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">బైండౠచేయడం సాధà±à°¯à°ªà°¡à°²à±‡à°¦à± %s à°ˆ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±â€Œà°²à±‹ (బైండౠరిటరà±à°¨à± à°Žà°°à±à°°à°°à± %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_th.ts b/src/qt/locale/bitcoin_th.ts
new file mode 100644
index 0000000000..464e39cbac
--- /dev/null
+++ b/src/qt/locale/bitcoin_th.ts
@@ -0,0 +1,340 @@
+<TS version="2.1" language="th">
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">ย้อนà¸à¸¥à¸±à¸š</translation>
+ </message>
+ </context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 ยังไม่ออà¸à¸­à¸¢à¹ˆà¸²à¸‡à¸›à¸¥à¸­à¸”ภัย...</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n second(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n minute(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n hour(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n day(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n week(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n year(s)</numerusform>
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">เปลี่ยนรหัสผ่านที่ใช้สำหรับà¸à¸²à¸£à¹€à¸‚้ารหัสà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">เข้ารหัสà¸à¸¸à¸à¹à¸ˆà¸ªà¹ˆà¸§à¸™à¸•à¸±à¸§à¸—ี่เป็นของà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์ของคุณ</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">เซ็นชื่อด้วยข้อความ ที่เà¸à¹‡à¸š Bitcoin เพื่อà¹à¸ªà¸”งว่าท่านเป็นเจ้าของ bitcoin นี้จริง</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">ตรวจสอบ ข้อความ เพื่อให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸² à¸à¸²à¸£à¹€à¸‹à¹‡à¸™à¸•à¹Œà¸Šà¸·à¹ˆà¸­ ด้วยที่เà¸à¹‡à¸š Bitcoin à¹à¸¥à¹‰à¸§</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;ไฟล์</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;ช่วยเหลือ</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">à¹à¸–บเครื่องมือà¹à¸—็บ</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">à¸à¸³à¸¥à¸±à¸‡à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­ ไปยัง peers…</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">ขอà¸à¸²à¸£à¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™ (สร้างรหัส QR à¹à¸¥à¸° bitcoin: URIs)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation type="unfinished">à¹à¸ªà¸”งรายà¸à¸²à¸£à¸—ี่ใช้ในà¸à¸²à¸£à¸ªà¹ˆà¸‡à¹à¸­à¸”เดรสà¹à¸¥à¸°à¹€à¸¥à¹€à¸šà¸¥à¸—ี่ใช้à¹à¸¥à¹‰à¸§</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation type="unfinished">à¹à¸ªà¸”งรายà¸à¸²à¸£à¸—ี่ได้ใช้ในà¸à¸²à¸£à¸£à¸±à¸šà¹à¸­à¸”เดรสà¹à¸¥à¸°à¹€à¸¥à¹€à¸šà¸¥</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp;ตัวเลือภCommand-line</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform>ประมวลผล %n บล็อà¸à¸‚องประวัติà¸à¸²à¸£à¸—ำธุรà¸à¸£à¸£à¸¡</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1 เบื้องหลัง</translation>
+ </message>
+ <message>
+ <source>Catching up…</source>
+ <translation type="unfinished">à¸à¸³à¸¥à¸±à¸‡à¸•à¸´à¸”ตามถึงรายà¸à¸²à¸£à¸¥à¹ˆà¸²à¸ªà¸¸à¸”…</translation>
+ </message>
+ <message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation type="unfinished">บล็อà¸à¸—ี่ได้รับล่าสุดถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นเมื่อ %1 ที่à¹à¸¥à¹‰à¸§</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">ธุรà¸à¸£à¸£à¸¡à¸«à¸¥à¸±à¸‡à¸ˆà¸²à¸à¸™à¸µà¹‰à¸ˆà¸°à¸¢à¸±à¸‡à¹„ม่ปราà¸à¸à¹ƒà¸«à¹‰à¹€à¸«à¹‡à¸™</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">ข้อผิดพลาด</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">คำเตือน</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">ข้อมูล</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">ปัจจุบัน</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">โหลด PSBT จาà¸à¸„ลิปบอร์ด...</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">หน้าต่างโหนด</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">&amp;ที่อยู่à¸à¸²à¸£à¸ªà¹ˆà¸‡</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">&amp;ที่อยู่à¸à¸²à¸£à¸£à¸±à¸š</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">เปิดà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">เปิดà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">ปิดà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์</translation>
+ </message>
+ <message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">à¸à¸¹à¹‰à¸„ืนวอลเล็ต…</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">à¸à¸¹à¹‰à¸„ืนวอลเล็ตจาà¸à¹„ฟล์สำรองข้อมูล</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">ปิด วอลเล็ต ทั้งหมด</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">&amp;ค่ามาสà¸à¹Œ</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">โหลดสำรองข้อมูลวอลเล็ต</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¸”ูà¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•à¸´à¸¡</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">L&amp;ock ที่ไม่ได้ใข้</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">&amp;ปลดล็อค ที่ไม่ไดใช้</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(ไม่มีเลเบล)</translation>
+ </message>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation type="unfinished">เปลี่ยน จาภ%1 (%2)</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(เปลี่ยน)</translation>
+ </message>
+</context>
+<context>
+ <name>CreateWalletActivity</name>
+ <message>
+ <source>Create Wallet</source>
+ <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
+ <translation type="unfinished">สร้าง วอลเล็ต</translation>
+ </message>
+ <message>
+ <source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
+ <translation type="unfinished">à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡ วอลเล็ต &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>Create wallet failed</source>
+ <translation type="unfinished">à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ วอลเล็ต ล้มเหลว</translation>
+ </message>
+ <message>
+ <source>Create wallet warning</source>
+ <translation type="unfinished">คำเตือน à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ วอลเล็ต</translation>
+ </message>
+ <message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">ไม่สามารถ จัดรายà¸à¸²à¸£ ผู้เซ็น</translation>
+ </message>
+ </context>
+<context>
+ <name>LoadWalletsActivity</name>
+ <message>
+ <source>Load Wallets</source>
+ <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
+ <translation type="unfinished">โหลด วอลเล็ต</translation>
+ </message>
+ <message>
+ <source>Loading wallets…</source>
+ <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
+ <translation type="unfinished">à¸à¸³à¸¥à¸±à¸‡à¹‚หลด วอลเล็ต...</translation>
+ </message>
+</context>
+<context>
+ <name>Intro</name>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform>%n GB of space available</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform>(of %n GB needed)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">หน้าต่างโหนด</translation>
+ </message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(ไม่มีเลเบล)</translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(ไม่มีเลเบล)</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDesc</name>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform>matures in %n more block(s)</numerusform>
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(ไม่มีเลเบล)</translation>
+ </message>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_tk.ts b/src/qt/locale/bitcoin_tk.ts
index 0afd01fd71..7a0a69513f 100644
--- a/src/qt/locale/bitcoin_tk.ts
+++ b/src/qt/locale/bitcoin_tk.ts
@@ -176,6 +176,10 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gapjyk üçin öňki we täze parol sözlemiňi ýaz.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Dowam et</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Gapjygyňy şifrlemek kompýuteriňe zyýanly programma ýokuşmak arkaly bitkoinleriň ogurlanmagyndan doly gorap bilmejekdigini ýatdan çykarma.</translation>
</message>
@@ -399,7 +403,11 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<numerusform>%n ýyl</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">deslapky bellenen gapjyk</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -636,7 +644,7 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Bölekleýýin gol çekilen bitkoin amalyny (BGÇBA) ýükle</translation>
+ <translation type="unfinished">Bölekleýýin gol çekilen bitkoin geleşigini ýükle</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -644,7 +652,7 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Bölekleýin gol çekilen bitkoin amalyny alyş-çalyş panelinden ýükle</translation>
+ <translation type="unfinished">Bölekleýin gol çekilen bitkoin geleşigini alyş-çalyş panelinden ýükle</translation>
</message>
<message>
<source>Node window</source>
@@ -705,10 +713,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gözden geçir bölüminde sanlaryň üstüni ört</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">deslapky bellenen gapjyk</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Elýeterli gapjyk ýok</translation>
</message>
@@ -1060,10 +1064,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gapjyk açmak duýduryşy</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">deslapky bellenen gapjyk</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Gapjygy aç</translation>
@@ -2326,6 +2326,10 @@ Size bu ýalňyşlyk gelýän bolsa, siz täjirden BIP21-e gabat gelýän URI-ni
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">&amp;Salgyny göçür</translation>
</message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">ýok</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -2582,13 +2586,6 @@ Size bu ýalňyşlyk gelýän bolsa, siz täjirden BIP21-e gabat gelýän URI-ni
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">deslapky bellenen gapjyk</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_tl.ts b/src/qt/locale/bitcoin_tl.ts
index aaa9d64ccd..b042fb8ea9 100644
--- a/src/qt/locale/bitcoin_tl.ts
+++ b/src/qt/locale/bitcoin_tl.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">pindutin lamang ang kanang pindutan upang i-edit ang address o label</translation>
+ <translation type="unfinished">pindutin lamang ang kanang pindutan upang i-edit ang address o label.</translation>
</message>
<message>
<source>Create a new address</source>
@@ -23,7 +23,7 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">Isara</translation>
+ <translation type="unfinished">(Do you mean: Close?) :isara, sarado </translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -55,7 +55,7 @@
</message>
<message>
<source>C&amp;hoose</source>
- <translation type="unfinished">&amp;Pumili</translation>
+ <translation type="unfinished">(do you mean: CHOOSE?) ;Pumili,Piliin.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
@@ -319,7 +319,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">pitaka na ♦default♦</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -359,6 +363,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Patungkol sa &amp;♦Qt♦</translation>
</message>
<message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">Ipakita ang impormasyon tungkol sa Qt</translation>
+ </message>
+ <message>
<source>Modify configuration options for %1</source>
<translation type="unfinished">Baguhin ang mga pagpipilian sa ♦configuration♦ para sa 1%1</translation>
</message>
@@ -405,7 +413,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;I-encrypt ang pitaka</translation>
+ <translation type="unfinished">&amp;I-encrypt ang Pitaka</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -603,10 +611,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">I-mask ang mga halaga sa loob ng ♦Overview tab♦</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">pitaka na ♦default♦</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Walang pitaka na mayroon</translation>
</message>
@@ -914,10 +918,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Babala sa pagbukas ng pitaka</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">pitaka na ♦default♦</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Buksan ang pitaka</translation>
@@ -1444,13 +1444,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">pitaka na ♦default♦</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts
index 7f90dd22de..569a7c27be 100644
--- a/src/qt/locale/bitcoin_tr.ts
+++ b/src/qt/locale/bitcoin_tr.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Adresi veya etiketi düzenlemek için sağ tıklayın</translation>
+ <translation type="unfinished">Sağ tık ile adres ve etiket düzenle</translation>
</message>
<message>
<source>Create a new address</source>
@@ -185,6 +185,14 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdanınızın eski ve yeni parolasını giriniz.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Devam</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Geri</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Cüzdanınızı şifrelemenin bilgisayarınıza bulaşan kötü amaçlı yazılımlar tarafından bitcoinlerinizin çalınmasına karşı tamamen koruyamayacağını unutmayın.</translation>
</message>
@@ -225,6 +233,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdan parolasının kaldırılması için girilen parola yanlış.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Cüzdan parolası başarılı bir şekilde değiştirildi</translation>
</message>
@@ -259,10 +271,18 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Sızıntı istisnası</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Önemli bir hata oluştu. %1 artık güvenli bir şekilde devam edemeyecek ve çıkacak.</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">İç hata</translation>
</message>
- </context>
+ <message>
+ <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
+ <translation type="unfinished">Bir iç hata oluştu. %1 güvenli bir şekilde devam etmeye çalışacak. Bu, aşağıda açıklandığı gibi rapor edilebilecek beklenmedik bir hatadır.</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -288,6 +308,18 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">bilinmeyen</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">YerleÅŸtir "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Varsayılan sistem fontu "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Özel…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Mitar</translation>
</message>
@@ -380,7 +412,11 @@ Cüzdan kilidini aç.</translation>
<numerusform>%n yıl</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">varsayılan cüzdan</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -677,10 +713,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Genel Bakış sekmesindeki değerleri maskeleyin</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">varsayılan cüzdan</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Erişilebilir cüzdan yok</translation>
</message>
@@ -741,11 +773,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">daha fazla seçenek için tıklayın.</translation>
</message>
<message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">Eşler sekmesini göster</translation>
- </message>
- <message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
<translation type="unfinished">Ağ etkinliğini devre dışı bırak</translation>
@@ -764,6 +791,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdan oluşturulurken hata meydana geldi</translation>
</message>
<message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Yeni cüzdan oluşturulamıyor, yazılım SQLite desteği olmadan derlenmiş (descriptor cüzdanlar için gereklidir).</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Hata: %1</translation>
</message>
@@ -817,11 +848,11 @@ Cüzdan kilidini aç.</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">HD anahtar üreticiler kullanilabilir</translation>
+ <translation type="unfinished">HD anahtar üreticiler &lt;b&gt;kullanilabilir&lt;/b&gt;</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">HD anahtar üreticiler kullanılamaz</translation>
+ <translation type="unfinished">HD anahtar üreticiler &lt;b&gt;kullanılamaz&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -829,11 +860,11 @@ Cüzdan kilidini aç.</translation>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">Cüzdan &lt;b&gt;şifrelenmiş&lt;/b&gt; ve şu anda &lt;b&gt;kilitli değil</translation>
+ <translation type="unfinished">Cüzdan &lt;b&gt;şifrelenmiş&lt;/b&gt; ve şu anda &lt;b&gt;kilitli değil&lt;/b&gt;</translation>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">Cüzdan &lt;b&gt;şifrelenmiş&lt;/b&gt; ve şu anda &lt;b&gt;kilitlidir</translation>
+ <translation type="unfinished">Cüzdan &lt;b&gt;şifrelenmiş&lt;/b&gt; ve şu anda &lt;b&gt;kilitlidir&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -991,10 +1022,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdan oluşturma uyarısı</translation>
</message>
<message>
- <source>Can't list signers</source>
- <translation type="unfinished">Ä°mzalayanlar listelenmiyor</translation>
- </message>
- <message>
<source>Too many external signers found</source>
<translation type="unfinished">Çok fazla harici imzalayan bulundu</translation>
</message>
@@ -1023,6 +1050,18 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdanı taşımak istediğine emin misin &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
<message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Cüzdanı taşımak, bu cüzdanı bir veya daha fazla descriptor cüzdana dönüştürecektir. Yeni bir cüzdan yedeği oluşturulması gerekecektir.
+Eğer bu cüzdan yalnızca izlenen scriptler içeriyorsa, bu scriptleri içeren yeni bir cüzdan oluşturulacaktır.
+Eğer bu cüzdan çözülebilir ama izlenmeyen scriptler içeriyorsa, bu scriptleri içeren farklı ve yeni bir cüzdan oluşturulacaktır.
+
+Taşıma işlemi, taşıma işleminden önce cüzdanın bir yedeğini oluşturacaktır. Bu yedek dosya &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak olarak adlandırılacak ve bu cüzdanın bulunduğu dizinde bulunacaktır. Yanlış bir taşıma durumunda, yedek "Cüzdanı Geri Yükle" işlevi ile geri yüklenebilir.</translation>
+ </message>
+ <message>
<source>Migrate Wallet</source>
<translation type="unfinished">Cüzdanı Taşı</translation>
</message>
@@ -1035,8 +1074,16 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdan '%1' başarıyla taşındı.</translation>
</message>
<message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Yalnızca izlenen scriptler yeni bir cüzdana taşındı, adı '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Çözülebilir ama izlenmeyen scriptler yeni bir cüzdana taşındı, adı '%1'.</translation>
+ </message>
+ <message>
<source>Migration failed</source>
- <translation type="unfinished">Taşıma başarısız oldu.</translation>
+ <translation type="unfinished">Taşıma başarısız oldu</translation>
</message>
<message>
<source>Migration Successful</source>
@@ -1054,10 +1101,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Açık cüzdan uyarısı</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">varsayılan cüzdan</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Cüzdanı Aç</translation>
@@ -1460,6 +1503,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Pencere kapatıldığında uygulamadan çıkmak yerine uygulamayı küçültür. Bu seçenek etkinleştirildiğinde, uygulama sadece menüden çıkış seçildiğinde kapanacaktır.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Genel Bakış sekmesindeki yazı tipi:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Bu iletişim kutusundan ayarlanan seçenekler komut satırı tarafından geçersiz kılınır:</translation>
</message>
@@ -1863,6 +1910,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">PSBT diske kaydedildi.</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Gönderiler %1 ile %2</translation>
+ </message>
+ <message>
<source>own address</source>
<translation type="unfinished">kendi adresiniz</translation>
</message>
@@ -2205,6 +2256,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Yön/Tür</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">BIP324 oturum kimliği ID dizesi onaltılık ( hex ) biçimde</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Bu çiftin bağlı olduğu internet protokolü : IPv4, IPv6, Onion, I2P, ya da CJDNS.</translation>
</message>
@@ -2338,10 +2393,18 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ağ etkinliği devre dışı bırakıldı</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">BoÅŸ</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Komut cüzdan olmadan çalıştırılıyor.</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">BaÄŸlanan pencere - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Komut "%1" cüzdanı kullanılarak çalıştırılıyor.</translation>
</message>
@@ -2719,6 +2782,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">veya</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 Cüzdandan '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Bu iÅŸlemi oluÅŸturmak ister misiniz?</translation>
@@ -2738,6 +2805,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">İşlem ücreti</translation>
</message>
<message>
+ <source>Total Amount</source>
+ <translation type="unfinished">Toplam Tutar</translation>
+ </message>
+ <message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
@@ -2883,8 +2954,8 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ä°leti &amp;imzala</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Adreslerinize yollanan bitcoinleri alabileceğiniz ispatlamak için adreslerinizle iletiler/anlaşmalar imzalayabilirsiniz. Oltalama saldırılarının kimliğinizi imzanızla elde etmeyi deneyebilecekleri için belirsiz ya da rastgele hiçbir şey imzalamamaya dikkat ediniz. Sadece ayrıntılı açıklaması olan ve tümüne katıldığınız ifadeleri imzalayınız.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Eski (P2PKH) adreslerinizle mesajları/anlaşmaları imzalayarak bu adreslere gönderilen Bitcoin'leri alabileceğinizi unutmayın. Belirsiz veya rastgele şeyleri imzalamaktan kaçının, çünkü kimlik bilgilerinizi çalmak isteyen oltalama saldırıları sizi kandırmaya çalışabilir. Sadece tamamen ayrıntılı ve onayladığınız beyanları imzalayın.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -2967,8 +3038,8 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Lütfen adresi kontrol edip tekrar deneyiniz.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Girilen adres herhangi bir anahtara iÅŸaret etmemektedir.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">Girilen adres, eski (P2PKH) bir anahtarı belirtmiyor. Bu sürümde SegWit ve diğer P2PKH olmayan %1 versiyon adres türleri için mesajla imzalama desteklenmiyor. Lütfen adresi kontrol edin ve tekrar deneyin.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3153,6 +3224,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Çıktı indeksi</translation>
</message>
<message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Sertifika doğrulanmadı)</translation>
+ </message>
+ <message>
<source>Merchant</source>
<translation type="unfinished">Tüccar</translation>
</message>
@@ -3471,9 +3546,8 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">PSBT kopyalandı</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Panoya kopyalandı</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Ücret artırma PSBT'si panoya kopyalandı</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3484,10 +3558,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Alışveriş taahüt edilemedi.</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">varsayılan cüzdan</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">imzalayıcı hatası</translation>
</message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3535,6 +3609,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">%s geliÅŸtiricileri</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s -assumeutxo anlık görüntü durumunu doğrulamada başarısız oldu. Bu, bir donanım sorunu, yazılımda bir hata veya geçersiz bir anlık görüntünün yüklenmesine izin veren kötü bir yazılım değişikliği olduğunu gösterir. Bu nedenle, düğüm kapanacak ve anlık görüntüye dayanan herhangi bir durumu kullanmayı bırakacak, zincir yüksekliğini %d'den %d'e sıfırlayacaktır. Bir sonraki yeniden başlatmada, düğüm herhangi bir anlık görüntü verisi kullanmadan %d'den senkronizasyona devam edecektir. Bu olayı %s'ye bildiriniz ve anlık görüntüyü nasıl elde ettiğinizi de ekleyiniz. Geçersiz anlık görüntü zincir durumu, bu hatanın nedenini teşhis etmekte yardımcı olabilir diye diskte bırakılacaktır.</translation>
+ </message>
+ <message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
<translation type="unfinished">%s veri dizininde kilit elde edilemedi. %s muhtemelen hâlihazırda çalışmaktadır.</translation>
</message>
@@ -3551,10 +3629,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Geçersiz veya bozuk peers.dat (%s). Bunun bir hata olduğunu düşünüyorsanız, lütfen %s'e bildirin. Geçici bir çözüm olarak, bir sonraki başlangıçta yeni bir dosya oluşturmak için dosyayı (%s) yoldan çekebilirsiniz (yeniden adlandırabilir, taşıyabilir veya silebilirsiniz).</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Lütfen bilgisayarınızın tarih ve saatinin doğruluğunu kontrol edin. Hata varsa %s doğru çalışmayacaktır.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">%s programını faydalı buluyorsanız lütfen katkıda bulununuz. Yazılım hakkında daha fazla bilgi için %s adresini ziyaret ediniz.</translation>
</message>
@@ -3571,6 +3645,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Budama: son cüzdan eşleşmesi budanmış verilerin ötesine gitmektedir. -reindex kullanmanız gerekmektedir (Budanmış düğüm ise tüm blok zincirini tekrar indirmeniz gerekir.)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">'%s' -&gt; '%s' yeniden adlandırması başarısız oldu. Bunu, %s geçersiz anlık görüntü dizinini manuel olarak taşıyarak veya silerek çözmelisiniz; aksi takdirde, bir sonraki başlatmada aynı hata ile karşılaşabilirsiniz."</translation>
+ </message>
+ <message>
<source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
<translation type="unfinished">Blok veritabanı gelecekten gibi görünen bir blok içermektedir. Bu, bilgisayarınızın saat ve tarihinin yanlış ayarlanmış olmasından kaynaklanabilir. Blok veritabanını sadece bilgisayarınızın tarih ve saatinin doğru olduğundan eminseniz yeniden derleyin.</translation>
</message>
@@ -3595,6 +3673,30 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ağ sürümü zincirinin toplam boyutu (%i) en yüksek boyutu geçmektedir (%i). Kullanıcı aracı açıklamasının sayısı veya boyutunu azaltınız.</translation>
</message>
<message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">Bilinmeyen cüzdan dosya biçimi “%s†girildi. Lütfen “bdb†veya “sqlite†formatlarından birini girin.</translation>
+ </message>
+ <message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Desteklenmeyen kategoriye özgü günlükleme seviyesi %1$s=%2$s. Beklenen: %1$s=&lt;category&gt;:&lt;loglevel&gt;. Geçerli kategoriler: %3$s. Geçerli günlükleme seviyeleri: %4$s.</translation>
+ </message>
+ <message>
+ <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
+ <translation type="unfinished">Cüzdan başarıyla oluşturuldu. Eski cüzdan türü kullanımdan kaldırılmaktadır ve eski cüzdan oluşturma ve açma desteği gelecekte kaldırılacaktır.</translation>
+ </message>
+ <message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Cüzdan başarıyla yüklendi. Eski cüzdan türü kullanımdan kaldırılacak ve eski cüzdanların oluşturulması ve açılması desteği gelecekte kaldırılacaktır. Eski cüzdanlar, migratewallet komutuyla descriptor cüzdana dönüştürülebilir.</translation>
+ </message>
+ <message>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">Uyarı: Dumpfile cüzdan formatı "%s", komut satırında belirtilen formatla "%s" eşleşmiyor.</translation>
+ </message>
+ <message>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">Uyarı: {%s} cüzdanında özel anahtarlarla devre dışı bırakılmış özel anahtarlar algılandı</translation>
+ </message>
+ <message>
<source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
<translation type="unfinished">Uyarı: Ağ eşlerimizle tamamen anlaşamamışız gibi görünüyor! Güncelleme yapmanız gerekebilir ya da diğer düğümlerin güncelleme yapmaları gerekebilir.</translation>
</message>
@@ -3619,6 +3721,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">-dnsseed false olarak ayarlanırken -forcednsseed true olarak ayarlanamıyor.</translation>
</message>
<message>
+ <source>Cannot set -peerblockfilters without -blockfilterindex.</source>
+ <translation type="unfinished">-blockfilterindex olmadan -peerblockfilters ayarlanamıyor.</translation>
+ </message>
+ <message>
<source>Cannot write to data directory '%s'; check permissions.</source>
<translation type="unfinished">Veriler '%s' klasörüne yazılamıyor ; yetkilendirmeyi kontrol edin.</translation>
</message>
@@ -3631,20 +3737,90 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">%s yüklenirken hata oluştu: Harici imzalayan cüzdanı derlenmiş harici imzalayan desteği olmadan yükleniyor</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Okumada Hata %s! Tüm anahtarlar doğru okundu, ancak işlem verileri veya adres metadata verileri eksik veya hatalı olabilir.</translation>
+ </message>
+ <message>
+ <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Hata: Cüzdandaki adres defteri verilerinin taşınan cüzdanlara ait olduğu tespit edilemiyor</translation>
+ </message>
+ <message>
+ <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
+ <translation type="unfinished">Hata: Geçiş sırasında yinelenen tanımlayıcılar oluşturuldu. Cüzdanınız bozulmuş olabilir.</translation>
+ </message>
+ <message>
+ <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Hata: Cüzdandaki %s işleminin taşınan cüzdanlara ait olduğu tespit edilemiyor</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Ücret artışını hesaplamada başarısız olundu, çünkü onaylanmamış UTXO'lar, devasa bir onaylanmamış işlemler kümesine bağlı.</translation>
+ </message>
+ <message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Anlık görüntü zincir durumu dizini (%s) kaldırılamadı. Yeniden başlatmadan önce manuel olarak silin.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Geçersiz peers.dat dosyası yeniden adlandırılamadı. Lütfen taşıyın veya silin ve tekrar deneyin.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Blok dosyasını diske yazma başarısız oldu. Bu muhtemelen bir G/Ç hatasının sonucudur.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Geri alma dosyasını diske yazma başarısız oldu. Bu muhtemelen bir G/Ç hatasının sonucudur.</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Maksimum işlem ağırlığı, işlem girdi ağırlığından daha küçük olmalıdır.</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Maksimum işlem ağırlığı çok düşük, değişim çıktısını barındıramaz.</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">'%s' -&gt; '%s' yeniden adlandırması başarısız oldu. Arka plan zincir durumu leveldb dizinini temizleyemiyor.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Önceden seçilmiş girişlerin ve cüzdanın otomatik giriş seçiminin kombinasyonu, işlemin maksimum ağırlığını aşıyor. Lütfen daha küçük bir miktar göndermeyi deneyin veya cüzdanınızdaki UTXO'ları manuel olarak birleştirin.</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">Bilgisayarınızın tarihi ve saati, ağla %d dakikadan fazla senkronizasyon görünmüyor; bu başarısız işlem hatasına yol açabilir. Bilgisayarınızın saatini düzenledikten sonra, bu mesaj tekrar görünmemelidir. Düğümünüzü yeniden başlattığınızda mesaj kaybolmalıdır. Yeniden başlatma olmadan, yeterli sayıda yeni çıkış bağlantısı sağladıktan sonra otomatik olarak kaybolmalıdır, bu biraz zaman alabilir. Daha fazla bilgi almak için `getpeerinfo` ve `getnetworkinfo` RPC yöntemlerinin `timeoffset` alanını kontrol edebilirsiniz.</translation>
+ </message>
+ <message>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
Cüzdan yedeği geri yüklenemiyor.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind yalnızca gelen bağlantılar için kullanılabilir ('out' parametresi pas geçildi)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Kritik bir iç hata oluştu, detaylar için debug.log dosyasına bakın:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Verilen blok hash '%s' için AssumeUTXO verisi bulunamadı.</translation>
+ </message>
+ <message>
<source>Copyright (C) %i-%i</source>
<translation type="unfinished">Telif Hakkı (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bozuk bir blok bulundu, bu donanım arızası kaynaklı olabilir.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Bozuk blok veritabanı tespit edildi</translation>
</message>
@@ -3661,6 +3837,14 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Yükleme tamamlandı</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Eliptik eğri kriptografisi sistem sağlığı kontrolü başarısız oldu. %s kapatılıyor.</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Cüzdan verilerinizin silinirken hata. Veri tabanı bağlantı hatası.</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation type="unfinished">Blok veritabanını başlatılırken bir hata meydana geldi</translation>
</message>
@@ -3693,6 +3877,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Veritabanı okuma hatası, program kapatılıyor.</translation>
</message>
<message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Cüzdan verileriniz silinirken hata. Veri tabanı başlatılamadı</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">Hata: Yeni sadece izlenebilir (watchonly) cüzdanı oluşturulamadı</translation>
</message>
@@ -3701,10 +3889,42 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Hata: Bu cüzdan zaten SQLite kullanıyor</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Hata: Cüzdan okunamadı en iyi blok bulucu kaydı </translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Hata: Cüzdana yazılamadı en iyi blok bulucu kaydı </translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Hata: Yalnızca izlenen cüzdanın en iyi blok bulucu kaydını yazmak mümkün değil</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Hata: %s Cüzdan için adres defteri kopyası oluşturulamadı</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Hata: %sCüzdan için veri tabanında işlem yapılamaz</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">En iyi (%s) bloğa bağlanmak başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Bloğun bağlantısı kesilemedi.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Herhangi bir portun dinlenmesi başarısız oldu. Bunu istiyorsanız -listen=0 seçeneğini kullanınız.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Bloğu okuma başarısız oldu.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Başlatma sırasında cüzdanı yeniden tarama işlemi başarısız oldu</translation>
</message>
@@ -3717,6 +3937,26 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Veritabanı doğrulanamadı</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Bloğa yazma başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Blok indeks veri tabanına yazma başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Coin veri tabanına yazma başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Eski verilere yazma başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">işlemi: %s silme başarısız oldu.</translation>
+ </message>
+ <message>
<source>Importing…</source>
<translation type="unfinished">İçe aktarılıyor...</translation>
</message>
@@ -3746,7 +3986,7 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
</message>
<message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">-%s=&lt;tutar&gt; için geçersiz tutar: '%s'</translation>
+ <translation type="unfinished">Geçersiz tutar için -%s=&lt;amount&gt;: '%s'</translation>
</message>
<message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
@@ -3769,6 +4009,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Cüzdan yükleniyor...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Maksimum işlem yükü %d ile %d arasında olmalıdır</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Eksik tutar</translation>
</message>
@@ -3789,6 +4033,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Kafi derecede dosya tanımlayıcıları mevcut değil.</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">'%s' için izin yok. Sadece hedef ayarlandı.</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Budama negatif bir değerle yapılandırılamaz.</translation>
</message>
@@ -3805,6 +4053,18 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Yeniden taranıyor...</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">İmzalayıcı adresi belirtilmedi.</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">İstenmeyen %s adrese imzalama yapıldı.</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">%s İmzayıcı hatası tekrarı.</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">İşlemin imzalanması başarısız oldu</translation>
</message>
@@ -3821,6 +4081,18 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Belirtilen -walletdir "%s" bir dizin deÄŸildir</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Temizleme esnasında sistem hatası: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">%s : Harici blok dosyası yüklenirken sistem hatası.</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">%s Bloğu diske kaydederken sistem hatası oluştu.</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">%s'in kaynak kodu ulaşılabilir.</translation>
</message>
@@ -3833,6 +4105,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Cüzdan en az aktarma ücretinden daha az ödeme yapmaktan sakınacaktır.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Bu adres için bir ScriptPubKeyManager bulunmuyor</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Bu deneysel bir uygulamadır.</translation>
</message>
@@ -3845,6 +4121,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">-paytxfee çok yüksek bir değere ayarlanmış! Bu, işlemi gönderirseniz ödeyeceğiniz işlem ücretidir.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">%s İşlem bu cüzdana ait değil.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">İşlem tutarı çok düşük</translation>
</message>
@@ -3869,10 +4149,6 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">İşlem çok büyük</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">-maxsigcachesize: ' %s' MiB için bellek konumlandırılamıyor.</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Bu bilgisayarda %s ögesine bağlanılamadı (bağlanma %s hatasını verdi)</translation>
</message>
@@ -3909,10 +4185,34 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">-onlynet için bilinmeyen bir ağ belirtildi: '%s'</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Tanınmayan seçenek "%s" sağlanan -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Desteklenmeyen global günlük seviyesi %s=%s. Geçerli değer:%s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">%s Cüzdan dosyaları oluşturulamadı.</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates %s blok zincirinde desteklenmiyor.</translation>
+ </message>
+ <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Desteklenmeyen günlük kategorisi %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Hata: Sadece izleme %s cüzdanı. tx izleme cüzdanına eklenemedi</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Hata: Yalnızca izlenen işlemler silinemedi.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Kullanıcı Aracı açıklaması (%s) güvensiz karakterler içermektedir.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts
index 7679222848..f4c47b46b2 100644
--- a/src/qt/locale/bitcoin_uk.ts
+++ b/src/qt/locale/bitcoin_uk.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Створити нову адреÑу</translation>
+ <translation type="unfinished">Додати нову адреÑÑу</translation>
</message>
<message>
<source>&amp;New</source>
@@ -39,7 +39,7 @@
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;ЕкÑпортувати</translation>
+ <translation type="unfinished">ЕкÑпортувати</translation>
</message>
<message>
<source>&amp;Delete</source>
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Введіть Ñтару та нову парольну фразу Ð´Ð»Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Продовжити</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Ðазад</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Пам’Ñтайте, що ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ Ð½Ðµ може повніÑÑ‚ÑŽ захиÑтити ваші біткоїни від крадіжки, у випадку Ñкщо ваш комп’ютер буде інфіковано шкідливими програмами.</translation>
</message>
@@ -457,6 +465,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">гаманець за замовчуваннÑм</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -559,7 +571,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ…</translation>
+ <translation type="unfinished">&amp;Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -591,15 +603,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Закрити гаманець…</translation>
+ <translation type="unfinished">Закрити Гаманець…</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Створити гаманець…</translation>
+ <translation type="unfinished">Створити Гаманець…</translation>
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">Закрити вÑÑ– гаманці…</translation>
+ <translation type="unfinished">Закрити Ð’ÑÑ– Гаманці…</translation>
</message>
<message>
<source>&amp;File</source>
@@ -619,7 +631,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Триває ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ–Ð² (%1%)…</translation>
+ <translation type="unfinished">Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ–Ð² (%1%)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -651,7 +663,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">Параметри &amp;командного Ñ€Ñдка</translation>
+ <translation type="unfinished">П&amp;араметри командного Ñ€Ñдка</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -695,7 +707,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Завантажити чаÑтково підпиÑану біткоїн-транзакцію (PSBT) з файлу</translation>
+ <translation type="unfinished">Завантажити чаÑтково підпиÑану біткоїн-транзакцію (PSBT)</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -715,11 +727,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">ÐдреÑи Ð´Ð»Ñ &amp;відправленнÑ</translation>
+ <translation type="unfinished">&amp;ÐдреÑи Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">ÐдреÑи Ð´Ð»Ñ &amp;отриманнÑ</translation>
+ <translation type="unfinished">&amp;ÐдреÑи Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
@@ -772,10 +784,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Приховати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð° вкладці ОглÑд</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">гаманець за замовчуваннÑм</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Гаманців немає</translation>
</message>
@@ -1186,10 +1194,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">гаманець за замовчуваннÑм</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Відкрити гаманець</translation>
@@ -2351,6 +2355,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">КількіÑÑ‚ÑŒ підключень</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Локальні адреÑи</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Блокчейн</translation>
</message>
@@ -2399,6 +2407,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Виберіть учаÑника Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду детальнішої інформації</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Приховати відомоÑÑ‚Ñ– про учаÑника</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">ВерÑÑ–Ñ Ñ‚Ñ€Ð°Ð½Ñпортного рівнÑ: %1</translation>
</message>
@@ -2407,10 +2419,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ТраÑпорт</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Ідентифікатор ÑеÑÑ–Ñ— BIP324 у hex форматі, Ñкщо Ñ”.</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">ID ÑеÑÑ–Ñ—</translation>
</message>
@@ -2709,6 +2717,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Мережева активніÑÑ‚ÑŒ вимкнена.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">ВідÑутні</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ без гаманцÑ</translation>
</message>
@@ -3442,10 +3454,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">&amp;ПідпиÑати повідомленнÑ</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Ви можете підпиÑувати повідомленнÑ/угоди Ñвоїми адреÑами, щоб довеÑти можливіÑÑ‚ÑŒ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð±Ñ–Ñ‚ÐºÐ¾Ñ—Ð½Ñ–Ð², що будуть надіÑлані на них. ОÑтерігайтеÑÑ Ð¿Ñ–Ð´Ð¿Ð¸Ñувати будь-що нечітке чи неочікуване, так Ñк за допомогою фішинг-атаки Ð²Ð°Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ Ñпробувати ввеÑти в оману Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ підпиÑу під чужими Ñловами. ПідпиÑуйте лише чіткі твердженнÑ, з Ñкими ви повніÑÑ‚ÑŽ згодні.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Біткоїн-адреÑа Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу цього повідомленнÑ</translation>
</message>
@@ -3530,10 +3538,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Перевірте адреÑу та Ñпробуйте ще раз.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Введена адреÑа не відноÑитьÑÑ Ð´Ð¾ ключа.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Ð Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ Ð±ÑƒÐ»Ð¾ ÑкаÑоване.</translation>
</message>
@@ -4115,11 +4119,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT-транзакцію Ñкопійовано</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Скопійовано в буфер обміну</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Ðе можливо підпиÑати транзакцію.</translation>
</message>
@@ -4131,16 +4130,12 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Can't display address</source>
<translation type="unfinished">Ðеможливо показати адреÑу</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">гаманець за замовчуваннÑм</translation>
- </message>
</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;ЕкÑпортувати</translation>
+ <translation type="unfinished">ЕкÑпортувати</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -4192,7 +4187,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%s Ð¿Ñ€Ð¾Ñ…Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñлухати на порту %u . Цей порт вважаєтьÑÑ Â«Ð¿Ð¾Ð³Ð°Ð½Ð¸Ð¼Â» Ñ– тому наврÑд чи до нього підключитьÑÑ Ñкий-небудь бенкет. ПереглÑньте doc/p2p-bad-ports.md Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ñ— інформації та повного ÑпиÑку.</translation>
+ <translation type="unfinished">Запит %s на проÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ %u. Цей порт вважаєтьÑÑ Â«Ð¿Ð¾Ð³Ð°Ð½Ð¸Ð¼Â» Ñ– тому наврÑд чи до нього підключитьÑÑ Ñкий-небудь учаÑник. ПереглÑньте doc/p2p-bad-ports.md Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð¸Ñ†ÑŒ та повного ÑпиÑку.</translation>
</message>
<message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
@@ -4267,10 +4262,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Ðе вказано формат файлу гаманцÑ. Щоб викориÑтовувати createfromdump, потрібно вказати -format=&lt;format&gt;.</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Перевірте правильніÑÑ‚ÑŒ дати та чаÑу Ñвого комп'ютера. Якщо ваш годинник налаштовано невірно, %s не буде працювати належним чином.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Будь лаÑка, зробіть внеÑок, Ñкщо ви знаходите %s кориÑним. Відвідайте %s Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації про програмне забезпеченнÑ.</translation>
</message>
@@ -4379,10 +4370,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool має бути не менше %d МБ</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">СталаÑÑ ÐºÑ€Ð¸Ñ‚Ð¸Ñ‡Ð½Ð° Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, дивітьÑÑ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð¸Ñ†Ñ– в debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ -%s адреÑу: '%s'</translation>
</message>
@@ -4973,10 +4960,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ велика</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Ðе вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ пам'ÑÑ‚ÑŒ Ð´Ð»Ñ -maxsigcachesize: '%s' МіБ</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Ðе вдалоÑÑ Ð¿Ñ€Ð¸Ð²'ÑзатиÑÑ Ð´Ð¾ %s на цьому комп'ютері (bind повернув помилку: %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ur.ts b/src/qt/locale/bitcoin_ur.ts
index c0ff575864..de2357da71 100644
--- a/src/qt/locale/bitcoin_ur.ts
+++ b/src/qt/locale/bitcoin_ur.ts
@@ -2,12 +2,12 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Create a new address</source>
- <translation type="unfinished">نیا Ù¾ØªÛ ØªØ®Ù„ÛŒÙ‚ کریں</translation>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">ایڈریس یا لیبل میں ترمیم کرنے کے لیے رائیٹ کلک کریں</translation>
</message>
<message>
- <source>&amp;New</source>
- <translation type="unfinished">اور نیا</translation>
+ <source>Create a new address</source>
+ <translation type="unfinished">نیا ایڈریس بنائیں</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -89,6 +89,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">پتا ÙÛرست محÙوظ کرتے Ûوئے %1 نقص کا سامنا Ûوا۔ Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کریں۔</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">بھیجنے والے پتے - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">وصول کرنے والے پتے - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">ایکسپورٹ ناکام Ûوا</translation>
</message>
@@ -171,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">پرس Ú©Û’ لئے پرانا پاسÙریج اور نیا پاسÙریز درج کریں۔</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">جاری رکھیں</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">پیچھے</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">یاد رکھیں Ú©Û Ø¢Ù¾ Ú©Û’ پرس Ú©Ùˆ Ø®ÙÛŒÛ Ú©Ø±Ù†Ø§ آپ Ú©Û’ بٹ کوائنز Ú©Ùˆ میلویئر/چور سے آپ Ú©Û’ کمپیوٹر میں انÙیکشن لگانے Ú©Û’ Ø°Ø±ÛŒØ¹Û Ú†ÙˆØ±ÛŒ Ûونے سے پوری طرح محÙوظ Ù†Ûیں رکھ سکتا ÛÛ’Û”</translation>
</message>
@@ -211,6 +227,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">بٹوے Ú©ÛŒ ڈکرپشن Ú©Û’ لئے درج Ú©Ø±Ø¯Û Ù¾Ø§Ø³ Ùریس غلط تھا۔</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">آپ کا والٹ کھولنے Ú©Û’ لیے جو Ø®ÙÛŒÛ Ù„Ùظ (passphrase) دیا گیا ÛÛ’ ÙˆÛ ØºÙ„Ø· ÛÛ’Û” اس میں ایک خالی حر٠(null character) موجود ÛÛ’Û” اگر ÛŒÛ Ø®ÙÛŒÛ Ù„Ùظ اس ساÙÙ¹ ویئر Ú©Û’ ورژن 25.0 سے Ù¾ÛÙ„Û’ والے ورژن میں بنایا گیا تھا تو براÛ٠کرم Ù¾ÛÙ„Û’ خالی حر٠سے Ù¾ÛÙ„Û’ تک Ú©Û’ حرو٠استعمال کرکے Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کریں۔ اگر ÛŒÛ Ú©Ø§Ù…ÛŒØ§Ø¨ Ûوجائے تو مستقبل میں اس مسئلے سے بچنے Ú©Û’ لیے نیا Ø®ÙÛŒÛ Ù„Ùظ مقرر کرلیں۔</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">والیٹ کا پاسÙریز کامیابی Ú©Û’ ساتھ تبدیل کردیا گیا تھا۔</translation>
</message>
@@ -265,6 +285,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">کیا آپ ترتیبات Ú©Ùˆ ÚˆÛŒÙالٹ اقدار پر Ø¯ÙˆØ¨Ø§Ø±Û ØªØ±ØªÛŒØ¨ دینا چاÛتے Ûیں، یا تبدیلیاں کیے بغیر اسقاط کرنا چاÛتے Ûیں؟</translation>
</message>
<message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">ایک سنگین خرابی واقع Ûوئی ÛÛ’Û” Ø¨Ø±Ø§Û Ú©Ø±Ù… چیک کریں Ú©Û Ø³ÛŒÙ¹Ù†Ú¯Ø² Ùائل میں ترمیم Ú©ÛŒ جاسکتی ÛÛ’ØŒ یا پھر "-nosettings" Ú©Û’ ساتھ چلانے Ú©ÛŒ کوشش کریں۔</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">خرابی:%1</translation>
</message>
@@ -335,7 +360,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û ÙˆØ§Ù„ÛŒÙ¹</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -563,6 +592,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">جزوی طور پر دستخط Ø´Ø¯Û Ø¨Ù¹ کوائن ٹرانزیکشن لوڈ کریں۔</translation>
</message>
<message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">PSBT کو &amp;clipboard سے لوڈ کریں...</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">کلپ بورڈ سے جزوی طور پر دستخط Ø´Ø¯Û Ø¨Ù¹ کوائن ٹرانزیکشن لوڈ کریں۔</translation>
</message>
@@ -599,10 +632,28 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">والیٹ بند کریں</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">والیٹ بحال کریں...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">بیک اپ Ùائل سے والیٹ بحال کریں</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">تمام والیٹس بند کریں</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">والیٹ منتقل کریں</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">ایک والیٹ منتقل کریں</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Ù…Ù…Ú©Ù†Û Ø¨Ù¹ کوائن کمانڈ لائن اختیارات Ú©Û’ ساتھ ÙÛرست حاصل کرنے Ú©Û’ لیے %1 مدد کا پیغام دکھائیں۔</translation>
</message>
@@ -615,14 +666,25 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ø¬Ø§Ø¦Ø²Û Ù¹ÛŒØ¨ میں اقدار Ú©Ùˆ ماسک کریں۔</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û ÙˆØ§Ù„ÛŒÙ¹</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">کوئی والیٹ دستیاب Ù†Ûیں Ûیں۔</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">والیٹ کا ڈیٹا</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">والیٹ بیک اپ لوڈ کریں</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">والیٹ بحال کریں</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">والیٹ کا نام</translation>
@@ -672,6 +734,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">نیٹ ورک Ú©ÛŒ سرگرمی Ú©Ùˆ Ùعال کریں۔</translation>
</message>
<message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">نیا والیٹ Ù†Ûیں بنایا جا سکتا، اس ساÙÙ¹ ویئر Ú©Ùˆ sqlite سپورٹ Ú©Û’ بغیر کمپائل کیا گیا ÛÛ’ (ڈسکرپٹر والیٹ Ú©Û’ لیے درکار)Û”</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">خرابی:%1</translation>
</message>
@@ -733,7 +799,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">نجی کلید &lt;b&gt;غیر Ùعال &lt;b/&gt;ÛÛ’Û”</translation>
+ <translation type="unfinished">نجی کلید &lt;b&gt;غیر Ùعال&lt;/b&gt; ÛÛ’Û”</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
+ <translation type="unfinished">والٹ &lt;b&gt;Ø®ÙÛŒÛ Ú©Ø±Ø¯Û &lt;/b&gt;ÛÛ’ اور ÙÛŒ الحال &lt;b&gt;غیر مقÙÙ„&lt;/b&gt; ÛÛ’</translation>
</message>
<message>
<source>Original message:</source>
@@ -904,6 +974,27 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">والیٹ Ú©ÛŒ منتقلی اس والیٹ Ú©Ùˆ ایک یا ایک سے Ø²ÛŒØ§Ø¯Û ÚˆØ³Ú©Ø±Ù¾Ù¹Ø± والیٹ میں تبدیل کر دے گی۔ ایک نیا والیٹ بیک اپ بنانا Ûوگا۔
+
+اگر اس والیٹ میں کوئی واچ اونلی اسکرپٹس Ûیں، تو ایک نیا والیٹ بنایا جائے گا جس میں ÙˆÛ ÙˆØ§Ú† اونلی اسکرپٹس ÛÙˆÚº Ú¯Û’Û”
+
+اگر اس والیٹ میں کوئی حل طلب لیکن واچ Ù†Ûیں کیے گئے اسکرپٹس Ûیں، تو ایک مختل٠اور نیا والیٹ بنایا جائے گا جس میں ÙˆÛ Ø§Ø³Ú©Ø±Ù¾Ù¹Ø³ ÛÙˆÚº Ú¯Û’Û”
+
+منتقلی Ú©Û’ عمل سے Ù¾ÛÙ„Û’ والیٹ کا بیک اپ بنایا جائے گا۔ اس بیک اپ Ùائل کا نام &lt;wallet name&gt;- &lt;timestamp&gt;.legacy.bak Ûوگا اور ÛŒÛ Ø§Ø³ والیٹ Ú©ÛŒ ڈائرکٹری میں مل سکتی ÛÛ’Û” غلط منتقلی Ú©ÛŒ صورت میں، بیک اپ Ú©Ùˆ "Restore Wallet" Ùعالیت Ú©Û’ ساتھ بحال کیا جا سکتا ÛÛ’Û”</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">والیٹ منتقل کریں</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -914,16 +1005,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">والیٹ کھولنے Ú©ÛŒ انتباÛ</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û ÙˆØ§Ù„ÛŒÙ¹</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">والیٹ کھولیں</translation>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">والیٹ بحال کریں</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -949,6 +1044,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">والیٹ بنائیں</translation>
</message>
<message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Ø¨Ø±Ø§Û Ú©Ø±Ù… ایک نام ÙراÛÙ… کریں اور، اگر مطلوب ÛÙˆ تو، کوئی بھی اعلی درجے Ú©Û’ اختیارات Ú©Ùˆ Ùعال کریں</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">والیٹ کا نام</translation>
</message>
@@ -1037,6 +1136,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">بھیجنے کے پتے میں ترمیم کریں۔</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">ایڈریس "%1" Ù¾ÛÙ„Û’ سے ÛÛŒ لیبل "%2" Ú©Û’ ساتھ وصول Ú©Ù†Ù†Ø¯Û Ú©Û’ ایڈریس Ú©Û’ طور پر موجود ÛÛ’ اور اس لیے اسے بھیجنے والے Ú©Û’ ایڈریس Ú©Û’ طور پر شامل Ù†Ûیں کیا جا سکتا۔</translation>
+ </message>
+ <message>
+ <source>The entered address "%1" is already in the address book with label "%2".</source>
+ <translation type="unfinished">درج Ú©Ø±Ø¯Û Ø§ÛŒÚˆØ±ÛŒØ³ "%1" Ù¾ÛÙ„Û’ سے ÛÛŒ ایڈریس بک میں لیبل "%2" Ú©Û’ ساتھ موجود ÛÛ’Û”</translation>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">والیٹ Ú©Ùˆ غیر مقÙÙ„ Ù†Ûیں کیا جا سکا۔</translation>
</message>
@@ -1333,6 +1440,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ú©Ù†Ùیگریشن Ú©Û’ اختیارات</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">جاری رکھیں</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">نقص</translation>
</message>
@@ -2110,10 +2221,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">دستخط - ایک پیغام پر دستخط / تصدیق کریں۔</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">آپ ÛŒÛ Ø«Ø§Ø¨Øª کرنے Ú©Û’ لیے اپنے پتوں Ú©Û’ ساتھ پیغامات/معاÛدوں پر دستخط کر سکتے Ûیں Ú©Û Ø¢Ù¾ ان پر بھیجے گئے بٹ کوائنز وصول کر سکتے Ûیں۔ Ûوشیار رÛیں Ú©Û Ú©Ø³ÛŒ بھی مبÛÙ… یا بے ترتیب پر دستخط Ù†Û Ú©Ø±ÛŒÚºØŒ Ú©ÛŒÙˆÙ†Ú©Û Ùریب دÛÛŒ Ú©Û’ حملے آپ Ú©Ùˆ اپنی شناخت پر دستخط کرنے Ú©Û’ لیے Ø¯Ú¾ÙˆÚ©Û Ø¯ÛŒÙ†Û’ Ú©ÛŒ کوشش کر سکتے Ûیں۔ صر٠مکمل تÙصیلی بیانات پر دستخط کریں جن سے آپ اتÙاق کرتے Ûیں۔</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">پیغام پر دستخط کرنے Ú©Û’ لیے بٹ کوائن کا پتÛ</translation>
</message>
@@ -2288,11 +2395,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>Send Coins</source>
<translation type="unfinished">سکے بھیجیں۔</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û ÙˆØ§Ù„ÛŒÙ¹</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2303,6 +2406,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">Ù…ÙˆØ¬ÙˆØ¯Û ÚˆÛŒÙ¹Ø§ Ú©Ùˆ Ùائیل میں محÙوظ کریں</translation>
</message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">والیٹ کا ڈیٹا</translation>
+ </message>
</context>
<context>
<name>bitcoin-core</name>
diff --git a/src/qt/locale/bitcoin_uz.ts b/src/qt/locale/bitcoin_uz.ts
index b7193d36b8..0ecf99ac43 100644
--- a/src/qt/locale/bitcoin_uz.ts
+++ b/src/qt/locale/bitcoin_uz.ts
@@ -365,6 +365,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart hamyon</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -443,7 +447,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Hamyon shifrlanishi uchun ishlatilgan maxfiy so'zni almashtirish</translation>
+ <translation type="unfinished">Паролни ўзгартириш ҳамённи кодлашда фойдаланилади</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -463,7 +467,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Hamyonga tegishli bo'lgan maxfiy so'zlarni shifrlash</translation>
+ <translation type="unfinished">Ҳамёнингизга тегишли махфий калитларни кодлаш</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -479,7 +483,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Bitkoin manzillarga ega ekaningizni tasdiqlash uchun xabarni signlang</translation>
+ <translation type="unfinished">Bitcoin манзилидан унинг ÑгаÑи Ñканлигингизни иÑботлаш учун хабарлар ёзинг</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -487,7 +491,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Xabar belgilangan Bitkoin manzillari bilan imzolanganligiga ishonch hosil qilish uchun ularni tasdiqlang</translation>
+ <translation type="unfinished">Хабарларни махÑÑƒÑ Bitcoin манзилларингиз билан ёзилганлигига ишонч ҳоÑил қилиш учун уларни таÑдиқланг</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
@@ -511,19 +515,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Fayl</translation>
+ <translation type="unfinished">&amp;Файл</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;Sozlamalar</translation>
+ <translation type="unfinished">&amp; Созламалар</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">&amp;Yordam</translation>
+ <translation type="unfinished">&amp;Ðрдам</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">Yorliqlar menyusi</translation>
+ <translation type="unfinished">Ички ойналар аÑбоблар панели</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
@@ -547,19 +551,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Тўловлар (QR кодлари ва bitcoin ёрдамида Ñратишлар: URI’лар) Ñўраш</translation>
+ <translation type="unfinished">To'lovlarni so'rash(QR kolar va bitkoin yaratish: URL manzillar)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Фойдаланилган жўнатилган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
+ <translation type="unfinished">Manzillar va yorliqlar ro'yxatini ko'rsatish</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Фойдаланилган қабул қилинган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
+ <translation type="unfinished">Qabul qilish manzillari va yorliqlar ro'yxatini ko'rsatish</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Буйруқлар Ñатри моÑламалари</translation>
+ <translation type="unfinished">&amp;Command-line sozlamalari</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -570,7 +574,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 орқада</translation>
+ <translation type="unfinished">%1 yonida</translation>
</message>
<message>
<source>Catching up…</source>
@@ -578,27 +582,27 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Сўнги қабул қилинган блок %1 олдин Ñратилган.</translation>
+ <translation type="unfinished">%1 oldin oxirgi marta blok qabul qilingan edi.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Бундан кейинги пул ўтказмалари кўринмайдиган бўлади.</translation>
+ <translation type="unfinished">Shundan keyingi operatsiyalar hali ko'rinmaydi.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Хатолик</translation>
+ <translation type="unfinished">Xatolik</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Диққат</translation>
+ <translation type="unfinished">Eslatma</translation>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Маълумот</translation>
+ <translation type="unfinished">Informatsiya</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">Янгиланган</translation>
+ <translation type="unfinished">Hozirgi kunda</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -634,7 +638,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ochiq hamyon</translation>
+ <translation type="unfinished">Hamyonni ochish</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -657,10 +661,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Umumiy ko'rinish menyusidagi qiymatlarni maskirovka qilish</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Hamyonlar mavjud emas</translation>
</message>
@@ -841,7 +841,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Tree mode</source>
- <translation type="unfinished">Daraxt rejimi</translation>
+ <translation type="unfinished">Дарахт уÑулида</translation>
</message>
<message>
<source>List mode</source>
@@ -849,7 +849,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Miqdor</translation>
+ <translation type="unfinished">Миқдори</translation>
</message>
<message>
<source>Received with label</source>
@@ -865,11 +865,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Confirmations</source>
- <translation type="unfinished">Tasdiqlar</translation>
+ <translation type="unfinished">ТаÑдиқлашлар</translation>
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Tasdiqlangan</translation>
+ <translation type="unfinished">ТаÑдиқланди</translation>
</message>
<message>
<source>Copy amount</source>
@@ -893,7 +893,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">Sarflanmagan miqdorlarni q&amp;ulflash</translation>
+ <translation type="unfinished">Sarflanmagan tranzaksiyalarni q&amp;ulflash</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -917,11 +917,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">O'zgarishni nusxalash</translation>
+ <translation type="unfinished">ÐуÑха қайтими</translation>
</message>
<message>
<source>(%1 locked)</source>
- <translation type="unfinished">(%1 qulflangan)</translation>
+ <translation type="unfinished">(%1 қулфланган)</translation>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
@@ -929,7 +929,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Ðрлиқ мавжуд ÑмаÑ)</translation>
+ <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
</message>
<message>
<source>change from %1 (%2)</source>
@@ -989,10 +989,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Hamyonni ochish ogohlantirishi</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ochiq hamyon</translation>
@@ -1821,6 +1817,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Manzilni nusxalash</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Йўқ</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">%1 орқали</translation>
</message>
@@ -2078,7 +2078,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">O'zgarishni nusxalash</translation>
+ <translation type="unfinished">ÐуÑха қайтими</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2259,7 +2259,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Miqdor</translation>
+ <translation type="unfinished">Миқдори</translation>
</message>
<message>
<source>true</source>
@@ -2469,11 +2469,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">Тангаларни жунат</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_uz@Cyrl.ts b/src/qt/locale/bitcoin_uz@Cyrl.ts
index f335cb39ab..addb6fb9e8 100644
--- a/src/qt/locale/bitcoin_uz@Cyrl.ts
+++ b/src/qt/locale/bitcoin_uz@Cyrl.ts
@@ -370,6 +370,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart hamyon</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -639,7 +643,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ochiq hamyon</translation>
+ <translation type="unfinished">Hamyonni ochish</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -662,10 +666,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Umumiy ko'rinish menyusidagi qiymatlarni maskirovka qilish</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Hamyonlar mavjud emas</translation>
</message>
@@ -898,7 +898,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">Sarflanmagan miqdorlarni q&amp;ulflash</translation>
+ <translation type="unfinished">Sarflanmagan tranzaksiyalarni q&amp;ulflash</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -994,10 +994,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Hamyonni ochish ogohlantirishi</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ochiq hamyon</translation>
@@ -1826,6 +1822,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Manzilni nusxalash</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Йўқ</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">%1 орқали</translation>
</message>
@@ -2474,11 +2474,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">Тангаларни жунат</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_uz@Latn.ts b/src/qt/locale/bitcoin_uz@Latn.ts
index 823b21be06..75ce7b974d 100644
--- a/src/qt/locale/bitcoin_uz@Latn.ts
+++ b/src/qt/locale/bitcoin_uz@Latn.ts
@@ -370,6 +370,10 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart hamyon</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -448,7 +452,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Hamyon shifrlanishi uchun ishlatilgan maxfiy so'zni almashtirish</translation>
+ <translation type="unfinished">Паролни ўзгартириш ҳамённи кодлашда фойдаланилади</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -468,7 +472,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Hamyonga tegishli bo'lgan maxfiy so'zlarni shifrlash</translation>
+ <translation type="unfinished">Ҳамёнингизга тегишли махфий калитларни кодлаш</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -484,7 +488,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Bitkoin manzillarga ega ekaningizni tasdiqlash uchun xabarni signlang</translation>
+ <translation type="unfinished">Bitcoin манзилидан унинг ÑгаÑи Ñканлигингизни иÑботлаш учун хабарлар ёзинг</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -492,7 +496,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Xabar belgilangan Bitkoin manzillari bilan imzolanganligiga ishonch hosil qilish uchun ularni tasdiqlang</translation>
+ <translation type="unfinished">Хабарларни махÑÑƒÑ Bitcoin манзилларингиз билан ёзилганлигига ишонч ҳоÑил қилиш учун уларни таÑдиқланг</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
@@ -516,19 +520,19 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Fayl</translation>
+ <translation type="unfinished">&amp;Файл</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;Sozlamalar</translation>
+ <translation type="unfinished">&amp; Созламалар</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">&amp;Yordam</translation>
+ <translation type="unfinished">&amp;Ðрдам</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">Yorliqlar menyusi</translation>
+ <translation type="unfinished">Ички ойналар аÑбоблар панели</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
@@ -552,19 +556,19 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Тўловлар (QR кодлари ва bitcoin ёрдамида Ñратишлар: URI’лар) Ñўраш</translation>
+ <translation type="unfinished">To'lovlarni so'rash(QR kolar va bitkoin yaratish: URL manzillar)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Фойдаланилган жўнатилган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
+ <translation type="unfinished">Manzillar va yorliqlar ro'yxatini ko'rsatish</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Фойдаланилган қабул қилинган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
+ <translation type="unfinished">Qabul qilish manzillari va yorliqlar ro'yxatini ko'rsatish</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Буйруқлар Ñатри моÑламалари</translation>
+ <translation type="unfinished">&amp;Command-line sozlamalari</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -575,7 +579,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 орқада</translation>
+ <translation type="unfinished">%1 yonida</translation>
</message>
<message>
<source>Catching up…</source>
@@ -583,27 +587,27 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Сўнги қабул қилинган блок %1 олдин Ñратилган.</translation>
+ <translation type="unfinished">%1 oldin oxirgi marta blok qabul qilingan edi.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Бундан кейинги пул ўтказмалари кўринмайдиган бўлади.</translation>
+ <translation type="unfinished">Shundan keyingi operatsiyalar hali ko'rinmaydi.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Хатолик</translation>
+ <translation type="unfinished">Xatolik</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Диққат</translation>
+ <translation type="unfinished">Eslatma</translation>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Маълумот</translation>
+ <translation type="unfinished">Informatsiya</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">Янгиланган</translation>
+ <translation type="unfinished">Hozirgi kunda</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -639,7 +643,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ochiq hamyon</translation>
+ <translation type="unfinished">Hamyonni ochish</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -662,10 +666,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Umumiy ko'rinish menyusidagi qiymatlarni maskirovka qilish</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Hamyonlar mavjud emas</translation>
</message>
@@ -994,10 +994,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Hamyonni ochish ogohlantirishi</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ochiq hamyon</translation>
@@ -1826,6 +1822,10 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">&amp;Manzilni nusxalash</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Йўқ</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">%1 орқали</translation>
</message>
@@ -1964,7 +1964,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ðрлиқ мавжуд ÑмаÑ)</translation>
</message>
<message>
<source>(no message)</source>
@@ -2122,7 +2122,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ðрлиқ мавжуд ÑмаÑ)</translation>
</message>
</context>
<context>
@@ -2330,7 +2330,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ðрлиқ мавжуд ÑмаÑ)</translation>
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
@@ -2474,11 +2474,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<source>Send Coins</source>
<translation type="unfinished">Тангаларни жунат</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_vi.ts b/src/qt/locale/bitcoin_vi.ts
index fe69b4c1f3..f675452e26 100644
--- a/src/qt/locale/bitcoin_vi.ts
+++ b/src/qt/locale/bitcoin_vi.ts
@@ -70,10 +70,6 @@
<translation type="unfinished">Xuất danh sách địa chỉ</translation>
</message>
<message>
- <source>Sending addresses - %1</source>
- <translation type="unfinished">Äịa chỉ gá»­i%1</translation>
- </message>
- <message>
<source>Exporting Failed</source>
<translation type="unfinished">Quá trình xuất dữ liệu đã thất bại</translation>
</message>
@@ -156,6 +152,10 @@
<translation type="unfinished">Nhập mật khẩu cũ và mật khẩu mới cho ví.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Tiếp tục</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">Xin lÆ°u ý rằng mã hoá ví của bạn không thể bảo vá» hoàn toàn Bitcoin của bạn khá»i việc bị đánh cắp má»›i các phần má»m gián Ä‘iệp nhiá»…m vào máy tính của bạn.</translation>
</message>
@@ -290,7 +290,11 @@
<numerusform>%nnăm</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">ví mặc định</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -415,18 +419,6 @@
<translation type="unfinished">Äóng tất cả các ví…</translation>
</message>
<message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;Tệp</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <translation type="unfinished">&amp;Cài đặt</translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation type="unfinished">&amp;Giúp đỡ</translation>
- </message>
- <message>
<source>Tabs toolbar</source>
<translation type="unfinished">Các thanh công cụ</translation>
</message>
@@ -446,6 +438,10 @@
<source>Processing blocks on disk…</source>
<translation type="unfinished">Xử lý khối trên đĩa…</translation>
</message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Kết nối với các peer…</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -457,6 +453,10 @@
<translation type="unfinished">%1 phía sau</translation>
</message>
<message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Äang bắt kịp...</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">Lá»—i</translation>
</message>
@@ -470,7 +470,7 @@
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Tải một phần giao dịch Bitcoin đã ký</translation>
+ <translation type="unfinished">Kết nối với mạng Bitcoin thông qua một proxy SOCKS5 riêng cho các dịch vụ Tor hành.</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -490,11 +490,11 @@
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">Các địa chỉ đang &amp;gửi</translation>
+ <translation type="unfinished">&amp;Các địa chỉ đang gửi</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">Các địa chỉ đang &amp;nhận</translation>
+ <translation type="unfinished">&amp;Các địa chỉ đang nhận</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
@@ -539,10 +539,6 @@
<translation type="unfinished">Che các giá trị trong tab Tổng quan</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">ví mặc định</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Không có ví nào</translation>
</message>
@@ -561,6 +557,10 @@
<translation type="unfinished">Nhấn Ctrl + M</translation>
</message>
<message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 khách</translation>
+ </message>
+ <message>
<source>&amp;Hide</source>
<translation type="unfinished">&amp;Ẩn</translation>
</message>
@@ -669,10 +669,6 @@
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">ví mặc định</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Mớ ví</translation>
@@ -1115,10 +1111,6 @@
<source>Label</source>
<translation type="unfinished">Nhãn</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(không có nhãn)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1156,11 +1148,7 @@
<numerusform>Ước tính sẽ bắt đầu xác nhận trong %n khối.</numerusform>
</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(không có nhãn)</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -1214,10 +1202,6 @@
<source>Label</source>
<translation type="unfinished">Nhãn</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(không có nhãn)</translation>
- </message>
</context>
<context>
<name>TransactionView</name>
@@ -1255,18 +1239,6 @@
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Äã sao chép vào bảng tạm.</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">ví mặc định</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
@@ -1304,6 +1276,10 @@
<translation type="unfinished">Không thể đặt -forcednsseed thành true khi đặt -dnsseed thành false.</translation>
</message>
<message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">Không thể ghi vào thÆ° mục dữ liệu '%s'; kiểm tra lại quyá»n.</translation>
+ </message>
+ <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Không thể cung cấp các kết nối cụ thể và yêu cầu addrman tìm các kết nối gửi đi cùng một lúc.</translation>
</message>
@@ -1450,10 +1426,6 @@ Không thể khôi phục bản sao lưu của ví.</translation>
<translation type="unfinished">Giao dịch cần thay đổi địa chỉ, nhưng chúng tôi không thể tạo địa chỉ đó.</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Không có khả năng để phân bổ bộ nhớ cho -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to find UTXO for external input</source>
<translation type="unfinished">Không thể tìm UTXO cho đầu vào từ bên ngoài</translation>
</message>
diff --git a/src/qt/locale/bitcoin_yue.ts b/src/qt/locale/bitcoin_yue.ts
index 1ed37d36ce..ea7a1e177f 100644
--- a/src/qt/locale/bitcoin_yue.ts
+++ b/src/qt/locale/bitcoin_yue.ts
@@ -179,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">請記得, å³ä½¿å°‡éŒ¢åŒ…加密, 也ä¸èƒ½å®Œå…¨é˜²æ­¢å› æƒ¡æ„軟體入侵, 而導致ä½å…ƒå¹£è¢«å·.</translation>
</message>
@@ -261,6 +269,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未æ•èŽ·çš„异常</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">發生致命錯誤。 %1無法å†ç¹¼çºŒå®‰å…¨åœ°é‹è¡Œä¸¦é›¢é–‹ã€‚</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">內部錯誤</translation>
</message>
@@ -432,7 +444,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -510,7 +522,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -521,16 +533,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">接收(&amp;R)</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">选项(&amp;O)</translation>
- </message>
- <message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">加密钱包(&amp;E)</translation>
- </message>
- <message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">把你钱包中的ç§é’¥åŠ å¯†</translation>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -541,22 +545,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">修改密ç (&amp;C)</translation>
</message>
<message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">ç­¾å消æ¯(&amp;M)</translation>
- </message>
- <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">用比特å¸åœ°å€å…³è”çš„ç§é’¥ä¸ºæ¶ˆæ¯ç­¾å,以è¯æ˜Žæ‚¨æ‹¥æœ‰è¿™ä¸ªæ¯”特å¸åœ°å€</translation>
</message>
<message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">验è¯æ¶ˆæ¯(&amp;V)</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">校验消æ¯ï¼Œç¡®ä¿è¯¥æ¶ˆæ¯æ˜¯ç”±æŒ‡å®šçš„比特å¸åœ°å€æ‰€æœ‰è€…ç­¾åçš„</translation>
- </message>
- <message>
<source>&amp;Load PSBT from file…</source>
<translation type="unfinished">从文件加载PSBT(&amp;L)...</translation>
</message>
@@ -573,32 +565,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">创建钱包...</translation>
</message>
<message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">关闭所有钱包...</translation>
- </message>
- <message>
<source>&amp;File</source>
- <translation type="unfinished">文件(&amp;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <translation type="unfinished">&amp;說明</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">标签页工具æ </translation>
- </message>
- <message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">åŒæ­¥åŒºå—头 (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">与网络åŒæ­¥...</translation>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -610,7 +590,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">连到åŒè¡Œ...</translation>
+ <translation type="unfinished">连接到节点...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -622,7 +602,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">顯示已使用éŽçš„接收地å€å’Œæ¨™ç±¤æ¸…å–®</translation>
+ <translation type="unfinished">显示用过的收款地å€å’Œæ ‡ç­¾çš„列表</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -640,15 +620,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">赶上...</translation>
+ <translation type="unfinished">正在追上进度...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -660,7 +640,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">資訊</translation>
+ <translation type="unfinished">ä¿¡æ¯</translation>
</message>
<message>
<source>Up to date</source>
@@ -734,7 +714,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示 %1 帮助信æ¯ï¼ŒèŽ·å–å¯ç”¨å‘½ä»¤è¡Œé€‰é¡¹åˆ—表</translation>
+ <translation type="unfinished">显示%1帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -745,10 +725,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">在“概况â€æ ‡ç­¾é¡µä¸­ä¸æ˜Žæ–‡æ˜¾ç¤ºæ•°å€¼ã€åªæ˜¾ç¤ºæŽ©ç </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -786,15 +762,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">éšè—(&amp;H)</translation>
+ <translation type="unfinished">&amp;躲</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -806,26 +782,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">点击查看更多æ“作。</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">显示节点标签</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">ç¦ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">點擊查看更多æ“作</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">å¯ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">關閉網路紀錄</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">é å…ˆåŒæ­¥æ¨™é ­(%1%)</translation>
+ <translation type="unfinished">预åŒæ­¥åŒºå—头 (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -905,7 +871,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ <translation type="unfinished">錢包已&lt;b&gt;加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -927,11 +893,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -946,14 +912,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">計費後金é¡:</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">找零:</translation>
- </message>
- <message>
- <source>(un)select all</source>
- <translation type="unfinished">å…¨(ä¸)选</translation>
- </message>
- <message>
<source>Tree mode</source>
<translation type="unfinished">树状模å¼</translation>
</message>
@@ -966,22 +924,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金é¢</translation>
</message>
<message>
- <source>Received with label</source>
- <translation type="unfinished">收款标签</translation>
- </message>
- <message>
<source>Received with address</source>
<translation type="unfinished">收款地å€</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">日期</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
- </message>
- <message>
<source>Copy amount</source>
<translation type="unfinished">å¤åˆ¶é‡‘é¢</translation>
</message>
@@ -1006,10 +952,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">é”定未花费(&amp;O)</translation>
</message>
<message>
- <source>&amp;Unlock unspent</source>
- <translation type="unfinished">解é”未花费(&amp;U)</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">å¤åˆ¶æ•°ç›®</translation>
</message>
@@ -1045,11 +987,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1141,10 +1079,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
@@ -1480,7 +1414,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Paste address from clipboard</source>
<extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
</context>
<context>
@@ -1491,11 +1425,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1507,11 +1441,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
@@ -2262,10 +2196,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">传输</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID,如果有的è¯ã€‚</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">会è¯ID</translation>
</message>
@@ -2372,6 +2302,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">这个节点是通过这ç§ç½‘络å议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2540,7 +2474,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2564,6 +2498,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2599,7 +2537,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2789,11 +2727,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2931,7 +2869,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2945,9 +2883,9 @@ For more information on using this console, type %6.
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">指定交易虚拟大å°çš„æ¯kB (1,000字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–50è°çš„手續費。</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
@@ -3062,6 +3000,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">部分签å交易(二进制)</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3070,6 +3012,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ä½ å¯ä»¥ä¹‹å¾Œå†æ高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">請檢查您的交易æ案。這將產生部分簽å的比特幣交易(PSBT),您å¯ä»¥å„²å­˜æˆ–複製該交易,然後使用簽å。離線%1錢包或與PSBT相容的硬體錢包。</translation>
+ </message>
+ <message>
<source>%1 from wallet '%2'</source>
<translation type="unfinished">%1 æ¥è‡ªé’±åŒ… “%2â€</translation>
</message>
@@ -3201,7 +3148,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3258,10 +3205,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">簽署訊æ¯(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ä½¿ç”¨æ‚¨çš„地å€ç°½å訊æ¯/å”議,以證明您å¯ä»¥æŽ¥æ”¶ç™¼é€çµ¦ä»–們的比特幣。但是請å°å¿ƒï¼Œä¸è¦ç°½å語æ„å«ç³Šä¸æ¸…,或隨機產生的內容,因為釣魚å¼è©é¨™å¯èƒ½æœƒç”¨é¨™ä½ ç°½å的手法來冒充是你。åªæœ‰ç°½å您åŒæ„的詳細內容。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用æ¥å¯¹æ¶ˆæ¯ç­¾å的地å€</translation>
</message>
@@ -3271,7 +3214,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3346,10 +3289,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请检查地å€åŽé‡è¯•ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">找ä¸åˆ°ä¸Žè¾“入地å€ç›¸å…³çš„密钥。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">å·²å–消解é”钱包。</translation>
</message>
@@ -3402,6 +3341,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3780,7 +3726,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3918,11 +3864,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT已複製</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">å¤åˆ¶åˆ°å‰ªè´´æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">沒辦法簽署交易。</translation>
</message>
@@ -3932,11 +3873,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't display address</source>
- <translation type="unfinished">無法顯示地å€</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <translation type="unfinished">無法顯示錢包ä½å€</translation>
</message>
</context>
<context>
@@ -3986,6 +3923,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%sæ壞。嘗試使用錢包工具bitcoin-wallet挽救或還原備份。</translation>
+ </message>
+ <message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<translation type="unfinished">%s éªŒè¯ -assumeutxo 快照状æ€å¤±è´¥ã€‚这表明硬件å¯èƒ½æœ‰é—®é¢˜ï¼Œä¹Ÿå¯èƒ½æ˜¯è½¯ä»¶bug,或者还å¯èƒ½æ˜¯è½¯ä»¶è¢«ä¸å½“修改ã€ä»Žè€Œè®©éžæ³•å¿«ç…§ä¹Ÿèƒ½å¤Ÿè¢«åŠ è½½ã€‚因此,将关闭节点并åœæ­¢ä½¿ç”¨ä»Žè¿™ä¸ªå¿«ç…§æž„建出的任何状æ€ï¼Œå¹¶å°†é“¾é«˜åº¦ä»Ž %d é‡ç½®åˆ° %d 。下次å¯åŠ¨æ—¶ï¼ŒèŠ‚点将会ä¸ä½¿ç”¨å¿«ç…§æ•°æ®ä»Ž %d 继续åŒæ­¥ã€‚请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状æ€å¿«ç…§ä»è¢«ä¿å­˜è‡³ç£ç›˜ä¸Šï¼Œä»¥ä¾›è¯Šæ–­é—®é¢˜çš„原因。</translation>
</message>
@@ -3999,7 +3940,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <translation type="unfinished">無法在資料目錄上ç²å–鎖定%s。%så¯èƒ½å·²ç¶“在é‹è¡Œäº†ã€‚</translation>
</message>
<message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
@@ -4027,7 +3968,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ <translation type="unfinished">
+錯誤:轉存檔案識別記錄ä¸æ­£ç¢ºã€‚ç²å¾—%s,é æœŸ
+%s。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
@@ -4066,10 +4009,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">没有æ供钱包格å¼ã€‚è¦ä½¿ç”¨ createfromdump ,必须æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">请检查电脑的日期时间设置是å¦æ­£ç¡®ï¼æ—¶é—´é”™è¯¯å¯èƒ½ä¼šå¯¼è‡´ %s è¿è¡Œå¼‚常。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你认为%s对你比较有用的è¯ï¼Œè¯·å¯¹æˆ‘们进行一些自愿贡献。请访问%s网站æ¥èŽ·å–有关这个软件的更多信æ¯ã€‚</translation>
</message>
@@ -4178,10 +4117,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">åƒæ•¸ -maxmempool 至少è¦çµ¦ %d 百è¬ä½å…ƒçµ„(MB)</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">å‘生了致命的内部错误,请在debug.log中查看详情</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ²’è¾¦æ³•è§£æž -%s åƒæ•¸æŒ‡å®šçš„地å€: '%s'</translation>
</message>
@@ -4316,6 +4251,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4333,7 +4272,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">找ä¸åˆ°asmap文件%s</translation>
+ <translation type="unfinished">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4424,14 +4363,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: %s 所在的ç£ç›˜ç©ºé—´ä½Žã€‚</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">錯誤:轉存檔案的校驗和ä¸åŒ¹é…。%s計算得%s</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—çš„éµä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—的值ä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">錯誤:keypool已用完,請先é‡æ–°å‘¼å«keypoolrefill</translation>
</message>
<message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">錯誤:缺少校驗和</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">錯誤: 沒有å¯ç”¨çš„ %s 地å€</translation>
+ </message>
+ <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4484,6 +4443,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4492,6 +4455,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4516,6 +4487,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">dbcacheä¸è¶³ä»¥ç”¨äºŽåŒºå—验è¯</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">金é¢ä¸è¶³</translation>
+ </message>
+ <message>
<source>Invalid -i2psam address or hostname: '%s'</source>
<translation type="unfinished">无效的 -i2psam 地å€æˆ–主机å: '%s'</translation>
</message>
@@ -4688,10 +4663,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易ä½å…ƒé‡å¤ªå¤§</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh-Hans.ts b/src/qt/locale/bitcoin_zh-Hans.ts
index ce422f6337..9f827ee890 100644
--- a/src/qt/locale/bitcoin_zh-Hans.ts
+++ b/src/qt/locale/bitcoin_zh-Hans.ts
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入此钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">请注æ„,当您的计算机感染æ¶æ„软件时,加密钱包并ä¸èƒ½å®Œå…¨è§„é¿æ‚¨çš„比特å¸è¢«å·çªƒçš„å¯èƒ½ã€‚</translation>
</message>
@@ -433,7 +441,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 B</source>
<translation type="unfinished">%1 字节</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -511,7 +523,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -526,12 +538,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">选项(&amp;O)</translation>
</message>
<message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">加密钱包(&amp;E)</translation>
- </message>
- <message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">把你钱包中的ç§é’¥åŠ å¯†</translation>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -542,22 +550,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">修改密ç (&amp;C)</translation>
</message>
<message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">ç­¾å消æ¯(&amp;M)</translation>
- </message>
- <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">用比特å¸åœ°å€å…³è”çš„ç§é’¥ä¸ºæ¶ˆæ¯ç­¾å,以è¯æ˜Žæ‚¨æ‹¥æœ‰è¿™ä¸ªæ¯”特å¸åœ°å€</translation>
</message>
<message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">验è¯æ¶ˆæ¯(&amp;V)</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">校验消æ¯ï¼Œç¡®ä¿è¯¥æ¶ˆæ¯æ˜¯ç”±æŒ‡å®šçš„比特å¸åœ°å€æ‰€æœ‰è€…ç­¾åçš„</translation>
- </message>
- <message>
<source>&amp;Load PSBT from file…</source>
<translation type="unfinished">从文件加载PSBT(&amp;L)...</translation>
</message>
@@ -574,32 +570,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">创建钱包...</translation>
</message>
<message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">关闭所有钱包...</translation>
- </message>
- <message>
<source>&amp;File</source>
- <translation type="unfinished">文件(&amp;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <translation type="unfinished">&amp;說明</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">标签页工具æ </translation>
- </message>
- <message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">åŒæ­¥åŒºå—头 (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">与网络åŒæ­¥...</translation>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -641,15 +625,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">赶上...</translation>
+ <translation type="unfinished">正在追上进度...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -746,10 +730,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">在“概况â€æ ‡ç­¾é¡µä¸­ä¸æ˜Žæ–‡æ˜¾ç¤ºæ•°å€¼ã€åªæ˜¾ç¤ºæŽ©ç </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -801,7 +781,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n æ¡åˆ°æ¯”特å¸ç½‘络的活动连接</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
<message>
@@ -1159,10 +1139,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打开钱包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
@@ -2363,10 +2339,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">传输</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID,如果有的è¯ã€‚</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">会è¯ID</translation>
</message>
@@ -2473,6 +2445,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">这个节点是通过这ç§ç½‘络å议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2665,6 +2641,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -3386,10 +3366,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">消æ¯ç­¾å(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ç”¨ä½ çš„地å€å¯¹æ¶ˆæ¯/å议进行签å,以è¯æ˜Žæ‚¨å¯ä»¥æŽ¥æ”¶å‘é€åˆ°è¯¥åœ°å€çš„比特å¸ã€‚注æ„ä¸è¦å¯¹ä»»ä½•æ¨¡æ£±ä¸¤å¯æˆ–者éšæœºçš„消æ¯è¿›è¡Œç­¾å,以å…é­å—é’“é±¼å¼æ”»å‡»ã€‚请确ä¿æ¶ˆæ¯å†…容准确的表达了您的真实æ„愿。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用æ¥å¯¹æ¶ˆæ¯ç­¾å的地å€</translation>
</message>
@@ -3474,10 +3450,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请检查地å€åŽé‡è¯•ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">找ä¸åˆ°ä¸Žè¾“入地å€ç›¸å…³çš„密钥。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">å·²å–消解é”钱包。</translation>
</message>
@@ -4046,11 +4018,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">å·²å¤åˆ¶PSBT</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">å¤åˆ¶åˆ°å‰ªè´´æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">无法签å交易</translation>
</message>
@@ -4062,10 +4029,6 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Can't display address</source>
<translation type="unfinished">无法显示地å€</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4198,10 +4161,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">没有æ供钱包格å¼ã€‚è¦ä½¿ç”¨ createfromdump ,必须æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">请检查电脑的日期时间设置是å¦æ­£ç¡®ï¼æ—¶é—´é”™è¯¯å¯èƒ½ä¼šå¯¼è‡´ %s è¿è¡Œå¼‚常。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你认为%s对你比较有用的è¯ï¼Œè¯·å¯¹æˆ‘们进行一些自愿贡献。请访问%s网站æ¥èŽ·å–有关这个软件的更多信æ¯ã€‚</translation>
</message>
@@ -4310,10 +4269,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool 最å°ä¸º%d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">å‘生了致命的内部错误,请在debug.log中查看详情</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ— æ³•è§£æž - %s 地å€: '%s'</translation>
</message>
@@ -4448,6 +4403,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4640,6 +4599,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">监å¬ç«¯å£å¤±è´¥ã€‚如果你愿æ„çš„è¯ï¼Œè¯·ä½¿ç”¨ -listen=0 å‚数。</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">åˆå§‹åŒ–æ—¶é‡æ‰«æ钱包失败</translation>
</message>
@@ -4652,6 +4615,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">删除交易时失败: %s</translation>
</message>
@@ -4904,10 +4875,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易过大</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">无法在本机绑定%sç«¯å£ (bind函数返回了错误 %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh-Hant.ts b/src/qt/locale/bitcoin_zh-Hant.ts
index 9fe760619b..ee666c5ff3 100644
--- a/src/qt/locale/bitcoin_zh-Hant.ts
+++ b/src/qt/locale/bitcoin_zh-Hant.ts
@@ -179,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">請記得, å³ä½¿å°‡éŒ¢åŒ…加密, 也ä¸èƒ½å®Œå…¨é˜²æ­¢å› æƒ¡æ„軟體入侵, 而導致ä½å…ƒå¹£è¢«å·.</translation>
</message>
@@ -261,6 +269,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未æ•èŽ·çš„异常</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">發生致命錯誤。 %1無法å†ç¹¼çºŒå®‰å…¨åœ°é‹è¡Œä¸¦é›¢é–‹ã€‚</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">內部錯誤</translation>
</message>
@@ -432,7 +444,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -510,7 +522,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -521,16 +533,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">接收(&amp;R)</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">选项(&amp;O)</translation>
- </message>
- <message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">加密钱包(&amp;E)</translation>
- </message>
- <message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">把你钱包中的ç§é’¥åŠ å¯†</translation>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -541,22 +545,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">修改密ç (&amp;C)</translation>
</message>
<message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">ç­¾å消æ¯(&amp;M)</translation>
- </message>
- <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">用比特å¸åœ°å€å…³è”çš„ç§é’¥ä¸ºæ¶ˆæ¯ç­¾å,以è¯æ˜Žæ‚¨æ‹¥æœ‰è¿™ä¸ªæ¯”特å¸åœ°å€</translation>
</message>
<message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">验è¯æ¶ˆæ¯(&amp;V)</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">校验消æ¯ï¼Œç¡®ä¿è¯¥æ¶ˆæ¯æ˜¯ç”±æŒ‡å®šçš„比特å¸åœ°å€æ‰€æœ‰è€…ç­¾åçš„</translation>
- </message>
- <message>
<source>&amp;Load PSBT from file…</source>
<translation type="unfinished">从文件加载PSBT(&amp;L)...</translation>
</message>
@@ -573,32 +565,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">创建钱包...</translation>
</message>
<message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">关闭所有钱包...</translation>
- </message>
- <message>
<source>&amp;File</source>
- <translation type="unfinished">文件(&amp;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <translation type="unfinished">&amp;說明</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">标签页工具æ </translation>
- </message>
- <message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">åŒæ­¥åŒºå—头 (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">与网络åŒæ­¥...</translation>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -610,7 +590,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">连到åŒè¡Œ...</translation>
+ <translation type="unfinished">连接到节点...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -640,15 +620,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">赶上...</translation>
+ <translation type="unfinished">正在追上进度...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -734,7 +714,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示 %1 帮助信æ¯ï¼ŒèŽ·å–å¯ç”¨å‘½ä»¤è¡Œé€‰é¡¹åˆ—表</translation>
+ <translation type="unfinished">显示%1帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -745,10 +725,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">在“概况â€æ ‡ç­¾é¡µä¸­ä¸æ˜Žæ–‡æ˜¾ç¤ºæ•°å€¼ã€åªæ˜¾ç¤ºæŽ©ç </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -770,7 +746,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">钱包å称</translation>
+ <translation type="unfinished">錢包å稱</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -786,15 +762,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">éšè—(&amp;H)</translation>
+ <translation type="unfinished">&amp;躲</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -806,26 +782,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">点击查看更多æ“作。</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">显示节点标签</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">ç¦ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">點擊查看更多æ“作</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">å¯ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">關閉網路紀錄</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">é å…ˆåŒæ­¥æ¨™é ­(%1%)</translation>
+ <translation type="unfinished">预åŒæ­¥åŒºå—头 (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -927,11 +893,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -946,14 +912,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">計費後金é¡:</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">找零:</translation>
- </message>
- <message>
- <source>(un)select all</source>
- <translation type="unfinished">å…¨(ä¸)选</translation>
- </message>
- <message>
<source>Tree mode</source>
<translation type="unfinished">树状模å¼</translation>
</message>
@@ -966,22 +924,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金é¢</translation>
</message>
<message>
- <source>Received with label</source>
- <translation type="unfinished">收款标签</translation>
- </message>
- <message>
<source>Received with address</source>
<translation type="unfinished">收款地å€</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">日期</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
- </message>
- <message>
<source>Copy amount</source>
<translation type="unfinished">å¤åˆ¶é‡‘é¢</translation>
</message>
@@ -1006,10 +952,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">é”定未花费(&amp;O)</translation>
</message>
<message>
- <source>&amp;Unlock unspent</source>
- <translation type="unfinished">解é”未花费(&amp;U)</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">å¤åˆ¶æ•°ç›®</translation>
</message>
@@ -1045,11 +987,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1141,10 +1079,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
@@ -1194,7 +1128,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1245,7 +1179,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
</context>
<context>
@@ -1284,7 +1218,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">地å€â€œ%1â€å·²ç»å­˜åœ¨ï¼Œå®ƒæ˜¯ä¸€ä¸ªæ”¶æ¬¾åœ°å€ï¼Œæ ‡ç­¾ä¸ºâ€œ%2â€ï¼Œæ‰€ä»¥å®ƒä¸èƒ½ä½œä¸ºä¸€ä¸ªä»˜æ¬¾åœ°å€è¢«æ·»åŠ è¿›æ¥ã€‚</translation>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1307,7 +1241,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1315,7 +1249,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1352,7 +1286,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1383,7 +1317,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <translation type="unfinished">歡迎來到 %1。</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
@@ -1391,7 +1325,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">å–消此设置需è¦é‡æ–°ä¸‹è½½æ•´ä¸ªåŒºå—链。先完整下载整æ¡é“¾å†è¿›è¡Œä¿®å‰ªä¼šæ›´å¿«ã€‚这会ç¦ç”¨ä¸€äº›é«˜çº§åŠŸèƒ½ã€‚</translation>
+ <translation type="unfinished">æ¢å¾©æ­¤è¨­å®šéœ€è¦é‡æ–°ä¸‹è¼‰æ•´å€‹å€å¡Šéˆã€‚ 先下載完整éˆç„¶å¾Œå†ä¿®å‰ªå®ƒçš„速度更快。 ç¦ç”¨ä¸€äº›é«˜ç´šåŠŸèƒ½ã€‚</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
@@ -1437,7 +1371,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1448,15 +1382,15 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">近期交易å¯èƒ½å°šæœªæ˜¾ç¤ºï¼Œå› æ­¤å½“å‰ä½™é¢å¯èƒ½ä¸å‡†ç¡®ã€‚以上信æ¯å°†åœ¨ä¸Žæ¯”特å¸ç½‘络完全åŒæ­¥åŽæ›´æ­£ã€‚详情如下</translation>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">å°è¯•ä½¿ç”¨å—未å¯è§äº¤æ˜“å½±å“çš„ä½™é¢å°†ä¸è¢«ç½‘络接å—。</translation>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1468,7 +1402,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1480,7 +1414,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1508,7 +1442,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Paste address from clipboard</source>
<extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
</context>
<context>
@@ -1519,11 +1453,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1535,11 +1469,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
@@ -2290,10 +2224,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">传输</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID,如果有的è¯ã€‚</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">会è¯ID</translation>
</message>
@@ -2400,6 +2330,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">这个节点是通过这ç§ç½‘络å议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2462,7 +2396,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>&amp;Open</source>
@@ -2568,7 +2502,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2592,6 +2526,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2627,7 +2565,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2817,11 +2755,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2959,7 +2897,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2973,9 +2911,9 @@ For more information on using this console, type %6.
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">指定交易虚拟大å°çš„æ¯kB (1,000字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–50è°çš„手續費。</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
@@ -3090,6 +3028,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">部分签å交易(二进制)</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3098,6 +3040,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ä½ å¯ä»¥ä¹‹å¾Œå†æ高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">請檢查您的交易æ案。這將產生部分簽å的比特幣交易(PSBT),您å¯ä»¥å„²å­˜æˆ–複製該交易,然後使用簽å。離線%1錢包或與PSBT相容的硬體錢包。</translation>
+ </message>
+ <message>
<source>%1 from wallet '%2'</source>
<translation type="unfinished">%1 æ¥è‡ªé’±åŒ… “%2â€</translation>
</message>
@@ -3229,7 +3176,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3286,10 +3233,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">簽署訊æ¯(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ä½¿ç”¨æ‚¨çš„地å€ç°½å訊æ¯/å”議,以證明您å¯ä»¥æŽ¥æ”¶ç™¼é€çµ¦ä»–們的比特幣。但是請å°å¿ƒï¼Œä¸è¦ç°½å語æ„å«ç³Šä¸æ¸…,或隨機產生的內容,因為釣魚å¼è©é¨™å¯èƒ½æœƒç”¨é¨™ä½ ç°½å的手法來冒充是你。åªæœ‰ç°½å您åŒæ„的詳細內容。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用æ¥å¯¹æ¶ˆæ¯ç­¾å的地å€</translation>
</message>
@@ -3299,7 +3242,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3374,10 +3317,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请检查地å€åŽé‡è¯•ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">找ä¸åˆ°ä¸Žè¾“入地å€ç›¸å…³çš„密钥。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">å·²å–消解é”钱包。</translation>
</message>
@@ -3430,6 +3369,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3808,7 +3754,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3946,11 +3892,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT已複製</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">å¤åˆ¶åˆ°å‰ªè´´æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">沒辦法簽署交易。</translation>
</message>
@@ -3960,11 +3901,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't display address</source>
- <translation type="unfinished">無法顯示地å€</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <translation type="unfinished">無法顯示錢包ä½å€</translation>
</message>
</context>
<context>
@@ -4014,6 +3951,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%sæ壞。嘗試使用錢包工具bitcoin-wallet挽救或還原備份。</translation>
+ </message>
+ <message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<translation type="unfinished">%s éªŒè¯ -assumeutxo 快照状æ€å¤±è´¥ã€‚这表明硬件å¯èƒ½æœ‰é—®é¢˜ï¼Œä¹Ÿå¯èƒ½æ˜¯è½¯ä»¶bug,或者还å¯èƒ½æ˜¯è½¯ä»¶è¢«ä¸å½“修改ã€ä»Žè€Œè®©éžæ³•å¿«ç…§ä¹Ÿèƒ½å¤Ÿè¢«åŠ è½½ã€‚因此,将关闭节点并åœæ­¢ä½¿ç”¨ä»Žè¿™ä¸ªå¿«ç…§æž„建出的任何状æ€ï¼Œå¹¶å°†é“¾é«˜åº¦ä»Ž %d é‡ç½®åˆ° %d 。下次å¯åŠ¨æ—¶ï¼ŒèŠ‚点将会ä¸ä½¿ç”¨å¿«ç…§æ•°æ®ä»Ž %d 继续åŒæ­¥ã€‚请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状æ€å¿«ç…§ä»è¢«ä¿å­˜è‡³ç£ç›˜ä¸Šï¼Œä»¥ä¾›è¯Šæ–­é—®é¢˜çš„原因。</translation>
</message>
@@ -4027,7 +3968,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <translation type="unfinished">無法在資料目錄上ç²å–鎖定%s。%så¯èƒ½å·²ç¶“在é‹è¡Œäº†ã€‚</translation>
</message>
<message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
@@ -4055,7 +3996,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ <translation type="unfinished">
+錯誤:轉存檔案識別記錄ä¸æ­£ç¢ºã€‚ç²å¾—%s,é æœŸ
+%s。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
@@ -4094,10 +4037,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">没有æ供钱包格å¼ã€‚è¦ä½¿ç”¨ createfromdump ,必须æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">请检查电脑的日期时间设置是å¦æ­£ç¡®ï¼æ—¶é—´é”™è¯¯å¯èƒ½ä¼šå¯¼è‡´ %s è¿è¡Œå¼‚常。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你认为%s对你比较有用的è¯ï¼Œè¯·å¯¹æˆ‘们进行一些自愿贡献。请访问%s网站æ¥èŽ·å–有关这个软件的更多信æ¯ã€‚</translation>
</message>
@@ -4206,10 +4145,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">åƒæ•¸ -maxmempool 至少è¦çµ¦ %d 百è¬ä½å…ƒçµ„(MB)</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">å‘生了致命的内部错误,请在debug.log中查看详情</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ²’è¾¦æ³•è§£æž -%s åƒæ•¸æŒ‡å®šçš„地å€: '%s'</translation>
</message>
@@ -4344,6 +4279,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4361,7 +4300,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">找ä¸åˆ°asmap文件%s</translation>
+ <translation type="unfinished">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4452,14 +4391,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: %s 所在的ç£ç›˜ç©ºé—´ä½Žã€‚</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">錯誤:轉存檔案的校驗和ä¸åŒ¹é…。%s計算得%s</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—çš„éµä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—的值ä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">錯誤:keypool已用完,請先é‡æ–°å‘¼å«keypoolrefill</translation>
</message>
<message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">錯誤:缺少校驗和</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">錯誤: 沒有å¯ç”¨çš„ %s 地å€</translation>
+ </message>
+ <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4512,6 +4471,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4520,6 +4483,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4544,6 +4515,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">dbcacheä¸è¶³ä»¥ç”¨äºŽåŒºå—验è¯</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">金é¢ä¸è¶³</translation>
+ </message>
+ <message>
<source>Invalid -i2psam address or hostname: '%s'</source>
<translation type="unfinished">无效的 -i2psam 地å€æˆ–主机å: '%s'</translation>
</message>
@@ -4716,10 +4691,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易ä½å…ƒé‡å¤ªå¤§</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh.ts b/src/qt/locale/bitcoin_zh.ts
index 2db719f7c8..3d279e6da0 100644
--- a/src/qt/locale/bitcoin_zh.ts
+++ b/src/qt/locale/bitcoin_zh.ts
@@ -50,10 +50,6 @@
<translation type="unfinished">选择收款人地å€</translation>
</message>
<message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">选择接收比特å¸åœ°å€</translation>
- </message>
- <message>
<source>C&amp;hoose</source>
<translation type="unfinished">选择(&amp;H)</translation>
</message>
@@ -98,10 +94,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ä»˜æ¬¾åœ°å€ - %1</translation>
</message>
<message>
- <source>Receiving addresses - %1</source>
- <translation type="unfinished">æ”¶æ¬¾åœ°å€ - %1</translation>
- </message>
- <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
@@ -184,6 +176,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">注æ„,加密你的钱包并ä¸èƒ½å®Œå…¨ä¿æŠ¤ä½ çš„比特å¸å…å—感染你电脑的æ¶æ„软件的窃å–。</translation>
</message>
@@ -437,7 +437,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -449,6 +449,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">最å°åŒ–</translation>
</message>
<message>
+ <source>Wallet:</source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">更改钱包密ç </translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation type="unfinished">&amp;文件</translation>
</message>
@@ -465,24 +473,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">标签工具æ </translation>
</message>
<message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">正在跟其他節點連線中...</translation>
- </message>
- <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">请求支付 (生æˆäºŒç»´ç å’Œ bitcoin: URI)</translation>
+ <translation type="unfinished">请求支付(生æˆäºŒç»´ç å’Œæ¯”特å¸é“¾æŽ¥)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">显示用过的付款地å€å’Œæ ‡ç­¾çš„列表</translation>
+ <translation type="unfinished">显示使用过的å‘é€åœ°å€æˆ–标签的列表</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">显示用过的收款地å€å’Œæ ‡ç­¾çš„列表</translation>
+ <translation type="unfinished">显示使用接收的地å€æˆ–标签的列表</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">命令行选项(&amp;C)</translation>
+ <translation type="unfinished">&amp;命令行选项</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -492,19 +496,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">è½åŽ %1</translation>
- </message>
- <message>
- <source>Catching up…</source>
- <translation type="unfinished">追上中...</translation>
+ <translation type="unfinished">%1 è½åŽ</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">上次接收到的å—是在%1之å‰ç”Ÿæˆçš„。</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">之åŽçš„交易还ä¸å¯è§ã€‚</translation>
</message>
<message>
<source>Error</source>
@@ -516,11 +516,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">ä¿¡æ¯</translation>
+ <translation type="unfinished">消æ¯</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">已是最新</translation>
+ <translation type="unfinished">最新的</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -569,10 +569,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">從備份檔案中æ¢å¾©éŒ¢åŒ…</translation>
</message>
<message>
- <source>Close all wallets</source>
- <translation type="unfinished">关闭所有钱包</translation>
- </message>
- <message>
<source>Migrate Wallet</source>
<translation type="unfinished">è¿ç§»é’±åŒ…</translation>
</message>
@@ -585,10 +581,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">显示%1帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">é®ä½æ•°å€¼(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">在“概况â€æ ‡ç­¾é¡µä¸­ä¸æ˜Žæ–‡æ˜¾ç¤ºæ•°å€¼ã€åªæ˜¾ç¤ºæŽ©ç </translation>
+ </message>
+ <message>
<source>No wallets available</source>
<translation type="unfinished">æ— å¯ç”¨é’±åŒ…</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">錢包資料</translation>
+ </message>
+ <message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
<translation type="unfinished">載入錢包備份</translation>
@@ -599,6 +608,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">æ¢å¾©éŒ¢åŒ…</translation>
</message>
<message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">錢包å稱</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;窗å£</translation>
</message>
@@ -616,11 +630,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">éšè—(&amp;H)</translation>
+ <translation type="unfinished">&amp;躲</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -630,8 +644,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">點擊查看更多æ“作</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">關閉網路紀錄</translation>
+ </message>
+ <message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">é å…ˆåŒæ­¥æ¨™é ­(%1%)</translation>
+ <translation type="unfinished">预åŒæ­¥åŒºå—头 (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -733,11 +757,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -749,15 +773,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">加上交易费用åŽ:</translation>
- </message>
- <message>
- <source>Change:</source>
- <translation type="unfinished">找零:</translation>
- </message>
- <message>
- <source>(un)select all</source>
- <translation type="unfinished">å…¨(ä¸)选</translation>
+ <translation type="unfinished">計費後金é¡:</translation>
</message>
<message>
<source>Tree mode</source>
@@ -772,40 +788,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金é¢</translation>
</message>
<message>
- <source>Received with label</source>
- <translation type="unfinished">收款标签</translation>
- </message>
- <message>
<source>Received with address</source>
<translation type="unfinished">收款地å€</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">日期</translation>
- </message>
- <message>
- <source>Confirmations</source>
- <translation type="unfinished">确认</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
- </message>
- <message>
<source>Copy amount</source>
<translation type="unfinished">å¤åˆ¶é‡‘é¢</translation>
</message>
<message>
<source>&amp;Copy address</source>
- <translation type="unfinished">&amp;複製地å€</translation>
+ <translation type="unfinished">å¤åˆ¶åœ°å€(&amp;C)</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">複製 &amp;label</translation>
+ <translation type="unfinished">å¤åˆ¶æ ‡ç­¾(&amp;L)</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">複製 &amp;amount</translation>
+ <translation type="unfinished">å¤åˆ¶å’Œæ•°é‡</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -816,10 +816,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">é”定未花费(&amp;O)</translation>
</message>
<message>
- <source>&amp;Unlock unspent</source>
- <translation type="unfinished">解é”未花费(&amp;U)</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">å¤åˆ¶æ•°ç›®</translation>
</message>
@@ -829,54 +825,33 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">å¤åˆ¶å«äº¤æ˜“费的金é¢</translation>
+ <translation type="unfinished">複製計費後金é¡</translation>
</message>
<message>
<source>Copy bytes</source>
<translation type="unfinished">å¤åˆ¶å­—节数</translation>
</message>
<message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished">æ¯ä¸ªè¾“å…¥å¯èƒ½æœ‰ +/- %1 èª (satoshi) 的误差。</translation>
+ <source>Copy change</source>
+ <translation type="unfinished">複製找零金é¡</translation>
</message>
<message>
- <source>(no label)</source>
- <translation type="unfinished">(无标签)</translation>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1å·²é”定)</translation>
</message>
<message>
- <source>change from %1 (%2)</source>
- <translation type="unfinished">æ¥è‡ª %1 的找零 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
+ <source>(no label)</source>
+ <translation type="unfinished">(无标签)</translation>
</message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">创建钱包</translation>
- </message>
- <message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
<translation type="unfinished">正在创建钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
<message>
- <source>Create wallet failed</source>
- <translation type="unfinished">创建钱包失败</translation>
- </message>
- <message>
- <source>Create wallet warning</source>
- <translation type="unfinished">创建钱包警告</translation>
- </message>
- <message>
- <source>Can't list signers</source>
- <translation type="unfinished">无法列出签å器</translation>
- </message>
- <message>
<source>Too many external signers found</source>
<translation type="unfinished">åµæ¸¬åˆ°çš„外接簽å器éŽå¤š</translation>
</message>
@@ -943,10 +918,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打开钱包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
@@ -993,7 +964,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">您确定想è¦å…³é—­é’±åŒ…&lt;i&gt;%1&lt;/i&gt;å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰éŒ¢åŒ…&lt;i&gt;%1 &lt;/i&gt;嗎?</translation>
</message>
<message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
@@ -1005,7 +976,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1068,7 +1039,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
<message>
<source>Compiled without external signing support (required for external signing)</source>
@@ -1092,7 +1063,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">跟這個地å€æ¸…單關è¯çš„地å€ã€‚åªæœ‰ç™¼é€åœ°å€èƒ½è¢«ä¿®æ”¹ã€‚</translation>
+ <translation type="unfinished">与这个地å€åˆ—表项关è”的地å€ã€‚åªæœ‰å‘é€åœ°å€å¯ä»¥ä¿®æ”¹ã€‚</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -1116,7 +1087,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">地å€â€œ%1â€å·²ç»å­˜åœ¨ï¼Œå®ƒæ˜¯ä¸€ä¸ªæ”¶æ¬¾åœ°å€ï¼Œæ ‡ç­¾ä¸ºâ€œ%2â€ï¼Œæ‰€ä»¥å®ƒä¸èƒ½ä½œä¸ºä¸€ä¸ªä»˜æ¬¾åœ°å€è¢«æ·»åŠ è¿›æ¥ã€‚</translation>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1139,7 +1110,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1147,7 +1118,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1188,7 +1159,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1219,7 +1190,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <translation type="unfinished">歡迎來到 %1。</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
@@ -1231,7 +1202,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">å–消此设置需è¦é‡æ–°ä¸‹è½½æ•´ä¸ªåŒºå—链。先完整下载整æ¡é“¾å†è¿›è¡Œä¿®å‰ªä¼šæ›´å¿«ã€‚这会ç¦ç”¨ä¸€äº›é«˜çº§åŠŸèƒ½ã€‚</translation>
+ <translation type="unfinished">æ¢å¾©æ­¤è¨­å®šéœ€è¦é‡æ–°ä¸‹è¼‰æ•´å€‹å€å¡Šéˆã€‚ 先下載完整éˆç„¶å¾Œå†ä¿®å‰ªå®ƒçš„速度更快。 ç¦ç”¨ä¸€äº›é«˜ç´šåŠŸèƒ½ã€‚</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
@@ -1277,7 +1248,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1288,15 +1259,15 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">近期交易å¯èƒ½å°šæœªæ˜¾ç¤ºï¼Œå› æ­¤å½“å‰ä½™é¢å¯èƒ½ä¸å‡†ç¡®ã€‚以上信æ¯å°†åœ¨ä¸Žæ¯”特å¸ç½‘络完全åŒæ­¥åŽæ›´æ­£ã€‚详情如下</translation>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">å°è¯•ä½¿ç”¨å—未å¯è§äº¤æ˜“å½±å“çš„ä½™é¢å°†ä¸è¢«ç½‘络接å—。</translation>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1308,7 +1279,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1320,7 +1291,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1328,7 +1299,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
- <translation type="unfinished">%1ç›®å‰æ­£åœ¨åŒæ­¥ä¸­ã€‚它会从其他节点下载区å—头和区å—æ•°æ®å¹¶è¿›è¡ŒéªŒè¯ï¼Œç›´åˆ°æŠµè¾¾åŒºå—链尖端。</translation>
+ <translation type="unfinished">%1 當å‰æ­£åœ¨åŒæ­¥ã€‚它將從peers下載å€å¡Šé ­å’Œå€å¡Šï¼Œä¸¦å°å…¶é€²è¡Œé©—證,直到到é”å€å¡Šéˆçš„頂為止。</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
@@ -1348,7 +1319,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Paste address from clipboard</source>
<extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
</context>
<context>
@@ -1359,11 +1330,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1375,11 +1346,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
@@ -2147,10 +2118,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">传输</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID,如果有的è¯ã€‚</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">会è¯ID</translation>
</message>
@@ -2257,6 +2224,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/é¡žåž‹</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">這個節點是é€éŽé€™ç¨®ç¶²è·¯å”定連接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2319,7 +2290,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>&amp;Open</source>
@@ -2425,7 +2396,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2449,6 +2420,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2484,7 +2459,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2635,7 +2610,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Could not generate new %1 address</source>
- <translation type="unfinished">无法生æˆæ–°çš„%1地å€</translation>
+ <translation type="unfinished">無法產生新的 %1 地å€</translation>
</message>
</context>
<context>
@@ -2674,11 +2649,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2708,10 +2683,6 @@ For more information on using this console, type %6.
<translation type="unfinished">消æ¯</translation>
</message>
<message>
- <source>(no label)</source>
- <translation type="unfinished">(无标签)</translation>
- </message>
- <message>
<source>(no message)</source>
<translation type="unfinished">(无消æ¯)</translation>
</message>
@@ -2816,7 +2787,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2830,9 +2801,9 @@ For more information on using this console, type %6.
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">指定交易虚拟大å°çš„æ¯kB (1,000字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–50è°çš„手續費。</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
@@ -2888,13 +2859,17 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">å¤åˆ¶å«äº¤æ˜“费的金é¢</translation>
+ <translation type="unfinished">複製計費後金é¡</translation>
</message>
<message>
<source>Copy bytes</source>
<translation type="unfinished">å¤åˆ¶å­—节数</translation>
</message>
<message>
+ <source>Copy change</source>
+ <translation type="unfinished">複製找零金é¡</translation>
+ </message>
+ <message>
<source>%1 (%2 blocks)</source>
<translation type="unfinished">%1 (%2个å—)</translation>
</message>
@@ -2918,7 +2893,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签å比特å¸äº¤æ˜“â€ï¼ˆPSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <translation type="unfinished">產生一個部分簽å的比特幣交易(PSBT)以用於例如離線%1錢包或與PSBT相容的硬體錢包。</translation>
</message>
<message>
<source>Save Transaction Data</source>
@@ -2930,10 +2905,19 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">部分簽å交易(二進ä½)</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
<message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">請檢查您的交易æ案。這將產生部分簽å的比特幣交易(PSBT),您å¯ä»¥å„²å­˜æˆ–複製該交易,然後使用簽å。離線%1錢包或與PSBT相容的硬體錢包。</translation>
+ </message>
+ <message>
<source>%1 from wallet '%2'</source>
<translation type="unfinished">%1 æ¥è‡ªé’±åŒ… “%2â€</translation>
</message>
@@ -3036,11 +3020,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
<translation type="unfinished">你选择的找零地å€æœªè¢«åŒ…å«åœ¨æœ¬é’±åŒ…中,你钱包中的部分或全部金é¢å°†è¢«å‘é€è‡³è¯¥åœ°å€ã€‚你确定è¦è¿™æ ·åšå—?</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(无标签)</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -3060,12 +3040,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">选择以å‰ç”¨è¿‡çš„地å€</translation>
</message>
<message>
- <source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">付款目的地å€</translation>
- </message>
- <message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3122,10 +3098,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">消æ¯ç­¾å(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ç”¨ä½ çš„地å€å¯¹æ¶ˆæ¯/å议进行签å,以è¯æ˜Žæ‚¨å¯ä»¥æŽ¥æ”¶å‘é€åˆ°è¯¥åœ°å€çš„比特å¸ã€‚注æ„ä¸è¦å¯¹ä»»ä½•æ¨¡æ£±ä¸¤å¯æˆ–者éšæœºçš„消æ¯è¿›è¡Œç­¾å,以å…é­å—é’“é±¼å¼æ”»å‡»ã€‚请确ä¿æ¶ˆæ¯å†…容准确的表达了您的真实æ„愿。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用æ¥å¯¹æ¶ˆæ¯ç­¾å的地å€</translation>
</message>
@@ -3135,7 +3107,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3210,10 +3182,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请检查地å€åŽé‡è¯•ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">找ä¸åˆ°ä¸Žè¾“入地å€ç›¸å…³çš„密钥。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">å·²å–消解é”钱包。</translation>
</message>
@@ -3266,6 +3234,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3510,10 +3485,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">(ä¸å¯ç”¨)</translation>
</message>
<message>
- <source>(no label)</source>
- <translation type="unfinished">(无标签)</translation>
- </message>
- <message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
<translation type="unfinished">交易状æ€ã€‚ 鼠标移到此区域å¯æ˜¾ç¤ºç¡®è®¤æ•°ã€‚</translation>
</message>
@@ -3648,7 +3619,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3782,11 +3753,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT已複製</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">å¤åˆ¶åˆ°å‰ªè´´æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">无法签å交易</translation>
</message>
@@ -3796,11 +3762,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't display address</source>
- <translation type="unfinished">無法顯示地å€</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <translation type="unfinished">無法顯示錢包ä½å€</translation>
</message>
</context>
<context>
@@ -3818,6 +3780,11 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">备份钱包</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">錢包資料</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">备份失败</translation>
</message>
@@ -3846,7 +3813,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%sæŸå。请å°è¯•ç”¨bitcoin-wallet钱包工具æ¥å¯¹å…¶è¿›è¡Œæ€¥æ•‘。或者用一个备份进行还原。</translation>
+ <translation type="unfinished">%sæ壞。嘗試使用錢包工具bitcoin-wallet挽救或還原備份。</translation>
</message>
<message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
@@ -3862,7 +3829,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <translation type="unfinished">無法在資料目錄上ç²å–鎖定%s。%så¯èƒ½å·²ç¶“在é‹è¡Œäº†ã€‚</translation>
</message>
<message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
@@ -3890,7 +3857,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ <translation type="unfinished">
+錯誤:轉存檔案識別記錄ä¸æ­£ç¢ºã€‚ç²å¾—%s,é æœŸ
+%s。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
@@ -3929,10 +3898,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒有æ供錢包格å¼ã€‚ è¦ä½¿ç”¨ createfromdump ,必須æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">请检查电脑的日期时间设置是å¦æ­£ç¡®ï¼æ—¶é—´é”™è¯¯å¯èƒ½ä¼šå¯¼è‡´ %s è¿è¡Œå¼‚常。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你认为%s对你比较有用的è¯ï¼Œè¯·å¯¹æˆ‘们进行一些自愿贡献。请访问%s网站æ¥èŽ·å–有关这个软件的更多信æ¯ã€‚</translation>
</message>
@@ -4041,10 +4006,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool 最å°ä¸º%d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">å‘生了致命的内部错误,请在debug.log中查看详情</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ— æ³•è§£æž - %s 地å€: '%s'</translation>
</message>
@@ -4179,6 +4140,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4196,7 +4161,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">找ä¸åˆ°asmap文件%s</translation>
+ <translation type="unfinished">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4279,10 +4244,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法从生æˆçš„scriptpubkeyæå–目标</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">錯誤:轉存檔案的校驗和ä¸åŒ¹é…。%s計算得%s</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—çš„éµä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—的值ä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">錯誤:缺少校驗和</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">錯誤: 沒有å¯ç”¨çš„ %s 地å€</translation>
+ </message>
+ <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4331,10 +4316,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4347,6 +4344,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">dbcacheä¸è¶³ä»¥ç”¨äºŽåŒºå—验è¯</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">金é¢ä¸è¶³</translation>
+ </message>
+ <message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation type="unfinished">%s=&lt;amount&gt;: '%s' 中指定了éžæ³•çš„é‡‘é¢ (必须至少达到 %s)</translation>
</message>
@@ -4403,10 +4404,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易需è¦ä¸€ä¸ªæ‰¾é›¶åœ°å€ï¼Œä½†æ˜¯æˆ‘们无法生æˆå®ƒã€‚</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to find UTXO for external input</source>
<translation type="unfinished">无法为外部输入找到UTXO</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts
index 21f57a8f6d..7bab106bd5 100644
--- a/src/qt/locale/bitcoin_zh_CN.ts
+++ b/src/qt/locale/bitcoin_zh_CN.ts
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入此钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">请注æ„,当您的计算机感染æ¶æ„软件时,加密钱包并ä¸èƒ½å®Œå…¨è§„é¿æ‚¨çš„比特å¸è¢«å·çªƒçš„å¯èƒ½ã€‚</translation>
</message>
@@ -433,7 +441,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 B</source>
<translation type="unfinished">%1 字节</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -611,7 +623,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">连到åŒè¡Œ...</translation>
+ <translation type="unfinished">连接到节点...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -641,15 +653,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">赶上...</translation>
+ <translation type="unfinished">正在追上进度...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -746,10 +758,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">在“概况â€æ ‡ç­¾é¡µä¸­ä¸æ˜Žæ–‡æ˜¾ç¤ºæ•°å€¼ã€åªæ˜¾ç¤ºæŽ©ç </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -1039,62 +1047,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1å·²é”定)</translation>
</message>
<message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished">æ¯ä¸ªè¾“å…¥å¯èƒ½æœ‰ +/- %1 èª (satoshi) 的误差。</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- <message>
- <source>change from %1 (%2)</source>
- <translation type="unfinished">æ¥è‡ª %1 的找零 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">创建钱包</translation>
- </message>
- <message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
- <translation type="unfinished">创建钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
- </message>
- <message>
- <source>Create wallet failed</source>
- <translation type="unfinished">创建钱包失败</translation>
- </message>
- <message>
- <source>Create wallet warning</source>
- <translation type="unfinished">创建钱包警告</translation>
- </message>
- <message>
- <source>Can't list signers</source>
- <translation type="unfinished">无法列出签å器</translation>
+ <translation type="unfinished">正在创建钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
<message>
<source>Too many external signers found</source>
- <translation type="unfinished">找到的外部签å器太多</translation>
- </message>
-</context>
-<context>
- <name>LoadWalletsActivity</name>
- <message>
- <source>Load Wallets</source>
- <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
- <translation type="unfinished">加载钱包</translation>
- </message>
- <message>
- <source>Loading wallets…</source>
- <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">加载钱包...</translation>
+ <translation type="unfinished">åµæ¸¬åˆ°çš„外接簽å器éŽå¤š</translation>
</message>
</context>
<context>
@@ -1159,10 +1125,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打开钱包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
@@ -2363,10 +2325,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">传输</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID,如果有的è¯ã€‚</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">会è¯ID</translation>
</message>
@@ -2473,6 +2431,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">这个节点是通过这ç§ç½‘络å议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2665,6 +2627,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -3386,10 +3352,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">消æ¯ç­¾å(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ç”¨ä½ çš„地å€å¯¹æ¶ˆæ¯/å议进行签å,以è¯æ˜Žæ‚¨å¯ä»¥æŽ¥æ”¶å‘é€åˆ°è¯¥åœ°å€çš„比特å¸ã€‚注æ„ä¸è¦å¯¹ä»»ä½•æ¨¡æ£±ä¸¤å¯æˆ–者éšæœºçš„消æ¯è¿›è¡Œç­¾å,以å…é­å—é’“é±¼å¼æ”»å‡»ã€‚请确ä¿æ¶ˆæ¯å†…容准确的表达了您的真实æ„愿。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用æ¥å¯¹æ¶ˆæ¯ç­¾å的地å€</translation>
</message>
@@ -3474,10 +3436,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请检查地å€åŽé‡è¯•ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">找ä¸åˆ°ä¸Žè¾“入地å€ç›¸å…³çš„密钥。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">å·²å–消解é”钱包。</translation>
</message>
@@ -4046,11 +4004,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">å·²å¤åˆ¶PSBT</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">å¤åˆ¶åˆ°å‰ªè´´æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">无法签å交易</translation>
</message>
@@ -4062,10 +4015,6 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Can't display address</source>
<translation type="unfinished">无法显示地å€</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4198,10 +4147,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">没有æ供钱包格å¼ã€‚è¦ä½¿ç”¨ createfromdump ,必须æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">请检查电脑的日期时间设置是å¦æ­£ç¡®ï¼æ—¶é—´é”™è¯¯å¯èƒ½ä¼šå¯¼è‡´ %s è¿è¡Œå¼‚常。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你认为%s对你比较有用的è¯ï¼Œè¯·å¯¹æˆ‘们进行一些自愿贡献。请访问%s网站æ¥èŽ·å–有关这个软件的更多信æ¯ã€‚</translation>
</message>
@@ -4310,10 +4255,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool 最å°ä¸º%d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">å‘生了致命的内部错误,请在debug.log中查看详情</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ— æ³•è§£æž - %s 地å€: '%s'</translation>
</message>
@@ -4448,6 +4389,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4640,6 +4585,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">监å¬ç«¯å£å¤±è´¥ã€‚如果你愿æ„çš„è¯ï¼Œè¯·ä½¿ç”¨ -listen=0 å‚数。</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">åˆå§‹åŒ–æ—¶é‡æ‰«æ钱包失败</translation>
</message>
@@ -4652,6 +4601,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4904,10 +4861,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易过大</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">无法在本机绑定%sç«¯å£ (bind函数返回了错误 %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts
index 55551bfe71..174ae53fba 100644
--- a/src/qt/locale/bitcoin_zh_HK.ts
+++ b/src/qt/locale/bitcoin_zh_HK.ts
@@ -183,6 +183,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">請輸入舊密碼和新密碼至錢包。</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">請記得將錢包加密ä¸èƒ½å®Œå…¨é˜²æ­¢ä½ çš„ Bitcoins 經被入侵電腦的惡æ„程å¼å·å–。</translation>
</message>
@@ -265,6 +273,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未æ•èŽ·çš„异常</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">發生致命錯誤。 %1無法å†ç¹¼çºŒå®‰å…¨åœ°é‹è¡Œä¸¦é›¢é–‹ã€‚</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">內部錯誤</translation>
</message>
@@ -432,6 +444,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">é è¨­éŒ¢åŒ…</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -521,16 +537,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">收款 &amp;R</translation>
</message>
<message>
- <source>&amp;Options…</source>
- <translation type="unfinished">选项(&amp;O)</translation>
- </message>
- <message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">加密钱包(&amp;E)</translation>
- </message>
- <message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">把你钱包中的ç§é’¥åŠ å¯†</translation>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -541,22 +549,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">修改密ç (&amp;C)</translation>
</message>
<message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">ç­¾å消æ¯(&amp;M)</translation>
- </message>
- <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">用比特å¸åœ°å€å…³è”çš„ç§é’¥ä¸ºæ¶ˆæ¯ç­¾å,以è¯æ˜Žæ‚¨æ‹¥æœ‰è¿™ä¸ªæ¯”特å¸åœ°å€</translation>
</message>
<message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">验è¯æ¶ˆæ¯(&amp;V)</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">校验消æ¯ï¼Œç¡®ä¿è¯¥æ¶ˆæ¯æ˜¯ç”±æŒ‡å®šçš„比特å¸åœ°å€æ‰€æœ‰è€…ç­¾åçš„</translation>
- </message>
- <message>
<source>&amp;Load PSBT from file…</source>
<translation type="unfinished">从文件加载PSBT(&amp;L)...</translation>
</message>
@@ -573,10 +569,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">创建钱包...</translation>
</message>
<message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">关闭所有钱包...</translation>
- </message>
- <message>
<source>&amp;File</source>
<translation type="unfinished">檔案 &amp;F</translation>
</message>
@@ -590,15 +582,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">标签页工具æ </translation>
- </message>
- <message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">åŒæ­¥åŒºå—头 (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">与网络åŒæ­¥...</translation>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -610,7 +594,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">连到åŒè¡Œ...</translation>
+ <translation type="unfinished">连接到节点...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -640,15 +624,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">赶上...</translation>
+ <translation type="unfinished">正在追上进度...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -734,7 +718,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示 %1 帮助信æ¯ï¼ŒèŽ·å–å¯ç”¨å‘½ä»¤è¡Œé€‰é¡¹åˆ—表</translation>
+ <translation type="unfinished">显示%1帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -745,10 +729,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">在“概况â€æ ‡ç­¾é¡µä¸­ä¸æ˜Žæ–‡æ˜¾ç¤ºæ•°å€¼ã€åªæ˜¾ç¤ºæŽ©ç </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">é è¨­éŒ¢åŒ…</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -770,7 +750,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">钱包å称</translation>
+ <translation type="unfinished">錢包å稱</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -786,15 +766,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">éšè—(&amp;H)</translation>
+ <translation type="unfinished">&amp;躲</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -806,26 +786,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">点击查看更多æ“作。</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">显示节点标签</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">ç¦ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">點擊查看更多æ“作</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">å¯ç”¨ç½‘络活动</translation>
+ <translation type="unfinished">關閉網路紀錄</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">é å…ˆåŒæ­¥æ¨™é ­(%1%)</translation>
+ <translation type="unfinished">预åŒæ­¥åŒºå—头 (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -905,7 +875,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且已&lt;b&gt;上鎖&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -927,11 +897,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -939,21 +909,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Fee:</source>
- <translation type="unfinished">费用:</translation>
+ <translation type="unfinished">費用:</translation>
</message>
<message>
<source>After Fee:</source>
<translation type="unfinished">計費後金é¡:</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">找零:</translation>
- </message>
- <message>
- <source>(un)select all</source>
- <translation type="unfinished">å…¨(ä¸)选</translation>
- </message>
- <message>
<source>Tree mode</source>
<translation type="unfinished">树状模å¼</translation>
</message>
@@ -966,18 +928,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金é¢</translation>
</message>
<message>
- <source>Received with label</source>
- <translation type="unfinished">收款标签</translation>
- </message>
- <message>
<source>Received with address</source>
<translation type="unfinished">收款地å€</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">日期</translation>
- </message>
- <message>
<source>Confirmed</source>
<translation type="unfinished">已確èª</translation>
</message>
@@ -1006,10 +960,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">é”定未花费(&amp;O)</translation>
</message>
<message>
- <source>&amp;Unlock unspent</source>
- <translation type="unfinished">解é”未花费(&amp;U)</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">å¤åˆ¶æ•°ç›®</translation>
</message>
@@ -1045,11 +995,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1141,10 +1087,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">é è¨­éŒ¢åŒ…</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">開啟錢包</translation>
@@ -1194,7 +1136,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1245,7 +1187,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
</context>
<context>
@@ -1284,7 +1226,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">地å€â€œ%1â€å·²ç»å­˜åœ¨ï¼Œå®ƒæ˜¯ä¸€ä¸ªæ”¶æ¬¾åœ°å€ï¼Œæ ‡ç­¾ä¸ºâ€œ%2â€ï¼Œæ‰€ä»¥å®ƒä¸èƒ½ä½œä¸ºä¸€ä¸ªä»˜æ¬¾åœ°å€è¢«æ·»åŠ è¿›æ¥ã€‚</translation>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1307,7 +1249,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1315,7 +1257,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1352,7 +1294,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1383,7 +1325,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <translation type="unfinished">歡迎來到 %1。</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
@@ -1391,7 +1333,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">å–消此设置需è¦é‡æ–°ä¸‹è½½æ•´ä¸ªåŒºå—链。先完整下载整æ¡é“¾å†è¿›è¡Œä¿®å‰ªä¼šæ›´å¿«ã€‚这会ç¦ç”¨ä¸€äº›é«˜çº§åŠŸèƒ½ã€‚</translation>
+ <translation type="unfinished">æ¢å¾©æ­¤è¨­å®šéœ€è¦é‡æ–°ä¸‹è¼‰æ•´å€‹å€å¡Šéˆã€‚ 先下載完整éˆç„¶å¾Œå†ä¿®å‰ªå®ƒçš„速度更快。 ç¦ç”¨ä¸€äº›é«˜ç´šåŠŸèƒ½ã€‚</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
@@ -1437,7 +1379,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1448,15 +1390,15 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">近期交易å¯èƒ½å°šæœªæ˜¾ç¤ºï¼Œå› æ­¤å½“å‰ä½™é¢å¯èƒ½ä¸å‡†ç¡®ã€‚以上信æ¯å°†åœ¨ä¸Žæ¯”特å¸ç½‘络完全åŒæ­¥åŽæ›´æ­£ã€‚详情如下</translation>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">å°è¯•ä½¿ç”¨å—未å¯è§äº¤æ˜“å½±å“çš„ä½™é¢å°†ä¸è¢«ç½‘络接å—。</translation>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1468,7 +1410,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1480,7 +1422,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1508,7 +1450,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Paste address from clipboard</source>
<extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
</context>
<context>
@@ -1519,11 +1461,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1535,11 +1477,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
@@ -2219,11 +2161,11 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Network</source>
- <translation type="unfinished">网络</translation>
+ <translation type="unfinished">網路</translation>
</message>
<message>
<source>Name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">å稱</translation>
</message>
<message>
<source>Number of connections</source>
@@ -2286,10 +2228,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">传输</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID,如果有的è¯ã€‚</translation>
- </message>
- <message>
<source>Session ID</source>
<translation type="unfinished">会è¯ID</translation>
</message>
@@ -2396,6 +2334,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">这个节点是通过这ç§ç½‘络å议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2458,7 +2400,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>&amp;Open</source>
@@ -2564,7 +2506,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2588,6 +2530,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">沒有</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2623,7 +2569,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2813,11 +2759,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2955,7 +2901,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2969,9 +2915,9 @@ For more information on using this console, type %6.
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">指定交易虚拟大å°çš„æ¯kB (1,000字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–50è°çš„手續費。</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
@@ -3086,6 +3032,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">部分签å交易(二进制)</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3094,6 +3044,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ä½ å¯ä»¥ä¹‹å¾Œå†æ高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">請檢查您的交易æ案。這將產生部分簽å的比特幣交易(PSBT),您å¯ä»¥å„²å­˜æˆ–複製該交易,然後使用簽å。離線%1錢包或與PSBT相容的硬體錢包。</translation>
+ </message>
+ <message>
<source>%1 from wallet '%2'</source>
<translation type="unfinished">%1 æ¥è‡ªé’±åŒ… “%2â€</translation>
</message>
@@ -3225,7 +3180,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3282,10 +3237,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">簽署訊æ¯(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ä½¿ç”¨æ‚¨çš„地å€ç°½å訊æ¯/å”議,以證明您å¯ä»¥æŽ¥æ”¶ç™¼é€çµ¦ä»–們的比特幣。但是請å°å¿ƒï¼Œä¸è¦ç°½å語æ„å«ç³Šä¸æ¸…,或隨機產生的內容,因為釣魚å¼è©é¨™å¯èƒ½æœƒç”¨é¨™ä½ ç°½å的手法來冒充是你。åªæœ‰ç°½å您åŒæ„的詳細內容。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用æ¥å¯¹æ¶ˆæ¯ç­¾å的地å€</translation>
</message>
@@ -3295,7 +3246,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">从剪贴æ¿ç²˜è´´åœ°å€</translation>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3370,10 +3321,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请检查地å€åŽé‡è¯•ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">找ä¸åˆ°ä¸Žè¾“入地å€ç›¸å…³çš„密钥。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">å·²å–消解é”钱包。</translation>
</message>
@@ -3426,6 +3373,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3942,11 +3896,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT已複製</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">å¤åˆ¶åˆ°å‰ªè´´æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">沒辦法簽署交易。</translation>
</message>
@@ -3956,11 +3905,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't display address</source>
- <translation type="unfinished">無法顯示地å€</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">é è¨­éŒ¢åŒ…</translation>
+ <translation type="unfinished">無法顯示錢包ä½å€</translation>
</message>
</context>
<context>
@@ -4010,6 +3955,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%sæ壞。嘗試使用錢包工具bitcoin-wallet挽救或還原備份。</translation>
+ </message>
+ <message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<translation type="unfinished">%s éªŒè¯ -assumeutxo 快照状æ€å¤±è´¥ã€‚这表明硬件å¯èƒ½æœ‰é—®é¢˜ï¼Œä¹Ÿå¯èƒ½æ˜¯è½¯ä»¶bug,或者还å¯èƒ½æ˜¯è½¯ä»¶è¢«ä¸å½“修改ã€ä»Žè€Œè®©éžæ³•å¿«ç…§ä¹Ÿèƒ½å¤Ÿè¢«åŠ è½½ã€‚因此,将关闭节点并åœæ­¢ä½¿ç”¨ä»Žè¿™ä¸ªå¿«ç…§æž„建出的任何状æ€ï¼Œå¹¶å°†é“¾é«˜åº¦ä»Ž %d é‡ç½®åˆ° %d 。下次å¯åŠ¨æ—¶ï¼ŒèŠ‚点将会ä¸ä½¿ç”¨å¿«ç…§æ•°æ®ä»Ž %d 继续åŒæ­¥ã€‚请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状æ€å¿«ç…§ä»è¢«ä¿å­˜è‡³ç£ç›˜ä¸Šï¼Œä»¥ä¾›è¯Šæ–­é—®é¢˜çš„原因。</translation>
</message>
@@ -4023,7 +3972,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <translation type="unfinished">無法在資料目錄上ç²å–鎖定%s。%så¯èƒ½å·²ç¶“在é‹è¡Œäº†ã€‚</translation>
</message>
<message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
@@ -4051,7 +4000,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ <translation type="unfinished">
+錯誤:轉存檔案識別記錄ä¸æ­£ç¢ºã€‚ç²å¾—%s,é æœŸ
+%s。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
@@ -4090,10 +4041,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">没有æ供钱包格å¼ã€‚è¦ä½¿ç”¨ createfromdump ,必须æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">请检查电脑的日期时间设置是å¦æ­£ç¡®ï¼æ—¶é—´é”™è¯¯å¯èƒ½ä¼šå¯¼è‡´ %s è¿è¡Œå¼‚常。</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你认为%s对你比较有用的è¯ï¼Œè¯·å¯¹æˆ‘们进行一些自愿贡献。请访问%s网站æ¥èŽ·å–有关这个软件的更多信æ¯ã€‚</translation>
</message>
@@ -4202,10 +4149,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">åƒæ•¸ -maxmempool 至少è¦çµ¦ %d 百è¬ä½å…ƒçµ„(MB)</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">å‘生了致命的内部错误,请在debug.log中查看详情</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ²’è¾¦æ³•è§£æž -%s åƒæ•¸æŒ‡å®šçš„地å€: '%s'</translation>
</message>
@@ -4340,6 +4283,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4357,7 +4304,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">找ä¸åˆ°asmap文件%s</translation>
+ <translation type="unfinished">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4448,14 +4395,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: %s 所在的ç£ç›˜ç©ºé—´ä½Žã€‚</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">錯誤:轉存檔案的校驗和ä¸åŒ¹é…。%s計算得%s</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—çš„éµä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—的值ä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">錯誤:keypool已用完,請先é‡æ–°å‘¼å«keypoolrefill</translation>
</message>
<message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">錯誤:缺少校驗和</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">錯誤: 沒有å¯ç”¨çš„ %s 地å€</translation>
+ </message>
+ <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4508,6 +4475,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4516,6 +4487,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4540,6 +4519,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">dbcacheä¸è¶³ä»¥ç”¨äºŽåŒºå—验è¯</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">金é¢ä¸è¶³</translation>
+ </message>
+ <message>
<source>Invalid -i2psam address or hostname: '%s'</source>
<translation type="unfinished">无效的 -i2psam 地å€æˆ–主机å: '%s'</translation>
</message>
@@ -4712,10 +4695,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易ä½å…ƒé‡å¤ªå¤§</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_TW.ts b/src/qt/locale/bitcoin_zh_TW.ts
index 17332db7b1..72432891a9 100644
--- a/src/qt/locale/bitcoin_zh_TW.ts
+++ b/src/qt/locale/bitcoin_zh_TW.ts
@@ -179,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">輸入錢包的密碼短語和新密碼短語。</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">繼續</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">返回</translation>
+ </message>
+ <message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
<translation type="unfinished">請記得, å³ä½¿å°‡éŒ¢åŒ…加密, 也ä¸èƒ½å®Œå…¨é˜²æ­¢å› æƒ¡æ„軟體入侵, 而導致ä½å…ƒå¹£è¢«å·.</translation>
</message>
@@ -287,7 +295,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error: %1</source>
- <translation type="unfinished">錯誤:%1</translation>
+ <translation type="unfinished">错误:%1</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
@@ -436,6 +444,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -525,57 +537,40 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;é¸é …...</translation>
</message>
<message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;加密錢包...</translation>
- </message>
- <message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;備用錢包</translation>
+ <translation type="unfinished">备份钱包(&amp;B)</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;更改密碼短語...</translation>
- </message>
- <message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">ç°½å &amp;ä¿¡æ¯â€¦</translation>
+ <translation type="unfinished">修改密ç (&amp;C)</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">用比特幣地å€ç°½å訊æ¯ä¾†è­‰æ˜Žä½å€æ˜¯ä½ çš„</translation>
</message>
<message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">&amp;é©—è­‰
-訊æ¯...</translation>
- </message>
- <message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
<translation type="unfinished">驗證訊æ¯æ˜¯ç”¨ä¾†ç¢ºå®šè¨Šæ¯æ˜¯ç”¨æŒ‡å®šçš„比特幣地å€ç°½åçš„</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;從檔案載入PSBT...</translation>
+ <translation type="unfinished">从文件加载PSBT(&amp;L)...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
- <translation type="unfinished">é–‹å•Ÿ &amp;URI...</translation>
+ <translation type="unfinished">打开&amp;URI...</translation>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">關錢包..</translation>
+ <translation type="unfinished">关闭钱包...</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">創建錢包...</translation>
- </message>
- <message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">關所有錢包...</translation>
+ <translation type="unfinished">创建钱包...</translation>
</message>
<message>
<source>&amp;File</source>
@@ -594,24 +589,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">åŒæ­¥å€å¡Šé ­ (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">正在與網絡åŒæ­¥â€¦</translation>
- </message>
- <message>
<source>Indexing blocks on disk…</source>
- <translation type="unfinished">索引ç£ç›¤ä¸Šçš„索引塊中...</translation>
+ <translation type="unfinished">对ç£ç›˜ä¸Šçš„区å—进行索引...</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">處ç†ç£ç¢Ÿè£¡çš„å€å¡Šä¸­...</translation>
+ <translation type="unfinished">处ç†ç£ç›˜ä¸Šçš„区å—...</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">正在跟其他節點連線中...</translation>
+ <translation type="unfinished">连到åŒè¡Œ...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -641,7 +628,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">追上中...</translation>
+ <translation type="unfinished">赶上...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -746,10 +733,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">é®è”½â€œæ¦‚è¿°â€é¸é …å¡ä¸­çš„值</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">é è¨­éŒ¢åŒ…</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -838,7 +821,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error: %1</source>
- <translation type="unfinished">錯誤:%1</translation>
+ <translation type="unfinished">错误:%1</translation>
</message>
<message>
<source>Warning: %1</source>
@@ -992,15 +975,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Copy address</source>
- <translation type="unfinished">&amp;複製地å€</translation>
+ <translation type="unfinished">&amp;å¤åˆ¶åœ°å€</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">複製 &amp;label</translation>
+ <translation type="unfinished">å¤åˆ¶å’Œæ ‡ç­¾</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">複製 &amp;amount</translation>
+ <translation type="unfinished">å¤åˆ¶å’Œæ•°é‡</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -1146,10 +1129,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">é è¨­éŒ¢åŒ…</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打開錢包</translation>
@@ -2305,10 +2284,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">傳輸</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">HEXæ ¼å¼çš„BIP324 session ID,如果有的話。</translation>
- </message>
- <message>
<source>Version</source>
<translation type="unfinished">版本</translation>
</message>
@@ -2411,6 +2386,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/é¡žåž‹</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">這個節點是é€éŽé€™ç¨®ç¶²è·¯å”定連接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
@@ -2579,7 +2558,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">1 天&amp;</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2603,6 +2582,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">網路活動已關閉</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">ç„¡</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•éŒ¢åŒ…來執行指令</translation>
</message>
@@ -2638,7 +2621,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2787,7 +2770,11 @@ For more information on using this console, type %6.
<source>Could not unlock wallet.</source>
<translation type="unfinished">沒辦法把錢包解鎖。</translation>
</message>
- </context>
+ <message>
+ <source>Could not generate new %1 address</source>
+ <translation type="unfinished">無法產生新的 %1 地å€</translation>
+ </message>
+</context>
<context>
<name>ReceiveRequestDialog</name>
<message>
@@ -2824,11 +2811,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2966,7 +2953,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2980,9 +2967,9 @@ For more information on using this console, type %6.
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">指定交易虚拟大å°çš„æ¯kB (1,000字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–50è°çš„手續費。</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
@@ -3071,6 +3058,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Cr&eate未簽å</translation>
</message>
<message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">產生一個部分簽å的比特幣交易(PSBT)以用於例如離線%1錢包或與PSBT相容的硬體錢包。</translation>
+ </message>
+ <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 到 '%2'</translation>
</message>
@@ -3111,6 +3102,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">PSBT已儲存</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3119,6 +3114,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ä½ å¯ä»¥ä¹‹å¾Œå†æ高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">請檢查您的交易æ案。這將產生部分簽å的比特幣交易(PSBT),您å¯ä»¥å„²å­˜æˆ–複製該交易,然後使用簽å。離線%1錢包或與PSBT相容的硬體錢包。</translation>
+ </message>
+ <message>
<source>%1 from wallet '%2'</source>
<translation type="unfinished">%1 æ¥è‡ªé’±åŒ… “%2â€</translation>
</message>
@@ -3307,10 +3307,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">簽署訊æ¯(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">您å¯ä»¥ä½¿ç”¨æ‚¨çš„地å€ç°½å訊æ¯/å”議,以證明您å¯ä»¥æŽ¥æ”¶ç™¼é€çµ¦ä»–們的比特幣。但是請å°å¿ƒï¼Œä¸è¦ç°½å語æ„å«ç³Šä¸æ¸…,或隨機產生的內容,因為釣魚å¼è©é¨™å¯èƒ½æœƒç”¨é¨™ä½ ç°½å的手法來冒充是你。åªæœ‰ç°½å您åŒæ„的詳細內容。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">用來簽å訊æ¯çš„ 比特幣地å€</translation>
</message>
@@ -3395,10 +3391,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">請檢查地å€æ˜¯å¦æ­£ç¢ºå¾Œå†è©¦ä¸€æ¬¡ã€‚</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">輸入的地å€æ²’有å°æ‡‰åˆ°ä½ çš„任何鑰匙。</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">錢包解鎖已å–消。</translation>
</message>
@@ -3451,6 +3443,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3971,11 +3970,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT已複製</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">複製到剪贴æ¿</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">沒辦法簽署交易。</translation>
</message>
@@ -3987,10 +3981,6 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Can't display address</source>
<translation type="unfinished">無法顯示地å€</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">é è¨­éŒ¢åŒ…</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4039,6 +4029,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%sæ壞。嘗試使用錢包工具bitcoin-wallet挽救或還原備份。</translation>
+ </message>
+ <message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<translation type="unfinished">%s é©—è­‰ -assumeutxo 快照狀態失敗。 這顯示硬體å¯èƒ½æœ‰å•é¡Œï¼Œä¹Ÿå¯èƒ½æ˜¯è»Ÿé«”bug,或是軟體被ä¸ç•¶ä¿®æ”¹ã€å¾žè€Œè®“éžæ³•å¿«ç…§ä¹Ÿèƒ½å¤ è¼‰å…¥ã€‚ 因此,將關閉節點並åœæ­¢ä½¿ç”¨å¾žé€™å€‹å¿«ç…§å»ºæ§‹å‡ºçš„任何狀態,並將éˆé«˜åº¦å¾ž %d é‡ç½®åˆ° %d 。下次啟動時,節點將會ä¸ä½¿ç”¨å¿«ç…§è³‡æ–™å¾ž %d 繼續åŒæ­¥ã€‚ 請將這個事件回報給 %s 並在報告中包括您是如何ç²å¾—這份快照的。 無效的éˆç‹€æ…‹å¿«ç…§ä»ä¿å­˜è‡³ç£ç¢Ÿä¸Šï¼Œä»¥ä¾›è¨ºæ–·å•é¡Œçš„原因。</translation>
</message>
@@ -4080,7 +4074,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ <translation type="unfinished">錯誤: 轉存檔案識別記錄ä¸æ­£ç¢ºã€‚ç²å¾— '%s',é æœŸ '%s'。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
@@ -4119,10 +4113,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒有æ供錢包格å¼ã€‚ è¦ä½¿ç”¨ createfromdump ,必須æä¾› -format=&lt;format&gt;</translation>
</message>
<message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">請檢查電腦日期和時間是å¦æ­£ç¢ºï¼%s 沒辦法在時é˜ä¸æº–的情æ³ä¸‹æ­£å¸¸é‹ä½œã€‚</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">如果你覺得 %s 有用,å¯ä»¥å¹«åŠ©æˆ‘們。關於這個軟體的更多資訊請見 %s。</translation>
</message>
@@ -4231,10 +4221,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">åƒæ•¸ -maxmempool 至少è¦çµ¦ %d 百è¬ä½å…ƒçµ„(MB)</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">發生致命的內部錯誤,有關詳細細節,請åƒè¦‹debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">æ²’è¾¦æ³•è§£æž -%s åƒæ•¸æŒ‡å®šçš„地å€: '%s'</translation>
</message>
@@ -4369,6 +4355,10 @@ Unable to restore backup of wallet.</source>
無法還原錢包備份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">å€å¡Šé©—證已中斷</translation>
</message>
@@ -4385,6 +4375,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">發ç¾å€å¡Šè³‡æ–™åº«å£žæŽ‰äº†</translation>
</message>
<message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找ä¸åˆ°asmap 檔案 %s</translation>
+ </message>
+ <message>
<source>Could not parse asmap file %s</source>
<translation type="unfinished">無法解æžasmap文件%s</translation>
</message>
@@ -4473,14 +4467,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤: 硬碟空間ä¸è¶³ %s</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">錯誤:轉存檔案的校驗和ä¸åŒ¹é…。%s計算得%s</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">錯誤:建立新僅觀察錢包失敗</translation>
</message>
<message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—çš„éµä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">錯誤:ç²å¾—的值ä¸æ˜¯å六進制:%s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">錯誤:keypool已用完,請先é‡æ–°å‘¼å«keypoolrefill</translation>
</message>
<message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">錯誤:缺少校驗和</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">錯誤: 沒有å¯ç”¨çš„ %s 地å€</translation>
+ </message>
+ <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">錯誤:此錢包已經在使用SQLite</translation>
</message>
@@ -4537,6 +4551,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">在任æ„的通訊埠è½å€™å¤±æ•—。如果你希望這樣的話,å¯ä»¥è¨­å®š -listen=0.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">åˆå§‹åŒ–時é‡æ–°æŽƒæ錢包失敗了</translation>
</message>
@@ -4549,6 +4567,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">無法驗證資料庫</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4781,10 +4807,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易ä½å…ƒé‡å¤ªå¤§</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">無法為 -maxsigcachesize: '%s' MiB 分é…内存</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">無法和這å°é›»è…¦ä¸Šçš„ %s 繫çµ(回傳錯誤 %s)</translation>
</message>
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index 4db2d6016c..4d590c3eed 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -95,8 +95,7 @@ OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet)
ui->verticalLayout->setStretchFactor(ui->tabWidget, 1);
/* Main elements init */
- ui->databaseCache->setMinimum(nMinDbCache);
- ui->databaseCache->setMaximum(nMaxDbCache);
+ ui->databaseCache->setRange(nMinDbCache, std::numeric_limits<int>::max());
ui->threadsScriptVerif->setMinimum(-GetNumCores());
ui->threadsScriptVerif->setMaximum(MAX_SCRIPTCHECK_THREADS);
ui->pruneWarning->setVisible(false);
diff --git a/src/qt/test/CMakeLists.txt b/src/qt/test/CMakeLists.txt
new file mode 100644
index 0000000000..582ed71466
--- /dev/null
+++ b/src/qt/test/CMakeLists.txt
@@ -0,0 +1,56 @@
+# Copyright (c) 2024-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_executable(test_bitcoin-qt
+ apptests.cpp
+ optiontests.cpp
+ rpcnestedtests.cpp
+ test_main.cpp
+ uritests.cpp
+ util.cpp
+ ../../init/bitcoin-qt.cpp
+)
+
+target_link_libraries(test_bitcoin-qt
+ core_interface
+ bitcoinqt
+ test_util
+ bitcoin_node
+ Boost::headers
+ Qt5::Test
+)
+
+import_plugins(test_bitcoin-qt)
+
+if(ENABLE_WALLET)
+ target_sources(test_bitcoin-qt
+ PRIVATE
+ addressbooktests.cpp
+ wallettests.cpp
+ ../../wallet/test/wallet_test_fixture.cpp
+ )
+endif()
+
+if(NOT QT_IS_STATIC)
+ add_custom_command(
+ TARGET test_bitcoin-qt POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_PROPERTY:Qt5::QMinimalIntegrationPlugin,LOCATION_$<UPPER_CASE:$<CONFIG>>> $<TARGET_FILE_DIR:test_bitcoin-qt>/plugins/platforms
+ VERBATIM
+ )
+endif()
+
+add_test(NAME test_bitcoin-qt
+ COMMAND test_bitcoin-qt
+)
+if(WIN32 AND VCPKG_TARGET_TRIPLET)
+ # On Windows, vcpkg configures Qt with `-opengl dynamic`, which makes
+ # the "minimal" platform plugin unusable due to internal Qt bugs.
+ set_tests_properties(test_bitcoin-qt PROPERTIES
+ ENVIRONMENT "QT_QPA_PLATFORM=windows"
+ )
+endif()
+
+install(TARGETS test_bitcoin-qt
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
diff --git a/src/qt/test/Makefile b/src/qt/test/Makefile
deleted file mode 100644
index a02f86b62a..0000000000
--- a/src/qt/test/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-all:
- $(MAKE) -C ../../ test_bitcoin_qt
-clean:
- $(MAKE) -C ../../ test_bitcoin_qt_clean
-check:
- $(MAKE) -C ../../ test_bitcoin_qt_check
diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp
index c150606cfb..958cc7ae88 100644
--- a/src/qt/test/test_main.cpp
+++ b/src/qt/test/test_main.cpp
@@ -28,22 +28,6 @@
#include <functional>
-#if defined(QT_STATIC)
-#include <QtPlugin>
-#if defined(QT_QPA_PLATFORM_MINIMAL)
-Q_IMPORT_PLUGIN(QMinimalIntegrationPlugin);
-#endif
-#if defined(QT_QPA_PLATFORM_XCB)
-Q_IMPORT_PLUGIN(QXcbIntegrationPlugin);
-#elif defined(QT_QPA_PLATFORM_WINDOWS)
-Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
-#elif defined(QT_QPA_PLATFORM_COCOA)
-Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin);
-#elif defined(QT_QPA_PLATFORM_ANDROID)
-Q_IMPORT_PLUGIN(QAndroidPlatformIntegrationPlugin)
-#endif
-#endif
-
const std::function<void(const std::string&)> G_TEST_LOG_FUN{};
const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS{};
diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp
index 603df0b15f..6a573d284c 100644
--- a/src/qt/test/wallettests.cpp
+++ b/src/qt/test/wallettests.cpp
@@ -199,7 +199,7 @@ std::shared_ptr<CWallet> SetupLegacyWatchOnlyWallet(interfaces::Node& node, Test
wallet->SetupLegacyScriptPubKeyMan();
// Add watched key
CPubKey pubKey = test.coinbaseKey.GetPubKey();
- bool import_keys = wallet->ImportPubKeys({pubKey.GetID()}, {{pubKey.GetID(), pubKey}} , /*key_origins=*/{}, /*add_keypool=*/false, /*internal=*/false, /*timestamp=*/1);
+ bool import_keys = wallet->ImportPubKeys({{pubKey.GetID(), false}}, {{pubKey.GetID(), pubKey}} , /*key_origins=*/{}, /*add_keypool=*/false, /*timestamp=*/1);
assert(import_keys);
wallet->SetLastBlockProcessed(105, WITH_LOCK(node.context()->chainman->GetMutex(), return node.context()->chainman->ActiveChain().Tip()->GetBlockHash()));
}
@@ -218,8 +218,10 @@ std::shared_ptr<CWallet> SetupDescriptorsWallet(interfaces::Node& node, TestChai
// Add the coinbase key
FlatSigningProvider provider;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(test.coinbaseKey) + ")", provider, error, /* require_checksum=*/ false);
- assert(desc);
+ auto descs = Parse("combo(" + EncodeSecret(test.coinbaseKey) + ")", provider, error, /* require_checksum=*/ false);
+ assert(!descs.empty());
+ assert(descs.size() == 1);
+ auto& desc = descs.at(0);
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
if (!wallet->AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
CTxDestination dest = GetDestinationForKey(test.coinbaseKey.GetPubKey(), wallet->m_default_address_type);
diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp
index 512ea8a1dc..dd093e984a 100644
--- a/src/qt/walletcontroller.cpp
+++ b/src/qt/walletcontroller.cpp
@@ -79,6 +79,14 @@ std::map<std::string, std::pair<bool, std::string>> WalletController::listWallet
return wallets;
}
+void WalletController::removeWallet(WalletModel* wallet_model)
+{
+ // Once the wallet is successfully removed from the node, the model will emit the 'WalletModel::unload' signal.
+ // This signal is already connected and will complete the removal of the view from the GUI.
+ // Look at 'WalletController::getOrCreateWallet' for the signal connection.
+ wallet_model->wallet().remove();
+}
+
void WalletController::closeWallet(WalletModel* wallet_model, QWidget* parent)
{
QMessageBox box(parent);
@@ -89,10 +97,7 @@ void WalletController::closeWallet(WalletModel* wallet_model, QWidget* parent)
box.setDefaultButton(QMessageBox::Yes);
if (box.exec() != QMessageBox::Yes) return;
- // First remove wallet from node.
- wallet_model->wallet().remove();
- // Now release the model.
- removeAndDeleteWallet(wallet_model);
+ removeWallet(wallet_model);
}
void WalletController::closeAllWallets(QWidget* parent)
@@ -105,11 +110,8 @@ void WalletController::closeAllWallets(QWidget* parent)
QMutexLocker locker(&m_mutex);
for (WalletModel* wallet_model : m_wallets) {
- wallet_model->wallet().remove();
- Q_EMIT walletRemoved(wallet_model);
- delete wallet_model;
+ removeWallet(wallet_model);
}
- m_wallets.clear();
}
WalletModel* WalletController::getOrCreateWallet(std::unique_ptr<interfaces::Wallet> wallet)
diff --git a/src/qt/walletcontroller.h b/src/qt/walletcontroller.h
index 7902c3b235..4d2ba43539 100644
--- a/src/qt/walletcontroller.h
+++ b/src/qt/walletcontroller.h
@@ -85,6 +85,9 @@ private:
friend class WalletControllerActivity;
friend class MigrateWalletActivity;
+
+ //! Starts the wallet closure procedure
+ void removeWallet(WalletModel* wallet_model);
};
class WalletControllerActivity : public QObject
diff --git a/src/random.cpp b/src/random.cpp
index 7cb6098d54..c89ee9f38b 100644
--- a/src/random.cpp
+++ b/src/random.cpp
@@ -602,7 +602,7 @@ void SeedPeriodic(CSHA512& hasher, RNGState& rng) noexcept
// Dynamic environment data (performance monitoring, ...)
auto old_size = hasher.Size();
RandAddDynamicEnv(hasher);
- LogPrint(BCLog::RAND, "Feeding %i bytes of dynamic environment data into RNG\n", hasher.Size() - old_size);
+ LogDebug(BCLog::RAND, "Feeding %i bytes of dynamic environment data into RNG\n", hasher.Size() - old_size);
// Strengthen for 10 ms
SeedStrengthen(hasher, rng, 10ms);
@@ -622,7 +622,7 @@ void SeedStartup(CSHA512& hasher, RNGState& rng) noexcept
// Static environment data
RandAddStaticEnv(hasher);
- LogPrint(BCLog::RAND, "Feeding %i bytes of environment data into RNG\n", hasher.Size() - old_size);
+ LogDebug(BCLog::RAND, "Feeding %i bytes of environment data into RNG\n", hasher.Size() - old_size);
// Strengthen for 100 ms
SeedStrengthen(hasher, rng, 100ms);
diff --git a/src/rest.cpp b/src/rest.cpp
index c42bc8e40c..4732922a15 100644
--- a/src/rest.cpp
+++ b/src/rest.cpp
@@ -309,8 +309,11 @@ static bool rest_block(const std::any& context,
if (!pblockindex) {
return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not found");
}
- if (chainman.m_blockman.IsBlockPruned(*pblockindex)) {
- return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not available (pruned data)");
+ if (!(pblockindex->nStatus & BLOCK_HAVE_DATA)) {
+ if (chainman.m_blockman.IsBlockPruned(*pblockindex)) {
+ return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not available (pruned data)");
+ }
+ return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not available (not fully downloaded)");
}
pos = pblockindex->GetBlockPos();
}
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
index b449444aff..a9cea44779 100644
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -56,6 +56,7 @@
#include <condition_variable>
#include <memory>
#include <mutex>
+#include <optional>
using kernel::CCoinsStats;
using kernel::CoinStatsHashType;
@@ -75,6 +76,22 @@ static GlobalMutex cs_blockchange;
static std::condition_variable cond_blockchange;
static CUpdatedBlock latestblock GUARDED_BY(cs_blockchange);
+std::tuple<std::unique_ptr<CCoinsViewCursor>, CCoinsStats, const CBlockIndex*>
+PrepareUTXOSnapshot(
+ Chainstate& chainstate,
+ const std::function<void()>& interruption_point = {})
+ EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
+
+UniValue WriteUTXOSnapshot(
+ Chainstate& chainstate,
+ CCoinsViewCursor* pcursor,
+ CCoinsStats* maybe_stats,
+ const CBlockIndex* tip,
+ AutoFile& afile,
+ const fs::path& path,
+ const fs::path& temppath,
+ const std::function<void()>& interruption_point = {});
+
/* Calculate the difficulty for a given block index.
*/
double GetDifficulty(const CBlockIndex& blockindex)
@@ -184,8 +201,10 @@ UniValue blockToJSON(BlockManager& blockman, const CBlock& block, const CBlockIn
case TxVerbosity::SHOW_DETAILS_AND_PREVOUT:
CBlockUndo blockUndo;
const bool is_not_pruned{WITH_LOCK(::cs_main, return !blockman.IsBlockPruned(blockindex))};
- const bool have_undo{is_not_pruned && blockman.UndoReadFromDisk(blockUndo, blockindex)};
-
+ bool have_undo{is_not_pruned && WITH_LOCK(::cs_main, return blockindex.nStatus & BLOCK_HAVE_UNDO)};
+ if (have_undo && !blockman.UndoReadFromDisk(blockUndo, blockindex)) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Undo data expected but can't be read. This could be due to disk corruption or a conflict with a pruning event.");
+ }
for (size_t i = 0; i < block.vtx.size(); ++i) {
const CTransactionRef& tx = block.vtx.at(i);
// coinbase transaction (i.e. i == 0) doesn't have undo data
@@ -580,20 +599,32 @@ static RPCHelpMan getblockheader()
};
}
+void CheckBlockDataAvailability(BlockManager& blockman, const CBlockIndex& blockindex, bool check_for_undo)
+{
+ AssertLockHeld(cs_main);
+ uint32_t flag = check_for_undo ? BLOCK_HAVE_UNDO : BLOCK_HAVE_DATA;
+ if (!(blockindex.nStatus & flag)) {
+ if (blockman.IsBlockPruned(blockindex)) {
+ throw JSONRPCError(RPC_MISC_ERROR, strprintf("%s not available (pruned data)", check_for_undo ? "Undo data" : "Block"));
+ }
+ if (check_for_undo) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Undo data not available");
+ }
+ throw JSONRPCError(RPC_MISC_ERROR, "Block not available (not fully downloaded)");
+ }
+}
+
static CBlock GetBlockChecked(BlockManager& blockman, const CBlockIndex& blockindex)
{
CBlock block;
{
LOCK(cs_main);
- if (blockman.IsBlockPruned(blockindex)) {
- throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
- }
+ CheckBlockDataAvailability(blockman, blockindex, /*check_for_undo=*/false);
}
if (!blockman.ReadBlockFromDisk(block, blockindex)) {
- // Block not found on disk. This could be because we have the block
- // header in our index but not yet have the block or did not accept the
- // block. Or if the block was pruned right after we released the lock above.
+ // Block not found on disk. This shouldn't normally happen unless the block was
+ // pruned right after we released the lock above.
throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
}
@@ -606,16 +637,13 @@ static std::vector<uint8_t> GetRawBlockChecked(BlockManager& blockman, const CBl
FlatFilePos pos{};
{
LOCK(cs_main);
- if (blockman.IsBlockPruned(blockindex)) {
- throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
- }
+ CheckBlockDataAvailability(blockman, blockindex, /*check_for_undo=*/false);
pos = blockindex.GetBlockPos();
}
if (!blockman.ReadRawBlockFromDisk(data, pos)) {
- // Block not found on disk. This could be because we have the block
- // header in our index but not yet have the block or did not accept the
- // block. Or if the block was pruned right after we released the lock above.
+ // Block not found on disk. This shouldn't normally happen unless the block was
+ // pruned right after we released the lock above.
throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
}
@@ -631,9 +659,7 @@ static CBlockUndo GetUndoChecked(BlockManager& blockman, const CBlockIndex& bloc
{
LOCK(cs_main);
- if (blockman.IsBlockPruned(blockindex)) {
- throw JSONRPCError(RPC_MISC_ERROR, "Undo data not available (pruned data)");
- }
+ CheckBlockDataAvailability(blockman, blockindex, /*check_for_undo=*/true);
}
if (!blockman.UndoReadFromDisk(blockUndo, blockindex)) {
@@ -859,7 +885,7 @@ static RPCHelpMan pruneblockchain()
} else if (height > chainHeight) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Blockchain is shorter than the attempted prune height.");
} else if (height > chainHeight - MIN_BLOCKS_TO_KEEP) {
- LogPrint(BCLog::RPC, "Attempt to prune blocks close to the tip. Retaining the minimum number of blocks.\n");
+ LogDebug(BCLog::RPC, "Attempt to prune blocks close to the tip. Retaining the minimum number of blocks.\n");
height = chainHeight - MIN_BLOCKS_TO_KEEP;
}
@@ -1577,6 +1603,27 @@ static RPCHelpMan preciousblock()
};
}
+void InvalidateBlock(ChainstateManager& chainman, const uint256 block_hash) {
+ BlockValidationState state;
+ CBlockIndex* pblockindex;
+ {
+ LOCK(chainman.GetMutex());
+ pblockindex = chainman.m_blockman.LookupBlockIndex(block_hash);
+ if (!pblockindex) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
+ }
+ }
+ chainman.ActiveChainstate().InvalidateBlock(state, pblockindex);
+
+ if (state.IsValid()) {
+ chainman.ActiveChainstate().ActivateBestChain(state);
+ }
+
+ if (!state.IsValid()) {
+ throw JSONRPCError(RPC_DATABASE_ERROR, state.ToString());
+ }
+}
+
static RPCHelpMan invalidateblock()
{
return RPCHelpMan{"invalidateblock",
@@ -1591,31 +1638,33 @@ static RPCHelpMan invalidateblock()
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
+ ChainstateManager& chainman = EnsureAnyChainman(request.context);
uint256 hash(ParseHashV(request.params[0], "blockhash"));
- BlockValidationState state;
- ChainstateManager& chainman = EnsureAnyChainman(request.context);
- CBlockIndex* pblockindex;
+ InvalidateBlock(chainman, hash);
+
+ return UniValue::VNULL;
+},
+ };
+}
+
+void ReconsiderBlock(ChainstateManager& chainman, uint256 block_hash) {
{
- LOCK(cs_main);
- pblockindex = chainman.m_blockman.LookupBlockIndex(hash);
+ LOCK(chainman.GetMutex());
+ CBlockIndex* pblockindex = chainman.m_blockman.LookupBlockIndex(block_hash);
if (!pblockindex) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
}
- }
- chainman.ActiveChainstate().InvalidateBlock(state, pblockindex);
- if (state.IsValid()) {
- chainman.ActiveChainstate().ActivateBestChain(state);
+ chainman.ActiveChainstate().ResetBlockFailureFlags(pblockindex);
}
+ BlockValidationState state;
+ chainman.ActiveChainstate().ActivateBestChain(state);
+
if (!state.IsValid()) {
throw JSONRPCError(RPC_DATABASE_ERROR, state.ToString());
}
-
- return UniValue::VNULL;
-},
- };
}
static RPCHelpMan reconsiderblock()
@@ -1636,22 +1685,7 @@ static RPCHelpMan reconsiderblock()
ChainstateManager& chainman = EnsureAnyChainman(request.context);
uint256 hash(ParseHashV(request.params[0], "blockhash"));
- {
- LOCK(cs_main);
- CBlockIndex* pblockindex = chainman.m_blockman.LookupBlockIndex(hash);
- if (!pblockindex) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
- }
-
- chainman.ActiveChainstate().ResetBlockFailureFlags(pblockindex);
- }
-
- BlockValidationState state;
- chainman.ActiveChainstate().ActivateBestChain(state);
-
- if (!state.IsValid()) {
- throw JSONRPCError(RPC_DATABASE_ERROR, state.ToString());
- }
+ ReconsiderBlock(chainman, hash);
return UniValue::VNULL;
},
@@ -2641,6 +2675,42 @@ static RPCHelpMan getblockfilter()
}
/**
+ * RAII class that disables the network in its constructor and enables it in its
+ * destructor.
+ */
+class NetworkDisable
+{
+ CConnman& m_connman;
+public:
+ NetworkDisable(CConnman& connman) : m_connman(connman) {
+ m_connman.SetNetworkActive(false);
+ if (m_connman.GetNetworkActive()) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Network activity could not be suspended.");
+ }
+ };
+ ~NetworkDisable() {
+ m_connman.SetNetworkActive(true);
+ };
+};
+
+/**
+ * RAII class that temporarily rolls back the local chain in it's constructor
+ * and rolls it forward again in it's destructor.
+ */
+class TemporaryRollback
+{
+ ChainstateManager& m_chainman;
+ const CBlockIndex& m_invalidate_index;
+public:
+ TemporaryRollback(ChainstateManager& chainman, const CBlockIndex& index) : m_chainman(chainman), m_invalidate_index(index) {
+ InvalidateBlock(m_chainman, m_invalidate_index.GetBlockHash());
+ };
+ ~TemporaryRollback() {
+ ReconsiderBlock(m_chainman, m_invalidate_index.GetBlockHash());
+ };
+};
+
+/**
* Serialize the UTXO set to a file for loading elsewhere.
*
* @see SnapshotMetadata
@@ -2649,9 +2719,20 @@ static RPCHelpMan dumptxoutset()
{
return RPCHelpMan{
"dumptxoutset",
- "Write the serialized UTXO set to a file.",
+ "Write the serialized UTXO set to a file. This can be used in loadtxoutset afterwards if this snapshot height is supported in the chainparams as well.\n\n"
+ "Unless the the \"latest\" type is requested, the node will roll back to the requested height and network activity will be suspended during this process. "
+ "Because of this it is discouraged to interact with the node in any other way during the execution of this call to avoid inconsistent results and race conditions, particularly RPCs that interact with blockstorage.\n\n"
+ "This call may take several minutes. Make sure to use no RPC timeout (bitcoin-cli -rpcclienttimeout=0)",
{
{"path", RPCArg::Type::STR, RPCArg::Optional::NO, "Path to the output file. If relative, will be prefixed by datadir."},
+ {"type", RPCArg::Type::STR, RPCArg::Default(""), "The type of snapshot to create. Can be \"latest\" to create a snapshot of the current UTXO set or \"rollback\" to temporarily roll back the state of the node to a historical block before creating the snapshot of a historical UTXO set. This parameter can be omitted if a separate \"rollback\" named parameter is specified indicating the height or hash of a specific historical block. If \"rollback\" is specified and separate \"rollback\" named parameter is not specified, this will roll back to the latest valid snapshot block that can currently be loaded with loadtxoutset."},
+ {"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
+ {
+ {"rollback", RPCArg::Type::NUM, RPCArg::Optional::OMITTED,
+ "Height or hash of the block to roll back to before creating the snapshot. Note: The further this number is from the tip, the longer this process will take. Consider setting a higher -rpcclienttimeout value in this case.",
+ RPCArgOptions{.skip_type_check = true, .type_str = {"", "string or numeric"}}},
+ },
+ },
},
RPCResult{
RPCResult::Type::OBJ, "", "",
@@ -2665,10 +2746,33 @@ static RPCHelpMan dumptxoutset()
}
},
RPCExamples{
- HelpExampleCli("dumptxoutset", "utxo.dat")
+ HelpExampleCli("-rpcclienttimeout=0 dumptxoutset", "utxo.dat latest") +
+ HelpExampleCli("-rpcclienttimeout=0 dumptxoutset", "utxo.dat rollback") +
+ HelpExampleCli("-rpcclienttimeout=0 -named dumptxoutset", R"(utxo.dat rollback=853456)")
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
+ NodeContext& node = EnsureAnyNodeContext(request.context);
+ const CBlockIndex* tip{WITH_LOCK(::cs_main, return node.chainman->ActiveChain().Tip())};
+ const CBlockIndex* target_index{nullptr};
+ const std::string snapshot_type{self.Arg<std::string>("type")};
+ const UniValue options{request.params[2].isNull() ? UniValue::VOBJ : request.params[2]};
+ if (options.exists("rollback")) {
+ if (!snapshot_type.empty() && snapshot_type != "rollback") {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid snapshot type \"%s\" specified with rollback option", snapshot_type));
+ }
+ target_index = ParseHashOrHeight(options["rollback"], *node.chainman);
+ } else if (snapshot_type == "rollback") {
+ auto snapshot_heights = node.chainman->GetParams().GetAvailableSnapshotHeights();
+ CHECK_NONFATAL(snapshot_heights.size() > 0);
+ auto max_height = std::max_element(snapshot_heights.begin(), snapshot_heights.end());
+ target_index = ParseHashOrHeight(*max_height, *node.chainman);
+ } else if (snapshot_type == "latest") {
+ target_index = tip;
+ } else {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid snapshot type \"%s\" specified. Please specify \"rollback\" or \"latest\"", snapshot_type));
+ }
+
const ArgsManager& args{EnsureAnyArgsman(request.context)};
const fs::path path = fsbridge::AbsPathJoin(args.GetDataDirNet(), fs::u8path(request.params[0].get_str()));
// Write to a temporary path and then move into `path` on completion
@@ -2690,9 +2794,68 @@ static RPCHelpMan dumptxoutset()
"Couldn't open file " + temppath.utf8string() + " for writing.");
}
- NodeContext& node = EnsureAnyNodeContext(request.context);
- UniValue result = CreateUTXOSnapshot(
- node, node.chainman->ActiveChainstate(), afile, path, temppath);
+ CConnman& connman = EnsureConnman(node);
+ const CBlockIndex* invalidate_index{nullptr};
+ std::optional<NetworkDisable> disable_network;
+ std::optional<TemporaryRollback> temporary_rollback;
+
+ // If the user wants to dump the txoutset of the current tip, we don't have
+ // to roll back at all
+ if (target_index != tip) {
+ // If the node is running in pruned mode we ensure all necessary block
+ // data is available before starting to roll back.
+ if (node.chainman->m_blockman.IsPruneMode()) {
+ LOCK(node.chainman->GetMutex());
+ const CBlockIndex* current_tip{node.chainman->ActiveChain().Tip()};
+ const CBlockIndex* first_block{node.chainman->m_blockman.GetFirstBlock(*current_tip, /*status_mask=*/BLOCK_HAVE_MASK)};
+ if (first_block->nHeight > target_index->nHeight) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Could not roll back to requested height since necessary block data is already pruned.");
+ }
+ }
+
+ // Suspend network activity for the duration of the process when we are
+ // rolling back the chain to get a utxo set from a past height. We do
+ // this so we don't punish peers that send us that send us data that
+ // seems wrong in this temporary state. For example a normal new block
+ // would be classified as a block connecting an invalid block.
+ // Skip if the network is already disabled because this
+ // automatically re-enables the network activity at the end of the
+ // process which may not be what the user wants.
+ if (connman.GetNetworkActive()) {
+ disable_network.emplace(connman);
+ }
+
+ invalidate_index = WITH_LOCK(::cs_main, return node.chainman->ActiveChain().Next(target_index));
+ temporary_rollback.emplace(*node.chainman, *invalidate_index);
+ }
+
+ Chainstate* chainstate;
+ std::unique_ptr<CCoinsViewCursor> cursor;
+ CCoinsStats stats;
+ {
+ // Lock the chainstate before calling PrepareUtxoSnapshot, to be able
+ // to get a UTXO database cursor while the chain is pointing at the
+ // target block. After that, release the lock while calling
+ // WriteUTXOSnapshot. The cursor will remain valid and be used by
+ // WriteUTXOSnapshot to write a consistent snapshot even if the
+ // chainstate changes.
+ LOCK(node.chainman->GetMutex());
+ chainstate = &node.chainman->ActiveChainstate();
+ // In case there is any issue with a block being read from disk we need
+ // to stop here, otherwise the dump could still be created for the wrong
+ // height.
+ // The new tip could also not be the target block if we have a stale
+ // sister block of invalidate_index. This block (or a descendant) would
+ // be activated as the new tip and we would not get to new_tip_index.
+ if (target_index != chainstate->m_chain.Tip()) {
+ LogWarning("dumptxoutset failed to roll back to requested height, reverting to tip.\n");
+ throw JSONRPCError(RPC_MISC_ERROR, "Could not roll back to requested height.");
+ } else {
+ std::tie(cursor, stats, tip) = PrepareUTXOSnapshot(*chainstate, node.rpc_interruption_point);
+ }
+ }
+
+ UniValue result = WriteUTXOSnapshot(*chainstate, cursor.get(), &stats, tip, afile, path, temppath, node.rpc_interruption_point);
fs::rename(temppath, path);
result.pushKV("path", path.utf8string());
@@ -2701,12 +2864,10 @@ static RPCHelpMan dumptxoutset()
};
}
-UniValue CreateUTXOSnapshot(
- NodeContext& node,
+std::tuple<std::unique_ptr<CCoinsViewCursor>, CCoinsStats, const CBlockIndex*>
+PrepareUTXOSnapshot(
Chainstate& chainstate,
- AutoFile& afile,
- const fs::path& path,
- const fs::path& temppath)
+ const std::function<void()>& interruption_point)
{
std::unique_ptr<CCoinsViewCursor> pcursor;
std::optional<CCoinsStats> maybe_stats;
@@ -2716,7 +2877,7 @@ UniValue CreateUTXOSnapshot(
// We need to lock cs_main to ensure that the coinsdb isn't written to
// between (i) flushing coins cache to disk (coinsdb), (ii) getting stats
// based upon the coinsdb, and (iii) constructing a cursor to the
- // coinsdb for use below this block.
+ // coinsdb for use in WriteUTXOSnapshot.
//
// Cursors returned by leveldb iterate over snapshots, so the contents
// of the pcursor will not be affected by simultaneous writes during
@@ -2725,11 +2886,11 @@ UniValue CreateUTXOSnapshot(
// See discussion here:
// https://github.com/bitcoin/bitcoin/pull/15606#discussion_r274479369
//
- LOCK(::cs_main);
+ AssertLockHeld(::cs_main);
chainstate.ForceFlushStateToDisk();
- maybe_stats = GetUTXOStats(&chainstate.CoinsDB(), chainstate.m_blockman, CoinStatsHashType::HASH_SERIALIZED, node.rpc_interruption_point);
+ maybe_stats = GetUTXOStats(&chainstate.CoinsDB(), chainstate.m_blockman, CoinStatsHashType::HASH_SERIALIZED, interruption_point);
if (!maybe_stats) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to read UTXO set");
}
@@ -2738,6 +2899,19 @@ UniValue CreateUTXOSnapshot(
tip = CHECK_NONFATAL(chainstate.m_blockman.LookupBlockIndex(maybe_stats->hashBlock));
}
+ return {std::move(pcursor), *CHECK_NONFATAL(maybe_stats), tip};
+}
+
+UniValue WriteUTXOSnapshot(
+ Chainstate& chainstate,
+ CCoinsViewCursor* pcursor,
+ CCoinsStats* maybe_stats,
+ const CBlockIndex* tip,
+ AutoFile& afile,
+ const fs::path& path,
+ const fs::path& temppath,
+ const std::function<void()>& interruption_point)
+{
LOG_TIME_SECONDS(strprintf("writing UTXO snapshot at height %s (%s) to file %s (via %s)",
tip->nHeight, tip->GetBlockHash().ToString(),
fs::PathToString(path), fs::PathToString(temppath)));
@@ -2773,7 +2947,7 @@ UniValue CreateUTXOSnapshot(
pcursor->GetKey(key);
last_hash = key.hash;
while (pcursor->Valid()) {
- if (iter % 5000 == 0) node.rpc_interruption_point();
+ if (iter % 5000 == 0) interruption_point();
++iter;
if (pcursor->GetKey(key) && pcursor->GetValue(coin)) {
if (key.hash != last_hash) {
@@ -2804,6 +2978,17 @@ UniValue CreateUTXOSnapshot(
return result;
}
+UniValue CreateUTXOSnapshot(
+ node::NodeContext& node,
+ Chainstate& chainstate,
+ AutoFile& afile,
+ const fs::path& path,
+ const fs::path& tmppath)
+{
+ auto [cursor, stats, tip]{WITH_LOCK(::cs_main, return PrepareUTXOSnapshot(chainstate, node.rpc_interruption_point))};
+ return WriteUTXOSnapshot(chainstate, cursor.get(), &stats, tip, afile, path, tmppath, node.rpc_interruption_point);
+}
+
static RPCHelpMan loadtxoutset()
{
return RPCHelpMan{
@@ -2838,7 +3023,7 @@ static RPCHelpMan loadtxoutset()
}
},
RPCExamples{
- HelpExampleCli("loadtxoutset", "utxo.dat")
+ HelpExampleCli("loadtxoutset -rpcclienttimeout=0", "utxo.dat")
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
@@ -2866,6 +3051,13 @@ static RPCHelpMan loadtxoutset()
throw JSONRPCError(RPC_INTERNAL_ERROR, strprintf("Unable to load UTXO snapshot: %s. (%s)", util::ErrorString(activation_result).original, path.utf8string()));
}
+ // Because we can't provide historical blocks during tip or background sync.
+ // Update local services to reflect we are a limited peer until we are fully sync.
+ node.connman->RemoveLocalServices(NODE_NETWORK);
+ // Setting the limited state is usually redundant because the node can always
+ // provide the last 288 blocks, but it doesn't hurt to set it.
+ node.connman->AddLocalServices(NODE_NETWORK_LIMITED);
+
CBlockIndex& snapshot_index{*CHECK_NONFATAL(*activation_result)};
UniValue result(UniValue::VOBJ);
diff --git a/src/rpc/blockchain.h b/src/rpc/blockchain.h
index f6a7fe236c..a23f5cf024 100644
--- a/src/rpc/blockchain.h
+++ b/src/rpc/blockchain.h
@@ -48,7 +48,7 @@ UniValue blockheaderToJSON(const CBlockIndex& tip, const CBlockIndex& blockindex
void CalculatePercentilesByWeight(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES], std::vector<std::pair<CAmount, int64_t>>& scores, int64_t total_weight);
/**
- * Helper to create UTXO snapshots given a chainstate and a file handle.
+ * Test-only helper to create UTXO snapshots given a chainstate and a file handle.
* @return a UniValue map containing metadata about the snapshot.
*/
UniValue CreateUTXOSnapshot(
@@ -60,5 +60,6 @@ UniValue CreateUTXOSnapshot(
//! Return height of highest block that has been pruned, or std::nullopt if no blocks have been pruned
std::optional<int> GetPruneHeight(const node::BlockManager& blockman, const CChain& chain) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
+void CheckBlockDataAvailability(node::BlockManager& blockman, const CBlockIndex& blockindex, bool check_for_undo) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
#endif // BITCOIN_RPC_BLOCKCHAIN_H
diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp
index b866fa484b..0112a261ce 100644
--- a/src/rpc/client.cpp
+++ b/src/rpc/client.cpp
@@ -187,6 +187,8 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "gettxoutproof", 0, "txids" },
{ "gettxoutsetinfo", 1, "hash_or_height" },
{ "gettxoutsetinfo", 2, "use_index"},
+ { "dumptxoutset", 2, "options" },
+ { "dumptxoutset", 2, "rollback" },
{ "lockunspent", 0, "unlock" },
{ "lockunspent", 1, "transactions" },
{ "lockunspent", 2, "persistent" },
diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp
index 3c41e136ec..b986c26e7a 100644
--- a/src/rpc/mining.cpp
+++ b/src/rpc/mining.cpp
@@ -45,9 +45,9 @@
#include <memory>
#include <stdint.h>
-using node::BlockAssembler;
-using node::CBlockTemplate;
+using interfaces::BlockTemplate;
using interfaces::Mining;
+using node::BlockAssembler;
using node::NodeContext;
using node::RegenerateCommitments;
using node::UpdateTime;
@@ -130,7 +130,7 @@ static RPCHelpMan getnetworkhashps()
};
}
-static bool GenerateBlock(ChainstateManager& chainman, Mining& miner, CBlock& block, uint64_t& max_tries, std::shared_ptr<const CBlock>& block_out, bool process_new_block)
+static bool GenerateBlock(ChainstateManager& chainman, Mining& miner, CBlock&& block, uint64_t& max_tries, std::shared_ptr<const CBlock>& block_out, bool process_new_block)
{
block_out.reset();
block.hashMerkleRoot = BlockMerkleRoot(block);
@@ -146,7 +146,7 @@ static bool GenerateBlock(ChainstateManager& chainman, Mining& miner, CBlock& bl
return true;
}
- block_out = std::make_shared<const CBlock>(block);
+ block_out = std::make_shared<const CBlock>(std::move(block));
if (!process_new_block) return true;
@@ -161,12 +161,11 @@ static UniValue generateBlocks(ChainstateManager& chainman, Mining& miner, const
{
UniValue blockHashes(UniValue::VARR);
while (nGenerate > 0 && !chainman.m_interrupt) {
- std::unique_ptr<CBlockTemplate> pblocktemplate(miner.createNewBlock(coinbase_script));
- if (!pblocktemplate.get())
- throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
+ std::unique_ptr<BlockTemplate> block_template(miner.createNewBlock(coinbase_script));
+ CHECK_NONFATAL(block_template);
std::shared_ptr<const CBlock> block_out;
- if (!GenerateBlock(chainman, miner, pblocktemplate->block, nMaxTries, block_out, /*process_new_block=*/true)) {
+ if (!GenerateBlock(chainman, miner, block_template->getBlock(), nMaxTries, block_out, /*process_new_block=*/true)) {
break;
}
@@ -181,35 +180,36 @@ static UniValue generateBlocks(ChainstateManager& chainman, Mining& miner, const
static bool getScriptFromDescriptor(const std::string& descriptor, CScript& script, std::string& error)
{
FlatSigningProvider key_provider;
- const auto desc = Parse(descriptor, key_provider, error, /* require_checksum = */ false);
- if (desc) {
- if (desc->IsRange()) {
- throw JSONRPCError(RPC_INVALID_PARAMETER, "Ranged descriptor not accepted. Maybe pass through deriveaddresses first?");
- }
-
- FlatSigningProvider provider;
- std::vector<CScript> scripts;
- if (!desc->Expand(0, key_provider, scripts, provider)) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot derive script without private keys");
- }
+ const auto descs = Parse(descriptor, key_provider, error, /* require_checksum = */ false);
+ if (descs.empty()) return false;
+ if (descs.size() > 1) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Multipath descriptor not accepted");
+ }
+ const auto& desc = descs.at(0);
+ if (desc->IsRange()) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Ranged descriptor not accepted. Maybe pass through deriveaddresses first?");
+ }
- // Combo descriptors can have 2 or 4 scripts, so we can't just check scripts.size() == 1
- CHECK_NONFATAL(scripts.size() > 0 && scripts.size() <= 4);
+ FlatSigningProvider provider;
+ std::vector<CScript> scripts;
+ if (!desc->Expand(0, key_provider, scripts, provider)) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot derive script without private keys");
+ }
- if (scripts.size() == 1) {
- script = scripts.at(0);
- } else if (scripts.size() == 4) {
- // For uncompressed keys, take the 3rd script, since it is p2wpkh
- script = scripts.at(2);
- } else {
- // Else take the 2nd script, since it is p2pkh
- script = scripts.at(1);
- }
+ // Combo descriptors can have 2 or 4 scripts, so we can't just check scripts.size() == 1
+ CHECK_NONFATAL(scripts.size() > 0 && scripts.size() <= 4);
- return true;
+ if (scripts.size() == 1) {
+ script = scripts.at(0);
+ } else if (scripts.size() == 4) {
+ // For uncompressed keys, take the 3rd script, since it is p2wpkh
+ script = scripts.at(2);
} else {
- return false;
+ // Else take the 2nd script, since it is p2pkh
+ script = scripts.at(1);
}
+
+ return true;
}
static RPCHelpMan generatetodescriptor()
@@ -370,11 +370,10 @@ static RPCHelpMan generateblock()
ChainstateManager& chainman = EnsureChainman(node);
{
- std::unique_ptr<CBlockTemplate> blocktemplate{miner.createNewBlock(coinbase_script, {.use_mempool = false})};
- if (!blocktemplate) {
- throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
- }
- block = blocktemplate->block;
+ std::unique_ptr<BlockTemplate> block_template{miner.createNewBlock(coinbase_script, {.use_mempool = false})};
+ CHECK_NONFATAL(block_template);
+
+ block = block_template->getBlock();
}
CHECK_NONFATAL(block.vtx.size() == 1);
@@ -393,7 +392,7 @@ static RPCHelpMan generateblock()
std::shared_ptr<const CBlock> block_out;
uint64_t max_tries{DEFAULT_MAX_TRIES};
- if (!GenerateBlock(chainman, miner, block, max_tries, block_out, process_new_block) || !block_out) {
+ if (!GenerateBlock(chainman, miner, std::move(block), max_tries, block_out, process_new_block) || !block_out) {
throw JSONRPCError(RPC_MISC_ERROR, "Failed to make block.");
}
@@ -799,7 +798,7 @@ static RPCHelpMan getblocktemplate()
// Update block
static CBlockIndex* pindexPrev;
static int64_t time_start;
- static std::unique_ptr<CBlockTemplate> pblocktemplate;
+ static std::unique_ptr<BlockTemplate> block_template;
if (!pindexPrev || pindexPrev->GetBlockHash() != tip ||
(miner.getTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - time_start > 5))
{
@@ -813,20 +812,19 @@ static RPCHelpMan getblocktemplate()
// Create new block
CScript scriptDummy = CScript() << OP_TRUE;
- pblocktemplate = miner.createNewBlock(scriptDummy);
- if (!pblocktemplate) {
- throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");
- }
+ block_template = miner.createNewBlock(scriptDummy);
+ CHECK_NONFATAL(block_template);
+
// Need to update only after we know createNewBlock succeeded
pindexPrev = pindexPrevNew;
}
CHECK_NONFATAL(pindexPrev);
- CBlock* pblock = &pblocktemplate->block; // pointer for convenience
+ CBlock block{block_template->getBlock()};
// Update nTime
- UpdateTime(pblock, consensusParams, pindexPrev);
- pblock->nNonce = 0;
+ UpdateTime(&block, consensusParams, pindexPrev);
+ block.nNonce = 0;
// NOTE: If at some point we support pre-segwit miners post-segwit-activation, this needs to take segwit support into consideration
const bool fPreSegWit = !DeploymentActiveAfter(pindexPrev, chainman, Consensus::DEPLOYMENT_SEGWIT);
@@ -835,8 +833,11 @@ static RPCHelpMan getblocktemplate()
UniValue transactions(UniValue::VARR);
std::map<uint256, int64_t> setTxIndex;
+ std::vector<CAmount> tx_fees{block_template->getTxFees()};
+ std::vector<CAmount> tx_sigops{block_template->getTxSigops()};
+
int i = 0;
- for (const auto& it : pblock->vtx) {
+ for (const auto& it : block.vtx) {
const CTransaction& tx = *it;
uint256 txHash = tx.GetHash();
setTxIndex[txHash] = i++;
@@ -859,8 +860,8 @@ static RPCHelpMan getblocktemplate()
entry.pushKV("depends", std::move(deps));
int index_in_template = i - 1;
- entry.pushKV("fee", pblocktemplate->vTxFees[index_in_template]);
- int64_t nTxSigOps = pblocktemplate->vTxSigOpsCost[index_in_template];
+ entry.pushKV("fee", tx_fees.at(index_in_template));
+ int64_t nTxSigOps{tx_sigops.at(index_in_template)};
if (fPreSegWit) {
CHECK_NONFATAL(nTxSigOps % WITNESS_SCALE_FACTOR == 0);
nTxSigOps /= WITNESS_SCALE_FACTOR;
@@ -873,7 +874,7 @@ static RPCHelpMan getblocktemplate()
UniValue aux(UniValue::VOBJ);
- arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
+ arith_uint256 hashTarget = arith_uint256().SetCompact(block.nBits);
UniValue aMutable(UniValue::VARR);
aMutable.push_back("time");
@@ -903,7 +904,7 @@ static RPCHelpMan getblocktemplate()
break;
case ThresholdState::LOCKED_IN:
// Ensure bit is set in block version
- pblock->nVersion |= chainman.m_versionbitscache.Mask(consensusParams, pos);
+ block.nVersion |= chainman.m_versionbitscache.Mask(consensusParams, pos);
[[fallthrough]];
case ThresholdState::STARTED:
{
@@ -912,7 +913,7 @@ static RPCHelpMan getblocktemplate()
if (setClientRules.find(vbinfo.name) == setClientRules.end()) {
if (!vbinfo.gbt_force) {
// If the client doesn't support this, don't indicate it in the [default] version
- pblock->nVersion &= ~chainman.m_versionbitscache.Mask(consensusParams, pos);
+ block.nVersion &= ~chainman.m_versionbitscache.Mask(consensusParams, pos);
}
}
break;
@@ -932,15 +933,15 @@ static RPCHelpMan getblocktemplate()
}
}
}
- result.pushKV("version", pblock->nVersion);
+ result.pushKV("version", block.nVersion);
result.pushKV("rules", std::move(aRules));
result.pushKV("vbavailable", std::move(vbavailable));
result.pushKV("vbrequired", int(0));
- result.pushKV("previousblockhash", pblock->hashPrevBlock.GetHex());
+ result.pushKV("previousblockhash", block.hashPrevBlock.GetHex());
result.pushKV("transactions", std::move(transactions));
result.pushKV("coinbaseaux", std::move(aux));
- result.pushKV("coinbasevalue", (int64_t)pblock->vtx[0]->vout[0].nValue);
+ result.pushKV("coinbasevalue", (int64_t)block.vtx[0]->vout[0].nValue);
result.pushKV("longpollid", tip.GetHex() + ToString(nTransactionsUpdatedLast));
result.pushKV("target", hashTarget.GetHex());
result.pushKV("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1);
@@ -959,16 +960,16 @@ static RPCHelpMan getblocktemplate()
if (!fPreSegWit) {
result.pushKV("weightlimit", (int64_t)MAX_BLOCK_WEIGHT);
}
- result.pushKV("curtime", pblock->GetBlockTime());
- result.pushKV("bits", strprintf("%08x", pblock->nBits));
+ result.pushKV("curtime", block.GetBlockTime());
+ result.pushKV("bits", strprintf("%08x", block.nBits));
result.pushKV("height", (int64_t)(pindexPrev->nHeight+1));
if (consensusParams.signet_blocks) {
result.pushKV("signet_challenge", HexStr(consensusParams.signet_challenge));
}
- if (!pblocktemplate->vchCoinbaseCommitment.empty()) {
- result.pushKV("default_witness_commitment", HexStr(pblocktemplate->vchCoinbaseCommitment));
+ if (!block_template->getCoinbaseCommitment().empty()) {
+ result.pushKV("default_witness_commitment", HexStr(block_template->getCoinbaseCommitment()));
}
return result;
@@ -1095,7 +1096,7 @@ static RPCHelpMan submitheader()
}
BlockValidationState state;
- chainman.ProcessNewBlockHeaders({h}, /*min_pow_checked=*/true, state);
+ chainman.ProcessNewBlockHeaders({{h}}, /*min_pow_checked=*/true, state);
if (state.IsValid()) return UniValue::VNULL;
if (state.IsError()) {
throw JSONRPCError(RPC_VERIFY_ERROR, state.ToString());
diff --git a/src/rpc/node.cpp b/src/rpc/node.cpp
index 54e2c8e226..af2e1d0eaa 100644
--- a/src/rpc/node.cpp
+++ b/src/rpc/node.cpp
@@ -244,15 +244,15 @@ static RPCHelpMan logging()
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
- uint32_t original_log_categories = LogInstance().GetCategoryMask();
+ BCLog::CategoryMask original_log_categories = LogInstance().GetCategoryMask();
if (request.params[0].isArray()) {
EnableOrDisableLogCategories(request.params[0], true);
}
if (request.params[1].isArray()) {
EnableOrDisableLogCategories(request.params[1], false);
}
- uint32_t updated_log_categories = LogInstance().GetCategoryMask();
- uint32_t changed_log_categories = original_log_categories ^ updated_log_categories;
+ BCLog::CategoryMask updated_log_categories = LogInstance().GetCategoryMask();
+ BCLog::CategoryMask changed_log_categories = original_log_categories ^ updated_log_categories;
// Update libevent logging if BCLog::LIBEVENT has changed.
if (changed_log_categories & BCLog::LIBEVENT) {
diff --git a/src/rpc/output_script.cpp b/src/rpc/output_script.cpp
index 01a9e59284..49f3a81243 100644
--- a/src/rpc/output_script.cpp
+++ b/src/rpc/output_script.cpp
@@ -175,7 +175,11 @@ static RPCHelpMan getdescriptorinfo()
RPCResult{
RPCResult::Type::OBJ, "", "",
{
- {RPCResult::Type::STR, "descriptor", "The descriptor in canonical form, without private keys"},
+ {RPCResult::Type::STR, "descriptor", "The descriptor in canonical form, without private keys. For a multipath descriptor, only the first will be returned."},
+ {RPCResult::Type::ARR, "multipath_expansion", /*optional=*/true, "All descriptors produced by expanding multipath derivation elements. Only if the provided descriptor specifies multipath derivation elements.",
+ {
+ {RPCResult::Type::STR, "", ""},
+ }},
{RPCResult::Type::STR, "checksum", "The checksum for the input descriptor"},
{RPCResult::Type::BOOL, "isrange", "Whether the descriptor is ranged"},
{RPCResult::Type::BOOL, "issolvable", "Whether the descriptor is solvable"},
@@ -191,22 +195,65 @@ static RPCHelpMan getdescriptorinfo()
{
FlatSigningProvider provider;
std::string error;
- auto desc = Parse(request.params[0].get_str(), provider, error);
- if (!desc) {
+ auto descs = Parse(request.params[0].get_str(), provider, error);
+ if (descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
UniValue result(UniValue::VOBJ);
- result.pushKV("descriptor", desc->ToString());
+ result.pushKV("descriptor", descs.at(0)->ToString());
+
+ if (descs.size() > 1) {
+ UniValue multipath_descs(UniValue::VARR);
+ for (const auto& d : descs) {
+ multipath_descs.push_back(d->ToString());
+ }
+ result.pushKV("multipath_expansion", multipath_descs);
+ }
+
result.pushKV("checksum", GetDescriptorChecksum(request.params[0].get_str()));
- result.pushKV("isrange", desc->IsRange());
- result.pushKV("issolvable", desc->IsSolvable());
+ result.pushKV("isrange", descs.at(0)->IsRange());
+ result.pushKV("issolvable", descs.at(0)->IsSolvable());
result.pushKV("hasprivatekeys", provider.keys.size() > 0);
return result;
},
};
}
+static UniValue DeriveAddresses(const Descriptor* desc, int64_t range_begin, int64_t range_end, FlatSigningProvider& key_provider)
+{
+ UniValue addresses(UniValue::VARR);
+
+ for (int64_t i = range_begin; i <= range_end; ++i) {
+ FlatSigningProvider provider;
+ std::vector<CScript> scripts;
+ if (!desc->Expand(i, key_provider, scripts, provider)) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot derive script without private keys");
+ }
+
+ for (const CScript& script : scripts) {
+ CTxDestination dest;
+ if (!ExtractDestination(script, dest)) {
+ // ExtractDestination no longer returns true for P2PK since it doesn't have a corresponding address
+ // However combo will output P2PK and should just ignore that script
+ if (scripts.size() > 1 && std::get_if<PubKeyDestination>(&dest)) {
+ continue;
+ }
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Descriptor does not have a corresponding address");
+ }
+
+ addresses.push_back(EncodeDestination(dest));
+ }
+ }
+
+ // This should not be possible, but an assert seems overkill:
+ if (addresses.empty()) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Unexpected empty result");
+ }
+
+ return addresses;
+}
+
static RPCHelpMan deriveaddresses()
{
const std::string EXAMPLE_DESCRIPTOR = "wpkh([d34db33f/84h/0h/0h]xpub6DJ2dNUysrn5Vt36jH2KLBT2i1auw1tTSSomg8PhqNiUtx8QX2SvC9nrHu81fT41fvDUnhMjEzQgXnQjKEu3oaqMSzhSrHMxyyoEAmUHQbY/0/*)#cjjspncu";
@@ -226,11 +273,24 @@ static RPCHelpMan deriveaddresses()
{"descriptor", RPCArg::Type::STR, RPCArg::Optional::NO, "The descriptor."},
{"range", RPCArg::Type::RANGE, RPCArg::Optional::OMITTED, "If a ranged descriptor is used, this specifies the end or the range (in [begin,end] notation) to derive."},
},
- RPCResult{
- RPCResult::Type::ARR, "", "",
- {
- {RPCResult::Type::STR, "address", "the derived addresses"},
- }
+ {
+ RPCResult{"for single derivation descriptors",
+ RPCResult::Type::ARR, "", "",
+ {
+ {RPCResult::Type::STR, "address", "the derived addresses"},
+ }
+ },
+ RPCResult{"for multipath descriptors",
+ RPCResult::Type::ARR, "", "The derived addresses for each of the multipath expansions of the descriptor, in multipath specifier order",
+ {
+ {
+ RPCResult::Type::ARR, "", "The derived addresses for a multipath descriptor expansion",
+ {
+ {RPCResult::Type::STR, "address", "the derived address"},
+ },
+ },
+ },
+ },
},
RPCExamples{
"First three native segwit receive addresses\n" +
@@ -250,11 +310,11 @@ static RPCHelpMan deriveaddresses()
FlatSigningProvider key_provider;
std::string error;
- auto desc = Parse(desc_str, key_provider, error, /* require_checksum = */ true);
- if (!desc) {
+ auto descs = Parse(desc_str, key_provider, error, /* require_checksum = */ true);
+ if (descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
-
+ auto& desc = descs.at(0);
if (!desc->IsRange() && request.params.size() > 1) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor");
}
@@ -263,36 +323,18 @@ static RPCHelpMan deriveaddresses()
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range must be specified for a ranged descriptor");
}
- UniValue addresses(UniValue::VARR);
-
- for (int64_t i = range_begin; i <= range_end; ++i) {
- FlatSigningProvider provider;
- std::vector<CScript> scripts;
- if (!desc->Expand(i, key_provider, scripts, provider)) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot derive script without private keys");
- }
+ UniValue addresses = DeriveAddresses(desc.get(), range_begin, range_end, key_provider);
- for (const CScript& script : scripts) {
- CTxDestination dest;
- if (!ExtractDestination(script, dest)) {
- // ExtractDestination no longer returns true for P2PK since it doesn't have a corresponding address
- // However combo will output P2PK and should just ignore that script
- if (scripts.size() > 1 && std::get_if<PubKeyDestination>(&dest)) {
- continue;
- }
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Descriptor does not have a corresponding address");
- }
-
- addresses.push_back(EncodeDestination(dest));
- }
+ if (descs.size() == 1) {
+ return addresses;
}
- // This should not be possible, but an assert seems overkill:
- if (addresses.empty()) {
- throw JSONRPCError(RPC_MISC_ERROR, "Unexpected empty result");
+ UniValue ret(UniValue::VARR);
+ ret.push_back(addresses);
+ for (size_t i = 1; i < descs.size(); ++i) {
+ ret.push_back(DeriveAddresses(descs.at(i).get(), range_begin, range_end, key_provider));
}
-
- return addresses;
+ return ret;
},
};
}
diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp
index 21bc0e52f1..bb072370ce 100644
--- a/src/rpc/rawtransaction.cpp
+++ b/src/rpc/rawtransaction.cpp
@@ -405,11 +405,16 @@ static RPCHelpMan getrawtransaction()
CBlockUndo blockUndo;
CBlock block;
- if (tx->IsCoinBase() || !blockindex || WITH_LOCK(::cs_main, return chainman.m_blockman.IsBlockPruned(*blockindex)) ||
- !(chainman.m_blockman.UndoReadFromDisk(blockUndo, *blockindex) && chainman.m_blockman.ReadBlockFromDisk(block, *blockindex))) {
+ if (tx->IsCoinBase() || !blockindex || WITH_LOCK(::cs_main, return !(blockindex->nStatus & BLOCK_HAVE_MASK))) {
TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate());
return result;
}
+ if (!chainman.m_blockman.UndoReadFromDisk(blockUndo, *blockindex)) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Undo data expected but can't be read. This could be due to disk corruption or a conflict with a pruning event.");
+ }
+ if (!chainman.m_blockman.ReadBlockFromDisk(block, *blockindex)) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Block data expected but can't be read. This could be due to disk corruption or a conflict with a pruning event.");
+ }
CTxUndo* undoTX {nullptr};
auto it = std::find_if(block.vtx.begin(), block.vtx.end(), [tx](CTransactionRef t){ return *t == *tx; });
diff --git a/src/rpc/request.cpp b/src/rpc/request.cpp
index 083d1be44f..afd98f8875 100644
--- a/src/rpc/request.cpp
+++ b/src/rpc/request.cpp
@@ -226,10 +226,10 @@ void JSONRPCRequest::parse(const UniValue& valRequest)
throw JSONRPCError(RPC_INVALID_REQUEST, "Method must be a string");
strMethod = valMethod.get_str();
if (fLogIPs)
- LogPrint(BCLog::RPC, "ThreadRPCServer method=%s user=%s peeraddr=%s\n", SanitizeString(strMethod),
+ LogDebug(BCLog::RPC, "ThreadRPCServer method=%s user=%s peeraddr=%s\n", SanitizeString(strMethod),
this->authUser, this->peerAddr);
else
- LogPrint(BCLog::RPC, "ThreadRPCServer method=%s user=%s\n", SanitizeString(strMethod), this->authUser);
+ LogDebug(BCLog::RPC, "ThreadRPCServer method=%s user=%s\n", SanitizeString(strMethod), this->authUser);
// Parse params
const UniValue& valParams{request.find_value("params")};
diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
index 19063fa5be..2c07a2ff08 100644
--- a/src/rpc/server.cpp
+++ b/src/rpc/server.cpp
@@ -295,7 +295,7 @@ bool CRPCTable::removeCommand(const std::string& name, const CRPCCommand* pcmd)
void StartRPC()
{
- LogPrint(BCLog::RPC, "Starting RPC\n");
+ LogDebug(BCLog::RPC, "Starting RPC\n");
g_rpc_running = true;
g_rpcSignals.Started();
}
@@ -305,7 +305,7 @@ void InterruptRPC()
static std::once_flag g_rpc_interrupt_flag;
// This function could be called twice if the GUI has been started with -server=1.
std::call_once(g_rpc_interrupt_flag, []() {
- LogPrint(BCLog::RPC, "Interrupting RPC\n");
+ LogDebug(BCLog::RPC, "Interrupting RPC\n");
// Interrupt e.g. running longpolls
g_rpc_running = false;
});
@@ -317,7 +317,7 @@ void StopRPC()
// This function could be called twice if the GUI has been started with -server=1.
assert(!g_rpc_running);
std::call_once(g_rpc_stop_flag, []() {
- LogPrint(BCLog::RPC, "Stopping RPC\n");
+ LogDebug(BCLog::RPC, "Stopping RPC\n");
WITH_LOCK(g_deadline_timers_mutex, deadlineTimers.clear());
DeleteAuthCookie();
g_rpcSignals.Stopped();
@@ -583,7 +583,7 @@ void RPCRunLater(const std::string& name, std::function<void()> func, int64_t nS
throw JSONRPCError(RPC_INTERNAL_ERROR, "No timer handler registered for RPC");
LOCK(g_deadline_timers_mutex);
deadlineTimers.erase(name);
- LogPrint(BCLog::RPC, "queue run of timer %s in %i seconds (using %s)\n", name, nSeconds, timerInterface->Name());
+ LogDebug(BCLog::RPC, "queue run of timer %s in %i seconds (using %s)\n", name, nSeconds, timerInterface->Name());
deadlineTimers.emplace(name, std::unique_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000)));
}
diff --git a/src/rpc/txoutproof.cpp b/src/rpc/txoutproof.cpp
index 7958deb677..40294fda06 100644
--- a/src/rpc/txoutproof.cpp
+++ b/src/rpc/txoutproof.cpp
@@ -10,6 +10,7 @@
#include <merkleblock.h>
#include <node/blockstorage.h>
#include <primitives/transaction.h>
+#include <rpc/blockchain.h>
#include <rpc/server.h>
#include <rpc/server_util.h>
#include <rpc/util.h>
@@ -96,6 +97,10 @@ static RPCHelpMan gettxoutproof()
}
}
+ {
+ LOCK(cs_main);
+ CheckBlockDataAvailability(chainman.m_blockman, *pblockindex, /*check_for_undo=*/false);
+ }
CBlock block;
if (!chainman.m_blockman.ReadBlockFromDisk(block, *pblockindex)) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp
index cc49670198..678bac7a18 100644
--- a/src/rpc/util.cpp
+++ b/src/rpc/util.cpp
@@ -19,6 +19,7 @@
#include <script/signingprovider.h>
#include <script/solver.h>
#include <tinyformat.h>
+#include <uint256.h>
#include <univalue.h>
#include <util/check.h>
#include <util/result.h>
@@ -102,11 +103,11 @@ CFeeRate ParseFeeRate(const UniValue& json)
uint256 ParseHashV(const UniValue& v, std::string_view name)
{
const std::string& strHex(v.get_str());
- if (64 != strHex.length())
- throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be of length %d (not %d, for '%s')", name, 64, strHex.length(), strHex));
- if (!IsHex(strHex)) // Note: IsHex("") is false
- throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be hexadecimal string (not '%s')", name, strHex));
- return uint256S(strHex);
+ if (auto rv{uint256::FromHex(strHex)}) return *rv;
+ if (auto expected_len{uint256::size() * 2}; strHex.length() != expected_len) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be of length %d (not %d, for '%s')", name, expected_len, strHex.length(), strHex));
+ }
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be hexadecimal string (not '%s')", name, strHex));
}
uint256 ParseHashO(const UniValue& o, std::string_view strKey)
{
@@ -1345,24 +1346,26 @@ std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, Fl
}
std::string error;
- auto desc = Parse(desc_str, provider, error);
- if (!desc) {
+ auto descs = Parse(desc_str, provider, error);
+ if (descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
- if (!desc->IsRange()) {
+ if (!descs.at(0)->IsRange()) {
range.first = 0;
range.second = 0;
}
std::vector<CScript> ret;
for (int i = range.first; i <= range.second; ++i) {
- std::vector<CScript> scripts;
- if (!desc->Expand(i, provider, scripts, provider)) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys: '%s'", desc_str));
- }
- if (expand_priv) {
- desc->ExpandPrivate(/*pos=*/i, provider, /*out=*/provider);
+ for (const auto& desc : descs) {
+ std::vector<CScript> scripts;
+ if (!desc->Expand(i, provider, scripts, provider)) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys: '%s'", desc_str));
+ }
+ if (expand_priv) {
+ desc->ExpandPrivate(/*pos=*/i, provider, /*out=*/provider);
+ }
+ std::move(scripts.begin(), scripts.end(), std::back_inserter(ret));
}
- std::move(scripts.begin(), scripts.end(), std::back_inserter(ret));
}
return ret;
}
diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp
index ae9dba6a50..5026470edc 100644
--- a/src/script/descriptor.cpp
+++ b/src/script/descriptor.cpp
@@ -21,6 +21,7 @@
#include <util/strencodings.h>
#include <util/vector.h>
+#include <algorithm>
#include <memory>
#include <numeric>
#include <optional>
@@ -219,6 +220,9 @@ public:
virtual std::optional<CPubKey> GetRootPubKey() const = 0;
/** Return the extended public key for this PubkeyProvider, if it has one. */
virtual std::optional<CExtPubKey> GetRootExtPubKey() const = 0;
+
+ /** Make a deep copy of this PubkeyProvider */
+ virtual std::unique_ptr<PubkeyProvider> Clone() const = 0;
};
class OriginPubkeyProvider final : public PubkeyProvider
@@ -280,6 +284,10 @@ public:
{
return m_provider->GetRootExtPubKey();
}
+ std::unique_ptr<PubkeyProvider> Clone() const override
+ {
+ return std::make_unique<OriginPubkeyProvider>(m_expr_index, m_origin, m_provider->Clone(), m_apostrophe);
+ }
};
/** An object representing a parsed constant public key in a descriptor. */
@@ -333,6 +341,10 @@ public:
{
return std::nullopt;
}
+ std::unique_ptr<PubkeyProvider> Clone() const override
+ {
+ return std::make_unique<ConstPubkeyProvider>(m_expr_index, m_pubkey, m_xonly);
+ }
};
enum class DeriveType {
@@ -556,6 +568,10 @@ public:
{
return m_root_extkey;
}
+ std::unique_ptr<PubkeyProvider> Clone() const override
+ {
+ return std::make_unique<BIP32PubkeyProvider>(m_expr_index, m_root_extkey, m_path, m_derive, m_apostrophe);
+ }
};
/** Base class for all Descriptor implementations. */
@@ -771,6 +787,8 @@ public:
arg->GetPubKeys(pubkeys, ext_pubs);
}
}
+
+ virtual std::unique_ptr<DescriptorImpl> Clone() const = 0;
};
/** A parsed addr(A) descriptor. */
@@ -792,6 +810,10 @@ public:
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
std::optional<int64_t> ScriptSize() const override { return GetScriptForDestination(m_destination).size(); }
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<AddressDescriptor>(m_destination);
+ }
};
/** A parsed raw(H) descriptor. */
@@ -815,6 +837,11 @@ public:
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
std::optional<int64_t> ScriptSize() const override { return m_script.size(); }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<RawDescriptor>(m_script);
+ }
};
/** A parsed pk(P) descriptor. */
@@ -850,6 +877,11 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return 1; }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<PKDescriptor>(m_pubkey_args.at(0)->Clone(), m_xonly);
+ }
};
/** A parsed pkh(P) descriptor. */
@@ -879,6 +911,11 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return 2; }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<PKHDescriptor>(m_pubkey_args.at(0)->Clone());
+ }
};
/** A parsed wpkh(P) descriptor. */
@@ -908,6 +945,11 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return 2; }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<WPKHDescriptor>(m_pubkey_args.at(0)->Clone());
+ }
};
/** A parsed combo(P) descriptor. */
@@ -932,6 +974,10 @@ protected:
public:
ComboDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "combo") {}
bool IsSingleType() const final { return false; }
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<ComboDescriptor>(m_pubkey_args.at(0)->Clone());
+ }
};
/** A parsed multi(...) or sortedmulti(...) descriptor */
@@ -970,6 +1016,14 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return 1 + m_threshold; }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ std::vector<std::unique_ptr<PubkeyProvider>> providers;
+ providers.reserve(m_pubkey_args.size());
+ std::transform(m_pubkey_args.begin(), m_pubkey_args.end(), providers.begin(), [](const std::unique_ptr<PubkeyProvider>& p) { return p->Clone(); });
+ return std::make_unique<MultisigDescriptor>(m_threshold, std::move(providers), m_sorted);
+ }
};
/** A parsed (sorted)multi_a(...) descriptor. Always uses x-only pubkeys. */
@@ -1006,6 +1060,16 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return m_pubkey_args.size(); }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ std::vector<std::unique_ptr<PubkeyProvider>> providers;
+ providers.reserve(m_pubkey_args.size());
+ for (const auto& arg : m_pubkey_args) {
+ providers.push_back(arg->Clone());
+ }
+ return std::make_unique<MultiADescriptor>(m_threshold, std::move(providers), m_sorted);
+ }
};
/** A parsed sh(...) descriptor. */
@@ -1051,6 +1115,11 @@ public:
if (const auto sub_elems = m_subdescriptor_args[0]->MaxSatisfactionElems()) return 1 + *sub_elems;
return {};
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<SHDescriptor>(m_subdescriptor_args.at(0)->Clone());
+ }
};
/** A parsed wsh(...) descriptor. */
@@ -1087,6 +1156,11 @@ public:
if (const auto sub_elems = m_subdescriptor_args[0]->MaxSatisfactionElems()) return 1 + *sub_elems;
return {};
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<WSHDescriptor>(m_subdescriptor_args.at(0)->Clone());
+ }
};
/** A parsed tr(...) descriptor. */
@@ -1152,6 +1226,14 @@ public:
// FIXME: See above, we assume keypath spend.
return 1;
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ std::vector<std::unique_ptr<DescriptorImpl>> subdescs;
+ subdescs.reserve(m_subdescriptor_args.size());
+ std::transform(m_subdescriptor_args.begin(), m_subdescriptor_args.end(), subdescs.begin(), [](const std::unique_ptr<DescriptorImpl>& d) { return d->Clone(); });
+ return std::make_unique<TRDescriptor>(m_pubkey_args.at(0)->Clone(), std::move(subdescs), m_depths);
+ }
};
/* We instantiate Miniscript here with a simple integer as key type.
@@ -1270,6 +1352,16 @@ public:
std::optional<int64_t> MaxSatisfactionElems() const override {
return m_node->GetStackSize();
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ std::vector<std::unique_ptr<PubkeyProvider>> providers;
+ providers.reserve(m_pubkey_args.size());
+ for (const auto& arg : m_pubkey_args) {
+ providers.push_back(arg->Clone());
+ }
+ return std::make_unique<MiniscriptDescriptor>(std::move(providers), miniscript::MakeNodeRef<uint32_t>(*m_node));
+ }
};
/** A parsed rawtr(...) descriptor. */
@@ -1300,6 +1392,11 @@ public:
// See above, we assume keypath spend.
return 1;
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<RawTRDescriptor>(m_pubkey_args.at(0)->Clone());
+ }
};
////////////////////////////////////////////////////////////////////////////
@@ -1314,50 +1411,110 @@ enum class ParseScriptContext {
P2TR, //!< Inside tr() (either internal key, or BIP342 script leaf)
};
+std::optional<uint32_t> ParseKeyPathNum(Span<const char> elem, bool& apostrophe, std::string& error)
+{
+ bool hardened = false;
+ if (elem.size() > 0) {
+ const char last = elem[elem.size() - 1];
+ if (last == '\'' || last == 'h') {
+ elem = elem.first(elem.size() - 1);
+ hardened = true;
+ apostrophe = last == '\'';
+ }
+ }
+ uint32_t p;
+ if (!ParseUInt32(std::string(elem.begin(), elem.end()), &p)) {
+ error = strprintf("Key path value '%s' is not a valid uint32", std::string(elem.begin(), elem.end()));
+ return std::nullopt;
+ } else if (p > 0x7FFFFFFFUL) {
+ error = strprintf("Key path value %u is out of range", p);
+ return std::nullopt;
+ }
+
+ return std::make_optional<uint32_t>(p | (((uint32_t)hardened) << 31));
+}
+
/**
- * Parse a key path, being passed a split list of elements (the first element is ignored).
+ * Parse a key path, being passed a split list of elements (the first element is ignored because it is always the key).
*
* @param[in] split BIP32 path string, using either ' or h for hardened derivation
- * @param[out] out the key path
+ * @param[out] out Vector of parsed key paths
* @param[out] apostrophe only updated if hardened derivation is found
* @param[out] error parsing error message
+ * @param[in] allow_multipath Allows the parsed path to use the multipath specifier
* @returns false if parsing failed
**/
-[[nodiscard]] bool ParseKeyPath(const std::vector<Span<const char>>& split, KeyPath& out, bool& apostrophe, std::string& error)
+[[nodiscard]] bool ParseKeyPath(const std::vector<Span<const char>>& split, std::vector<KeyPath>& out, bool& apostrophe, std::string& error, bool allow_multipath)
{
+ KeyPath path;
+ std::optional<size_t> multipath_segment_index;
+ std::vector<uint32_t> multipath_values;
+ std::unordered_set<uint32_t> seen_multipath;
+
for (size_t i = 1; i < split.size(); ++i) {
- Span<const char> elem = split[i];
- bool hardened = false;
- if (elem.size() > 0) {
- const char last = elem[elem.size() - 1];
- if (last == '\'' || last == 'h') {
- elem = elem.first(elem.size() - 1);
- hardened = true;
- apostrophe = last == '\'';
+ const Span<const char>& elem = split[i];
+
+ // Check if element contain multipath specifier
+ if (!elem.empty() && elem.front() == '<' && elem.back() == '>') {
+ if (!allow_multipath) {
+ error = strprintf("Key path value '%s' specifies multipath in a section where multipath is not allowed", std::string(elem.begin(), elem.end()));
+ return false;
+ }
+ if (multipath_segment_index) {
+ error = "Multiple multipath key path specifiers found";
+ return false;
+ }
+
+ // Parse each possible value
+ std::vector<Span<const char>> nums = Split(Span(elem.begin()+1, elem.end()-1), ";");
+ if (nums.size() < 2) {
+ error = "Multipath key path specifiers must have at least two items";
+ return false;
}
+
+ for (const auto& num : nums) {
+ const auto& op_num = ParseKeyPathNum(num, apostrophe, error);
+ if (!op_num) return false;
+ auto [_, inserted] = seen_multipath.insert(*op_num);
+ if (!inserted) {
+ error = strprintf("Duplicated key path value %u in multipath specifier", *op_num);
+ return false;
+ }
+ multipath_values.emplace_back(*op_num);
+ }
+
+ path.emplace_back(); // Placeholder for multipath segment
+ multipath_segment_index = path.size()-1;
+ } else {
+ const auto& op_num = ParseKeyPathNum(elem, apostrophe, error);
+ if (!op_num) return false;
+ path.emplace_back(*op_num);
}
- uint32_t p;
- if (!ParseUInt32(std::string(elem.begin(), elem.end()), &p)) {
- error = strprintf("Key path value '%s' is not a valid uint32", std::string(elem.begin(), elem.end()));
- return false;
- } else if (p > 0x7FFFFFFFUL) {
- error = strprintf("Key path value %u is out of range", p);
- return false;
+ }
+
+ if (!multipath_segment_index) {
+ out.emplace_back(std::move(path));
+ } else {
+ // Replace the multipath placeholder with each value while generating paths
+ for (size_t i = 0; i < multipath_values.size(); i++) {
+ KeyPath branch_path = path;
+ branch_path[*multipath_segment_index] = multipath_values[i];
+ out.emplace_back(std::move(branch_path));
}
- out.push_back(p | (((uint32_t)hardened) << 31));
}
return true;
}
/** Parse a public key that excludes origin information. */
-std::unique_ptr<PubkeyProvider> ParsePubkeyInner(uint32_t key_exp_index, const Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, bool& apostrophe, std::string& error)
+std::vector<std::unique_ptr<PubkeyProvider>> ParsePubkeyInner(uint32_t key_exp_index, const Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, bool& apostrophe, std::string& error)
{
+ std::vector<std::unique_ptr<PubkeyProvider>> ret;
bool permit_uncompressed = ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH;
auto split = Split(sp, '/');
std::string str(split[0].begin(), split[0].end());
if (str.size() == 0) {
error = "No key provided";
- return nullptr;
+ return {};
}
if (split.size() == 1) {
if (IsHex(str)) {
@@ -1365,35 +1522,38 @@ std::unique_ptr<PubkeyProvider> ParsePubkeyInner(uint32_t key_exp_index, const S
CPubKey pubkey(data);
if (pubkey.IsValid() && !pubkey.IsValidNonHybrid()) {
error = "Hybrid public keys are not allowed";
- return nullptr;
+ return {};
}
if (pubkey.IsFullyValid()) {
if (permit_uncompressed || pubkey.IsCompressed()) {
- return std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, false);
+ ret.emplace_back(std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, false));
+ return ret;
} else {
error = "Uncompressed keys are not allowed";
- return nullptr;
+ return {};
}
} else if (data.size() == 32 && ctx == ParseScriptContext::P2TR) {
unsigned char fullkey[33] = {0x02};
std::copy(data.begin(), data.end(), fullkey + 1);
pubkey.Set(std::begin(fullkey), std::end(fullkey));
if (pubkey.IsFullyValid()) {
- return std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, true);
+ ret.emplace_back(std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, true));
+ return ret;
}
}
error = strprintf("Pubkey '%s' is invalid", str);
- return nullptr;
+ return {};
}
CKey key = DecodeSecret(str);
if (key.IsValid()) {
if (permit_uncompressed || key.IsCompressed()) {
CPubKey pubkey = key.GetPubKey();
out.keys.emplace(pubkey.GetID(), key);
- return std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, ctx == ParseScriptContext::P2TR);
+ ret.emplace_back(std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, ctx == ParseScriptContext::P2TR));
+ return ret;
} else {
error = "Uncompressed keys are not allowed";
- return nullptr;
+ return {};
}
}
}
@@ -1401,33 +1561,37 @@ std::unique_ptr<PubkeyProvider> ParsePubkeyInner(uint32_t key_exp_index, const S
CExtPubKey extpubkey = DecodeExtPubKey(str);
if (!extkey.key.IsValid() && !extpubkey.pubkey.IsValid()) {
error = strprintf("key '%s' is not valid", str);
- return nullptr;
+ return {};
}
- KeyPath path;
+ std::vector<KeyPath> paths;
DeriveType type = DeriveType::NO;
- if (split.back() == Span{"*"}.first(1)) {
+ if (std::ranges::equal(split.back(), Span{"*"}.first(1))) {
split.pop_back();
type = DeriveType::UNHARDENED;
- } else if (split.back() == Span{"*'"}.first(2) || split.back() == Span{"*h"}.first(2)) {
- apostrophe = split.back() == Span{"*'"}.first(2);
+ } else if (std::ranges::equal(split.back(), Span{"*'"}.first(2)) || std::ranges::equal(split.back(), Span{"*h"}.first(2))) {
+ apostrophe = std::ranges::equal(split.back(), Span{"*'"}.first(2));
split.pop_back();
type = DeriveType::HARDENED;
}
- if (!ParseKeyPath(split, path, apostrophe, error)) return nullptr;
+ if (!ParseKeyPath(split, paths, apostrophe, error, /*allow_multipath=*/true)) return {};
if (extkey.key.IsValid()) {
extpubkey = extkey.Neuter();
out.keys.emplace(extpubkey.pubkey.GetID(), extkey.key);
}
- return std::make_unique<BIP32PubkeyProvider>(key_exp_index, extpubkey, std::move(path), type, apostrophe);
+ for (auto& path : paths) {
+ ret.emplace_back(std::make_unique<BIP32PubkeyProvider>(key_exp_index, extpubkey, std::move(path), type, apostrophe));
+ }
+ return ret;
}
/** Parse a public key including origin information (if enabled). */
-std::unique_ptr<PubkeyProvider> ParsePubkey(uint32_t key_exp_index, const Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
+std::vector<std::unique_ptr<PubkeyProvider>> ParsePubkey(uint32_t key_exp_index, const Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
{
+ std::vector<std::unique_ptr<PubkeyProvider>> ret;
auto origin_split = Split(sp, ']');
if (origin_split.size() > 2) {
error = "Multiple ']' characters found for a single pubkey";
- return nullptr;
+ return {};
}
// This is set if either the origin or path suffix contains a hardened derivation.
bool apostrophe = false;
@@ -1437,27 +1601,33 @@ std::unique_ptr<PubkeyProvider> ParsePubkey(uint32_t key_exp_index, const Span<c
if (origin_split[0].empty() || origin_split[0][0] != '[') {
error = strprintf("Key origin start '[ character expected but not found, got '%c' instead",
origin_split[0].empty() ? /** empty, implies split char */ ']' : origin_split[0][0]);
- return nullptr;
+ return {};
}
auto slash_split = Split(origin_split[0].subspan(1), '/');
if (slash_split[0].size() != 8) {
error = strprintf("Fingerprint is not 4 bytes (%u characters instead of 8 characters)", slash_split[0].size());
- return nullptr;
+ return {};
}
std::string fpr_hex = std::string(slash_split[0].begin(), slash_split[0].end());
if (!IsHex(fpr_hex)) {
error = strprintf("Fingerprint '%s' is not hex", fpr_hex);
- return nullptr;
+ return {};
}
auto fpr_bytes = ParseHex(fpr_hex);
KeyOriginInfo info;
static_assert(sizeof(info.fingerprint) == 4, "Fingerprint must be 4 bytes");
assert(fpr_bytes.size() == 4);
std::copy(fpr_bytes.begin(), fpr_bytes.end(), info.fingerprint);
- if (!ParseKeyPath(slash_split, info.path, apostrophe, error)) return nullptr;
- auto provider = ParsePubkeyInner(key_exp_index, origin_split[1], ctx, out, apostrophe, error);
- if (!provider) return nullptr;
- return std::make_unique<OriginPubkeyProvider>(key_exp_index, std::move(info), std::move(provider), apostrophe);
+ std::vector<KeyPath> path;
+ if (!ParseKeyPath(slash_split, path, apostrophe, error, /*allow_multipath=*/false)) return {};
+ info.path = path.at(0);
+ auto providers = ParsePubkeyInner(key_exp_index, origin_split[1], ctx, out, apostrophe, error);
+ if (providers.empty()) return {};
+ ret.reserve(providers.size());
+ for (auto& prov : providers) {
+ ret.emplace_back(std::make_unique<OriginPubkeyProvider>(key_exp_index, info, std::move(prov), apostrophe));
+ }
+ return ret;
}
std::unique_ptr<PubkeyProvider> InferPubkey(const CPubKey& pubkey, ParseScriptContext ctx, const SigningProvider& provider)
@@ -1499,8 +1669,8 @@ struct KeyParser {
FlatSigningProvider* m_out;
//! Must not be nullptr if parsing from Script.
const SigningProvider* m_in;
- //! List of keys contained in the Miniscript.
- mutable std::vector<std::unique_ptr<PubkeyProvider>> m_keys;
+ //! List of multipath expanded keys contained in the Miniscript.
+ mutable std::vector<std::vector<std::unique_ptr<PubkeyProvider>>> m_keys;
//! Used to detect key parsing errors within a Miniscript.
mutable std::string m_key_parsing_error;
//! The script context we're operating within (Tapscript or P2WSH).
@@ -1513,7 +1683,7 @@ struct KeyParser {
: m_out(out), m_in(in), m_script_ctx(ctx), m_offset(offset) {}
bool KeyCompare(const Key& a, const Key& b) const {
- return *m_keys.at(a) < *m_keys.at(b);
+ return *m_keys.at(a).at(0) < *m_keys.at(b).at(0);
}
ParseScriptContext ParseContext() const {
@@ -1529,14 +1699,14 @@ struct KeyParser {
assert(m_out);
Key key = m_keys.size();
auto pk = ParsePubkey(m_offset + key, {&*begin, &*end}, ParseContext(), *m_out, m_key_parsing_error);
- if (!pk) return {};
- m_keys.push_back(std::move(pk));
+ if (pk.empty()) return {};
+ m_keys.emplace_back(std::move(pk));
return key;
}
std::optional<std::string> ToString(const Key& key) const
{
- return m_keys.at(key)->ToString();
+ return m_keys.at(key).at(0)->ToString();
}
template<typename I> std::optional<Key> FromPKBytes(I begin, I end) const
@@ -1547,13 +1717,15 @@ struct KeyParser {
XOnlyPubKey pubkey;
std::copy(begin, end, pubkey.begin());
if (auto pubkey_provider = InferPubkey(pubkey.GetEvenCorrespondingCPubKey(), ParseContext(), *m_in)) {
- m_keys.push_back(std::move(pubkey_provider));
+ m_keys.emplace_back();
+ m_keys.back().push_back(std::move(pubkey_provider));
return key;
}
} else if (!miniscript::IsTapscript(m_script_ctx)) {
CPubKey pubkey(begin, end);
if (auto pubkey_provider = InferPubkey(pubkey, ParseContext(), *m_in)) {
- m_keys.push_back(std::move(pubkey_provider));
+ m_keys.emplace_back();
+ m_keys.back().push_back(std::move(pubkey_provider));
return key;
}
}
@@ -1571,7 +1743,8 @@ struct KeyParser {
if (m_in->GetPubKey(keyid, pubkey)) {
if (auto pubkey_provider = InferPubkey(pubkey, ParseContext(), *m_in)) {
Key key = m_keys.size();
- m_keys.push_back(std::move(pubkey_provider));
+ m_keys.emplace_back();
+ m_keys.back().push_back(std::move(pubkey_provider));
return key;
}
}
@@ -1585,44 +1758,54 @@ struct KeyParser {
/** Parse a script in a particular context. */
// NOLINTNEXTLINE(misc-no-recursion)
-std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
+std::vector<std::unique_ptr<DescriptorImpl>> ParseScript(uint32_t& key_exp_index, Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
{
using namespace script;
+ std::vector<std::unique_ptr<DescriptorImpl>> ret;
auto expr = Expr(sp);
if (Func("pk", expr)) {
- auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
- if (!pubkey) {
+ auto pubkeys = ParsePubkey(key_exp_index, expr, ctx, out, error);
+ if (pubkeys.empty()) {
error = strprintf("pk(): %s", error);
- return nullptr;
+ return {};
}
++key_exp_index;
- return std::make_unique<PKDescriptor>(std::move(pubkey), ctx == ParseScriptContext::P2TR);
+ for (auto& pubkey : pubkeys) {
+ ret.emplace_back(std::make_unique<PKDescriptor>(std::move(pubkey), ctx == ParseScriptContext::P2TR));
+ }
+ return ret;
}
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH || ctx == ParseScriptContext::P2WSH) && Func("pkh", expr)) {
- auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
- if (!pubkey) {
+ auto pubkeys = ParsePubkey(key_exp_index, expr, ctx, out, error);
+ if (pubkeys.empty()) {
error = strprintf("pkh(): %s", error);
- return nullptr;
+ return {};
}
++key_exp_index;
- return std::make_unique<PKHDescriptor>(std::move(pubkey));
+ for (auto& pubkey : pubkeys) {
+ ret.emplace_back(std::make_unique<PKHDescriptor>(std::move(pubkey)));
+ }
+ return ret;
} else if (ctx != ParseScriptContext::P2TR && Func("pkh", expr)) {
// Under Taproot, always the Miniscript parser deal with it.
error = "Can only have pkh at top level, in sh(), wsh(), or in tr()";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("combo", expr)) {
- auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
- if (!pubkey) {
+ auto pubkeys = ParsePubkey(key_exp_index, expr, ctx, out, error);
+ if (pubkeys.empty()) {
error = strprintf("combo(): %s", error);
- return nullptr;
+ return {};
}
++key_exp_index;
- return std::make_unique<ComboDescriptor>(std::move(pubkey));
+ for (auto& pubkey : pubkeys) {
+ ret.emplace_back(std::make_unique<ComboDescriptor>(std::move(pubkey)));
+ }
+ return ret;
} else if (Func("combo", expr)) {
error = "Can only have combo() at top level";
- return nullptr;
+ return {};
}
const bool multi = Func("multi", expr);
const bool sortedmulti = !multi && Func("sortedmulti", expr);
@@ -1632,118 +1815,157 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
(ctx == ParseScriptContext::P2TR && (multi_a || sortedmulti_a))) {
auto threshold = Expr(expr);
uint32_t thres;
- std::vector<std::unique_ptr<PubkeyProvider>> providers;
+ std::vector<std::vector<std::unique_ptr<PubkeyProvider>>> providers; // List of multipath expanded pubkeys
if (!ParseUInt32(std::string(threshold.begin(), threshold.end()), &thres)) {
error = strprintf("Multi threshold '%s' is not valid", std::string(threshold.begin(), threshold.end()));
- return nullptr;
+ return {};
}
size_t script_size = 0;
+ size_t max_providers_len = 0;
while (expr.size()) {
if (!Const(",", expr)) {
error = strprintf("Multi: expected ',', got '%c'", expr[0]);
- return nullptr;
+ return {};
}
auto arg = Expr(expr);
- auto pk = ParsePubkey(key_exp_index, arg, ctx, out, error);
- if (!pk) {
+ auto pks = ParsePubkey(key_exp_index, arg, ctx, out, error);
+ if (pks.empty()) {
error = strprintf("Multi: %s", error);
- return nullptr;
+ return {};
}
- script_size += pk->GetSize() + 1;
- providers.emplace_back(std::move(pk));
+ script_size += pks.at(0)->GetSize() + 1;
+ max_providers_len = std::max(max_providers_len, pks.size());
+ providers.emplace_back(std::move(pks));
key_exp_index++;
}
if ((multi || sortedmulti) && (providers.empty() || providers.size() > MAX_PUBKEYS_PER_MULTISIG)) {
error = strprintf("Cannot have %u keys in multisig; must have between 1 and %d keys, inclusive", providers.size(), MAX_PUBKEYS_PER_MULTISIG);
- return nullptr;
+ return {};
} else if ((multi_a || sortedmulti_a) && (providers.empty() || providers.size() > MAX_PUBKEYS_PER_MULTI_A)) {
error = strprintf("Cannot have %u keys in multi_a; must have between 1 and %d keys, inclusive", providers.size(), MAX_PUBKEYS_PER_MULTI_A);
- return nullptr;
+ return {};
} else if (thres < 1) {
error = strprintf("Multisig threshold cannot be %d, must be at least 1", thres);
- return nullptr;
+ return {};
} else if (thres > providers.size()) {
error = strprintf("Multisig threshold cannot be larger than the number of keys; threshold is %d but only %u keys specified", thres, providers.size());
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP) {
if (providers.size() > 3) {
error = strprintf("Cannot have %u pubkeys in bare multisig; only at most 3 pubkeys", providers.size());
- return nullptr;
+ return {};
}
}
if (ctx == ParseScriptContext::P2SH) {
// This limits the maximum number of compressed pubkeys to 15.
if (script_size + 3 > MAX_SCRIPT_ELEMENT_SIZE) {
error = strprintf("P2SH script is too large, %d bytes is larger than %d bytes", script_size + 3, MAX_SCRIPT_ELEMENT_SIZE);
- return nullptr;
+ return {};
}
}
- if (multi || sortedmulti) {
- return std::make_unique<MultisigDescriptor>(thres, std::move(providers), sortedmulti);
- } else {
- return std::make_unique<MultiADescriptor>(thres, std::move(providers), sortedmulti_a);
+
+ // Make sure all vecs are of the same length, or exactly length 1
+ // For length 1 vectors, clone key providers until vector is the same length
+ for (auto& vec : providers) {
+ if (vec.size() == 1) {
+ for (size_t i = 1; i < max_providers_len; ++i) {
+ vec.emplace_back(vec.at(0)->Clone());
+ }
+ } else if (vec.size() != max_providers_len) {
+ error = strprintf("multi(): Multipath derivation paths have mismatched lengths");
+ return {};
+ }
}
+
+ // Build the final descriptors vector
+ for (size_t i = 0; i < max_providers_len; ++i) {
+ // Build final pubkeys vectors by retrieving the i'th subscript for each vector in subscripts
+ std::vector<std::unique_ptr<PubkeyProvider>> pubs;
+ pubs.reserve(providers.size());
+ for (auto& pub : providers) {
+ pubs.emplace_back(std::move(pub.at(i)));
+ }
+ if (multi || sortedmulti) {
+ ret.emplace_back(std::make_unique<MultisigDescriptor>(thres, std::move(pubs), sortedmulti));
+ } else {
+ ret.emplace_back(std::make_unique<MultiADescriptor>(thres, std::move(pubs), sortedmulti_a));
+ }
+ }
+ return ret;
} else if (multi || sortedmulti) {
error = "Can only have multi/sortedmulti at top level, in sh(), or in wsh()";
- return nullptr;
+ return {};
} else if (multi_a || sortedmulti_a) {
error = "Can only have multi_a/sortedmulti_a inside tr()";
- return nullptr;
+ return {};
}
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH) && Func("wpkh", expr)) {
- auto pubkey = ParsePubkey(key_exp_index, expr, ParseScriptContext::P2WPKH, out, error);
- if (!pubkey) {
+ auto pubkeys = ParsePubkey(key_exp_index, expr, ParseScriptContext::P2WPKH, out, error);
+ if (pubkeys.empty()) {
error = strprintf("wpkh(): %s", error);
- return nullptr;
+ return {};
}
key_exp_index++;
- return std::make_unique<WPKHDescriptor>(std::move(pubkey));
+ for (auto& pubkey : pubkeys) {
+ ret.emplace_back(std::make_unique<WPKHDescriptor>(std::move(pubkey)));
+ }
+ return ret;
} else if (Func("wpkh", expr)) {
error = "Can only have wpkh() at top level or inside sh()";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("sh", expr)) {
- auto desc = ParseScript(key_exp_index, expr, ParseScriptContext::P2SH, out, error);
- if (!desc || expr.size()) return nullptr;
- return std::make_unique<SHDescriptor>(std::move(desc));
+ auto descs = ParseScript(key_exp_index, expr, ParseScriptContext::P2SH, out, error);
+ if (descs.empty() || expr.size()) return {};
+ std::vector<std::unique_ptr<DescriptorImpl>> ret;
+ ret.reserve(descs.size());
+ for (auto& desc : descs) {
+ ret.push_back(std::make_unique<SHDescriptor>(std::move(desc)));
+ }
+ return ret;
} else if (Func("sh", expr)) {
error = "Can only have sh() at top level";
- return nullptr;
+ return {};
}
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH) && Func("wsh", expr)) {
- auto desc = ParseScript(key_exp_index, expr, ParseScriptContext::P2WSH, out, error);
- if (!desc || expr.size()) return nullptr;
- return std::make_unique<WSHDescriptor>(std::move(desc));
+ auto descs = ParseScript(key_exp_index, expr, ParseScriptContext::P2WSH, out, error);
+ if (descs.empty() || expr.size()) return {};
+ for (auto& desc : descs) {
+ ret.emplace_back(std::make_unique<WSHDescriptor>(std::move(desc)));
+ }
+ return ret;
} else if (Func("wsh", expr)) {
error = "Can only have wsh() at top level or inside sh()";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("addr", expr)) {
CTxDestination dest = DecodeDestination(std::string(expr.begin(), expr.end()));
if (!IsValidDestination(dest)) {
error = "Address is not valid";
- return nullptr;
+ return {};
}
- return std::make_unique<AddressDescriptor>(std::move(dest));
+ ret.emplace_back(std::make_unique<AddressDescriptor>(std::move(dest)));
+ return ret;
} else if (Func("addr", expr)) {
error = "Can only have addr() at top level";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("tr", expr)) {
auto arg = Expr(expr);
- auto internal_key = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
- if (!internal_key) {
+ auto internal_keys = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
+ if (internal_keys.empty()) {
error = strprintf("tr(): %s", error);
- return nullptr;
+ return {};
}
+ size_t max_providers_len = internal_keys.size();
++key_exp_index;
- std::vector<std::unique_ptr<DescriptorImpl>> subscripts; //!< list of script subexpressions
+ std::vector<std::vector<std::unique_ptr<DescriptorImpl>>> subscripts; //!< list of multipath expanded script subexpressions
std::vector<int> depths; //!< depth in the tree of each subexpression (same length subscripts)
if (expr.size()) {
if (!Const(",", expr)) {
error = strprintf("tr: expected ',', got '%c'", expr[0]);
- return nullptr;
+ return {};
}
/** The path from the top of the tree to what we're currently processing.
* branches[i] == false: left branch in the i'th step from the top; true: right branch.
@@ -1757,19 +1979,20 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
branches.push_back(false); // new left branch
if (branches.size() > TAPROOT_CONTROL_MAX_NODE_COUNT) {
error = strprintf("tr() supports at most %i nesting levels", TAPROOT_CONTROL_MAX_NODE_COUNT);
- return nullptr;
+ return {};
}
}
// Process the actual script expression.
auto sarg = Expr(expr);
subscripts.emplace_back(ParseScript(key_exp_index, sarg, ParseScriptContext::P2TR, out, error));
- if (!subscripts.back()) return nullptr;
+ if (subscripts.back().empty()) return {};
+ max_providers_len = std::max(max_providers_len, subscripts.back().size());
depths.push_back(branches.size());
// Process closing braces; one is expected for every right branch we were in.
while (branches.size() && branches.back()) {
if (!Const("}", expr)) {
error = strprintf("tr(): expected '}' after script expression");
- return nullptr;
+ return {};
}
branches.pop_back(); // move up one level after encountering '}'
}
@@ -1777,7 +2000,7 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
if (branches.size() && !branches.back()) {
if (!Const(",", expr)) {
error = strprintf("tr(): expected ',' after script expression");
- return nullptr;
+ return {};
}
branches.back() = true; // And now we're in a right branch.
}
@@ -1785,40 +2008,82 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
// After we've explored a whole tree, we must be at the end of the expression.
if (expr.size()) {
error = strprintf("tr(): expected ')' after script expression");
- return nullptr;
+ return {};
}
}
assert(TaprootBuilder::ValidDepths(depths));
- return std::make_unique<TRDescriptor>(std::move(internal_key), std::move(subscripts), std::move(depths));
+
+ // Make sure all vecs are of the same length, or exactly length 1
+ // For length 1 vectors, clone subdescs until vector is the same length
+ for (auto& vec : subscripts) {
+ if (vec.size() == 1) {
+ for (size_t i = 1; i < max_providers_len; ++i) {
+ vec.emplace_back(vec.at(0)->Clone());
+ }
+ } else if (vec.size() != max_providers_len) {
+ error = strprintf("tr(): Multipath subscripts have mismatched lengths");
+ return {};
+ }
+ }
+
+ if (internal_keys.size() > 1 && internal_keys.size() != max_providers_len) {
+ error = strprintf("tr(): Multipath internal key mismatches multipath subscripts lengths");
+ return {};
+ }
+
+ while (internal_keys.size() < max_providers_len) {
+ internal_keys.emplace_back(internal_keys.at(0)->Clone());
+ }
+
+ // Build the final descriptors vector
+ for (size_t i = 0; i < max_providers_len; ++i) {
+ // Build final subscripts vectors by retrieving the i'th subscript for each vector in subscripts
+ std::vector<std::unique_ptr<DescriptorImpl>> this_subs;
+ this_subs.reserve(subscripts.size());
+ for (auto& subs : subscripts) {
+ this_subs.emplace_back(std::move(subs.at(i)));
+ }
+ ret.emplace_back(std::make_unique<TRDescriptor>(std::move(internal_keys.at(i)), std::move(this_subs), depths));
+ }
+ return ret;
+
+
} else if (Func("tr", expr)) {
error = "Can only have tr at top level";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("rawtr", expr)) {
auto arg = Expr(expr);
if (expr.size()) {
error = strprintf("rawtr(): only one key expected.");
- return nullptr;
+ return {};
+ }
+ auto output_keys = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
+ if (output_keys.empty()) {
+ error = strprintf("rawtr(): %s", error);
+ return {};
}
- auto output_key = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
- if (!output_key) return nullptr;
++key_exp_index;
- return std::make_unique<RawTRDescriptor>(std::move(output_key));
+ for (auto& pubkey : output_keys) {
+ ret.emplace_back(std::make_unique<RawTRDescriptor>(std::move(pubkey)));
+ }
+ return ret;
} else if (Func("rawtr", expr)) {
error = "Can only have rawtr at top level";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("raw", expr)) {
std::string str(expr.begin(), expr.end());
if (!IsHex(str)) {
error = "Raw script is not hex";
- return nullptr;
+ return {};
}
auto bytes = ParseHex(str);
- return std::make_unique<RawDescriptor>(CScript(bytes.begin(), bytes.end()));
+ ret.emplace_back(std::make_unique<RawDescriptor>(CScript(bytes.begin(), bytes.end())));
+ return ret;
} else if (Func("raw", expr)) {
error = "Can only have raw() at top level";
- return nullptr;
+ return {};
}
// Process miniscript expressions.
{
@@ -1827,12 +2092,12 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
auto node = miniscript::FromString(std::string(expr.begin(), expr.end()), parser);
if (parser.m_key_parsing_error != "") {
error = std::move(parser.m_key_parsing_error);
- return nullptr;
+ return {};
}
if (node) {
if (ctx != ParseScriptContext::P2WSH && ctx != ParseScriptContext::P2TR) {
error = "Miniscript expressions can only be used in wsh or tr.";
- return nullptr;
+ return {};
}
if (!node->IsSane() || node->IsNotSatisfiable()) {
// Try to find the first insane sub for better error reporting.
@@ -1857,24 +2122,52 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
} else {
error += " is not satisfiable";
}
- return nullptr;
+ return {};
}
// A signature check is required for a miniscript to be sane. Therefore no sane miniscript
// may have an empty list of public keys.
CHECK_NONFATAL(!parser.m_keys.empty());
key_exp_index += parser.m_keys.size();
- return std::make_unique<MiniscriptDescriptor>(std::move(parser.m_keys), std::move(node));
+ // Make sure all vecs are of the same length, or exactly length 1
+ // For length 1 vectors, clone subdescs until vector is the same length
+ size_t num_multipath = std::max_element(parser.m_keys.begin(), parser.m_keys.end(),
+ [](const std::vector<std::unique_ptr<PubkeyProvider>>& a, const std::vector<std::unique_ptr<PubkeyProvider>>& b) {
+ return a.size() < b.size();
+ })->size();
+
+ for (auto& vec : parser.m_keys) {
+ if (vec.size() == 1) {
+ for (size_t i = 1; i < num_multipath; ++i) {
+ vec.emplace_back(vec.at(0)->Clone());
+ }
+ } else if (vec.size() != num_multipath) {
+ error = strprintf("Miniscript: Multipath derivation paths have mismatched lengths");
+ return {};
+ }
+ }
+
+ // Build the final descriptors vector
+ for (size_t i = 0; i < num_multipath; ++i) {
+ // Build final pubkeys vectors by retrieving the i'th subscript for each vector in subscripts
+ std::vector<std::unique_ptr<PubkeyProvider>> pubs;
+ pubs.reserve(parser.m_keys.size());
+ for (auto& pub : parser.m_keys) {
+ pubs.emplace_back(std::move(pub.at(i)));
+ }
+ ret.emplace_back(std::make_unique<MiniscriptDescriptor>(std::move(pubs), node));
+ }
+ return ret;
}
}
if (ctx == ParseScriptContext::P2SH) {
error = "A function is needed within P2SH";
- return nullptr;
+ return {};
} else if (ctx == ParseScriptContext::P2WSH) {
error = "A function is needed within P2WSH";
- return nullptr;
+ return {};
}
error = strprintf("'%s' is not a valid descriptor function", std::string(expr.begin(), expr.end()));
- return nullptr;
+ return {};
}
std::unique_ptr<DescriptorImpl> InferMultiA(const CScript& script, ParseScriptContext ctx, const SigningProvider& provider)
@@ -2012,7 +2305,12 @@ std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptCo
KeyParser parser(/* out = */nullptr, /* in = */&provider, /* ctx = */script_ctx);
auto node = miniscript::FromScript(script, parser);
if (node && node->IsSane()) {
- return std::make_unique<MiniscriptDescriptor>(std::move(parser.m_keys), std::move(node));
+ std::vector<std::unique_ptr<PubkeyProvider>> keys;
+ keys.reserve(parser.m_keys.size());
+ for (auto& key : parser.m_keys) {
+ keys.emplace_back(std::move(key.at(0)));
+ }
+ return std::make_unique<MiniscriptDescriptor>(std::move(keys), std::move(node));
}
}
@@ -2067,14 +2365,21 @@ bool CheckChecksum(Span<const char>& sp, bool require_checksum, std::string& err
return true;
}
-std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum)
+std::vector<std::unique_ptr<Descriptor>> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum)
{
Span<const char> sp{descriptor};
- if (!CheckChecksum(sp, require_checksum, error)) return nullptr;
+ if (!CheckChecksum(sp, require_checksum, error)) return {};
uint32_t key_exp_index = 0;
auto ret = ParseScript(key_exp_index, sp, ParseScriptContext::TOP, out, error);
- if (sp.size() == 0 && ret) return std::unique_ptr<Descriptor>(std::move(ret));
- return nullptr;
+ if (sp.size() == 0 && !ret.empty()) {
+ std::vector<std::unique_ptr<Descriptor>> descs;
+ descs.reserve(ret.size());
+ for (auto& r : ret) {
+ descs.emplace_back(std::unique_ptr<Descriptor>(std::move(r)));
+ }
+ return descs;
+ }
+ return {};
}
std::string GetDescriptorChecksum(const std::string& descriptor)
diff --git a/src/script/descriptor.h b/src/script/descriptor.h
index e78a775330..473649a314 100644
--- a/src/script/descriptor.h
+++ b/src/script/descriptor.h
@@ -173,9 +173,9 @@ struct Descriptor {
* is set, the checksum is mandatory - otherwise it is optional.
*
* If a parse error occurs, or the checksum is missing/invalid, or anything
- * else is wrong, `nullptr` is returned.
+ * else is wrong, an empty vector is returned.
*/
-std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum = false);
+std::vector<std::unique_ptr<Descriptor>> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum = false);
/** Get the checksum for a `descriptor`.
*
diff --git a/src/script/script.h b/src/script/script.h
index 323411251c..e3119cbe05 100644
--- a/src/script/script.h
+++ b/src/script/script.h
@@ -429,11 +429,11 @@ protected:
}
return *this;
}
+
public:
CScript() = default;
- CScript(const_iterator pbegin, const_iterator pend) : CScriptBase(pbegin, pend) { }
- CScript(std::vector<unsigned char>::const_iterator pbegin, std::vector<unsigned char>::const_iterator pend) : CScriptBase(pbegin, pend) { }
- CScript(const unsigned char* pbegin, const unsigned char* pend) : CScriptBase(pbegin, pend) { }
+ template <std::input_iterator InputIterator>
+ CScript(InputIterator first, InputIterator last) : CScriptBase{first, last} { }
SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); }
diff --git a/src/secp256k1/.github/workflows/ci.yml b/src/secp256k1/.github/workflows/ci.yml
index e238f3b7a1..0fc104d29b 100644
--- a/src/secp256k1/.github/workflows/ci.yml
+++ b/src/secp256k1/.github/workflows/ci.yml
@@ -632,7 +632,7 @@ jobs:
- name: Install Homebrew packages
run: |
- brew install automake libtool gcc
+ brew install --quiet automake libtool gcc
ln -s $(brew --prefix gcc)/bin/gcc-?? /usr/local/bin/gcc
- name: Install and cache Valgrind
@@ -691,7 +691,7 @@ jobs:
- name: Install Homebrew packages
run: |
- brew install automake libtool gcc
+ brew install --quiet automake libtool gcc
ln -s $(brew --prefix gcc)/bin/gcc-?? /usr/local/bin/gcc
- name: CI script
diff --git a/src/secp256k1/CHANGELOG.md b/src/secp256k1/CHANGELOG.md
index 0868e75480..fb82940627 100644
--- a/src/secp256k1/CHANGELOG.md
+++ b/src/secp256k1/CHANGELOG.md
@@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [Unreleased]
+
## [0.5.1] - 2024-08-01
#### Added
@@ -141,6 +143,7 @@ This version was in fact never released.
The number was given by the build system since the introduction of autotools in Jan 2014 (ea0fe5a5bf0c04f9cc955b2966b614f5f378c6f6).
Therefore, this version number does not uniquely identify a set of source files.
+[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.1...HEAD
[0.5.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.0...v0.5.1
[0.5.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.1...v0.5.0
[0.4.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.0...v0.4.1
diff --git a/src/secp256k1/CMakeLists.txt b/src/secp256k1/CMakeLists.txt
index 7a87686056..d5a7a2de39 100644
--- a/src/secp256k1/CMakeLists.txt
+++ b/src/secp256k1/CMakeLists.txt
@@ -4,7 +4,7 @@ project(libsecp256k1
# The package (a.k.a. release) version is based on semantic versioning 2.0.0 of
# the API. All changes in experimental modules are treated as
# backwards-compatible and therefore at most increase the minor version.
- VERSION 0.5.1
+ VERSION 0.5.2
DESCRIPTION "Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1."
HOMEPAGE_URL "https://github.com/bitcoin-core/secp256k1"
LANGUAGES C
@@ -27,7 +27,7 @@ endif()
# All changes in experimental modules are treated as if they don't affect the
# interface and therefore only increase the revision.
set(${PROJECT_NAME}_LIB_VERSION_CURRENT 4)
-set(${PROJECT_NAME}_LIB_VERSION_REVISION 1)
+set(${PROJECT_NAME}_LIB_VERSION_REVISION 2)
set(${PROJECT_NAME}_LIB_VERSION_AGE 2)
set(CMAKE_C_STANDARD 90)
@@ -276,6 +276,14 @@ if(SECP256K1_APPEND_CFLAGS)
string(APPEND CMAKE_C_COMPILE_OBJECT " ${SECP256K1_APPEND_CFLAGS}")
endif()
+set(SECP256K1_APPEND_LDFLAGS "" CACHE STRING "Linker flags that are appended to the command line after all other flags added by the build system. This variable is intended for debugging and special builds.")
+if(SECP256K1_APPEND_LDFLAGS)
+ # Appending to this low-level rule variable is the only way to
+ # guarantee that the flags appear at the end of the command line.
+ string(APPEND CMAKE_C_CREATE_SHARED_LIBRARY " ${SECP256K1_APPEND_LDFLAGS}")
+ string(APPEND CMAKE_C_LINK_EXECUTABLE " ${SECP256K1_APPEND_LDFLAGS}")
+endif()
+
add_subdirectory(src)
if(SECP256K1_BUILD_EXAMPLES)
add_subdirectory(examples)
@@ -355,6 +363,9 @@ endif()
if(SECP256K1_APPEND_CFLAGS)
message("SECP256K1_APPEND_CFLAGS ............... ${SECP256K1_APPEND_CFLAGS}")
endif()
+if(SECP256K1_APPEND_LDFLAGS)
+ message("SECP256K1_APPEND_LDFLAGS .............. ${SECP256K1_APPEND_LDFLAGS}")
+endif()
message("")
if(print_msan_notice)
message(
diff --git a/src/secp256k1/ci/linux-debian.Dockerfile b/src/secp256k1/ci/linux-debian.Dockerfile
index 5ce715b41b..241bfa9719 100644
--- a/src/secp256k1/ci/linux-debian.Dockerfile
+++ b/src/secp256k1/ci/linux-debian.Dockerfile
@@ -40,7 +40,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
apt-get clean && rm -rf /var/lib/apt/lists/*
# Build and install gcc snapshot
-ARG GCC_SNAPSHOT_MAJOR=14
+ARG GCC_SNAPSHOT_MAJOR=15
RUN apt-get update && apt-get install --no-install-recommends -y wget libgmp-dev libmpfr-dev libmpc-dev flex && \
mkdir gcc && cd gcc && \
wget --progress=dot:giga --https-only --recursive --accept '*.tar.xz' --level 1 --no-directories "https://gcc.gnu.org/pub/gcc/snapshots/LATEST-${GCC_SNAPSHOT_MAJOR}" && \
diff --git a/src/secp256k1/configure.ac b/src/secp256k1/configure.ac
index 6c4c11ddcd..6841543f59 100644
--- a/src/secp256k1/configure.ac
+++ b/src/secp256k1/configure.ac
@@ -5,8 +5,8 @@ AC_PREREQ([2.60])
# backwards-compatible and therefore at most increase the minor version.
define(_PKG_VERSION_MAJOR, 0)
define(_PKG_VERSION_MINOR, 5)
-define(_PKG_VERSION_PATCH, 1)
-define(_PKG_VERSION_IS_RELEASE, true)
+define(_PKG_VERSION_PATCH, 2)
+define(_PKG_VERSION_IS_RELEASE, false)
# The library version is based on libtool versioning of the ABI. The set of
# rules for updating the version can be found here:
@@ -14,7 +14,7 @@ define(_PKG_VERSION_IS_RELEASE, true)
# All changes in experimental modules are treated as if they don't affect the
# interface and therefore only increase the revision.
define(_LIB_VERSION_CURRENT, 4)
-define(_LIB_VERSION_REVISION, 1)
+define(_LIB_VERSION_REVISION, 2)
define(_LIB_VERSION_AGE, 2)
AC_INIT([libsecp256k1],m4_join([.], _PKG_VERSION_MAJOR, _PKG_VERSION_MINOR, _PKG_VERSION_PATCH)m4_if(_PKG_VERSION_IS_RELEASE, [true], [], [-dev]),[https://github.com/bitcoin-core/secp256k1/issues],[libsecp256k1],[https://github.com/bitcoin-core/secp256k1])
diff --git a/src/secp256k1/examples/schnorr.c b/src/secp256k1/examples/schnorr.c
index b0409b986b..8d5d14bdaf 100644
--- a/src/secp256k1/examples/schnorr.c
+++ b/src/secp256k1/examples/schnorr.c
@@ -18,9 +18,9 @@
#include "examples_util.h"
int main(void) {
- unsigned char msg[12] = "Hello World!";
+ unsigned char msg[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
unsigned char msg_hash[32];
- unsigned char tag[17] = "my_fancy_protocol";
+ unsigned char tag[] = {'m', 'y', '_', 'f', 'a', 'n', 'c', 'y', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l'};
unsigned char seckey[32];
unsigned char randomize[32];
unsigned char auxiliary_rand[32];
diff --git a/src/secp256k1/include/secp256k1_ellswift.h b/src/secp256k1/include/secp256k1_ellswift.h
index ae37287f82..0d1293e94f 100644
--- a/src/secp256k1/include/secp256k1_ellswift.h
+++ b/src/secp256k1/include/secp256k1_ellswift.h
@@ -35,7 +35,7 @@ extern "C" {
*
* If the Y coordinate is relevant, it is given the same parity as t.
*
- * Changes w.r.t. the the paper:
+ * Changes w.r.t. the paper:
* - The u=0, t=0, and u^3+t^2+7=0 conditions result in decoding to the point
* at infinity in the paper. Here they are remapped to finite points.
* - The paper uses an additional encoding bit for the parity of y. Here the
diff --git a/src/secp256k1/src/modules/ellswift/tests_impl.h b/src/secp256k1/src/modules/ellswift/tests_impl.h
index ed5658f34c..3c314c9b50 100644
--- a/src/secp256k1/src/modules/ellswift/tests_impl.h
+++ b/src/secp256k1/src/modules/ellswift/tests_impl.h
@@ -406,9 +406,9 @@ void run_ellswift_tests(void) {
/* Test hash initializers. */
{
secp256k1_sha256 sha, sha_optimized;
- static const unsigned char encode_tag[25] = "secp256k1_ellswift_encode";
- static const unsigned char create_tag[25] = "secp256k1_ellswift_create";
- static const unsigned char bip324_tag[26] = "bip324_ellswift_xonly_ecdh";
+ static const unsigned char encode_tag[] = {'s', 'e', 'c', 'p', '2', '5', '6', 'k', '1', '_', 'e', 'l', 'l', 's', 'w', 'i', 'f', 't', '_', 'e', 'n', 'c', 'o', 'd', 'e'};
+ static const unsigned char create_tag[] = {'s', 'e', 'c', 'p', '2', '5', '6', 'k', '1', '_', 'e', 'l', 'l', 's', 'w', 'i', 'f', 't', '_', 'c', 'r', 'e', 'a', 't', 'e'};
+ static const unsigned char bip324_tag[] = {'b', 'i', 'p', '3', '2', '4', '_', 'e', 'l', 'l', 's', 'w', 'i', 'f', 't', '_', 'x', 'o', 'n', 'l', 'y', '_', 'e', 'c', 'd', 'h'};
/* Check that hash initialized by
* secp256k1_ellswift_sha256_init_encode has the expected
diff --git a/src/secp256k1/src/modules/schnorrsig/main_impl.h b/src/secp256k1/src/modules/schnorrsig/main_impl.h
index 26727e4651..57f7eadd3c 100644
--- a/src/secp256k1/src/modules/schnorrsig/main_impl.h
+++ b/src/secp256k1/src/modules/schnorrsig/main_impl.h
@@ -45,7 +45,7 @@ static void secp256k1_nonce_function_bip340_sha256_tagged_aux(secp256k1_sha256 *
/* algo argument for nonce_function_bip340 to derive the nonce exactly as stated in BIP-340
* by using the correct tagged hash function. */
-static const unsigned char bip340_algo[13] = "BIP0340/nonce";
+static const unsigned char bip340_algo[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'n', 'o', 'n', 'c', 'e'};
static const unsigned char schnorrsig_extraparams_magic[4] = SECP256K1_SCHNORRSIG_EXTRAPARAMS_MAGIC;
diff --git a/src/secp256k1/src/modules/schnorrsig/tests_impl.h b/src/secp256k1/src/modules/schnorrsig/tests_impl.h
index aa4fc38270..2d716a01f8 100644
--- a/src/secp256k1/src/modules/schnorrsig/tests_impl.h
+++ b/src/secp256k1/src/modules/schnorrsig/tests_impl.h
@@ -21,9 +21,9 @@ static void nonce_function_bip340_bitflip(unsigned char **args, size_t n_flip, s
}
static void run_nonce_function_bip340_tests(void) {
- unsigned char tag[13] = "BIP0340/nonce";
- unsigned char aux_tag[11] = "BIP0340/aux";
- unsigned char algo[13] = "BIP0340/nonce";
+ unsigned char tag[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'n', 'o', 'n', 'c', 'e'};
+ unsigned char aux_tag[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'a', 'u', 'x'};
+ unsigned char algo[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'n', 'o', 'n', 'c', 'e'};
size_t algolen = sizeof(algo);
secp256k1_sha256 sha;
secp256k1_sha256 sha_optimized;
@@ -158,7 +158,7 @@ static void test_schnorrsig_api(void) {
/* Checks that hash initialized by secp256k1_schnorrsig_sha256_tagged has the
* expected state. */
static void test_schnorrsig_sha256_tagged(void) {
- unsigned char tag[17] = "BIP0340/challenge";
+ unsigned char tag[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'c', 'h', 'a', 'l', 'l', 'e', 'n', 'g', 'e'};
secp256k1_sha256 sha;
secp256k1_sha256 sha_optimized;
@@ -806,7 +806,7 @@ static void test_schnorrsig_sign(void) {
unsigned char sk[32];
secp256k1_xonly_pubkey pk;
secp256k1_keypair keypair;
- const unsigned char msg[32] = "this is a msg for a schnorrsig..";
+ const unsigned char msg[] = {'t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 'm', 's', 'g', ' ', 'f', 'o', 'r', ' ', 'a', ' ', 's', 'c', 'h', 'n', 'o', 'r', 'r', 's', 'i', 'g', '.', '.'};
unsigned char sig[64];
unsigned char sig2[64];
unsigned char zeros64[64] = { 0 };
diff --git a/src/secp256k1/src/testrand_impl.h b/src/secp256k1/src/testrand_impl.h
index 07564f7f3f..b84f5730a9 100644
--- a/src/secp256k1/src/testrand_impl.h
+++ b/src/secp256k1/src/testrand_impl.h
@@ -18,7 +18,7 @@
static uint64_t secp256k1_test_state[4];
SECP256K1_INLINE static void testrand_seed(const unsigned char *seed16) {
- static const unsigned char PREFIX[19] = "secp256k1 test init";
+ static const unsigned char PREFIX[] = {'s', 'e', 'c', 'p', '2', '5', '6', 'k', '1', ' ', 't', 'e', 's', 't', ' ', 'i', 'n', 'i', 't'};
unsigned char out32[32];
secp256k1_sha256 hash;
int i;
diff --git a/src/signet.cpp b/src/signet.cpp
index 7c193a1d77..9b7ffd07cd 100644
--- a/src/signet.cpp
+++ b/src/signet.cpp
@@ -4,10 +4,6 @@
#include <signet.h>
-#include <array>
-#include <cstdint>
-#include <vector>
-
#include <common/system.h>
#include <consensus/merkle.h>
#include <consensus/params.h>
@@ -23,6 +19,11 @@
#include <uint256.h>
#include <util/strencodings.h>
+#include <algorithm>
+#include <array>
+#include <cstdint>
+#include <vector>
+
static constexpr uint8_t SIGNET_HEADER[4] = {0xec, 0xc7, 0xda, 0xa2};
static constexpr unsigned int BLOCK_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_NULLDUMMY;
@@ -38,7 +39,7 @@ static bool FetchAndClearCommitmentSection(const Span<const uint8_t> header, CSc
std::vector<uint8_t> pushdata;
while (witness_commitment.GetOp(pc, opcode, pushdata)) {
if (pushdata.size() > 0) {
- if (!found_header && pushdata.size() > (size_t)header.size() && Span{pushdata}.first(header.size()) == header) {
+ if (!found_header && pushdata.size() > header.size() && std::ranges::equal(Span{pushdata}.first(header.size()), header)) {
// pushdata only counts if it has the header _and_ some data
result.insert(result.end(), pushdata.begin() + header.size(), pushdata.end());
pushdata.erase(pushdata.begin() + header.size(), pushdata.end());
@@ -132,7 +133,7 @@ bool CheckSignetBlockSolution(const CBlock& block, const Consensus::Params& cons
const std::optional<SignetTxs> signet_txs = SignetTxs::Create(block, challenge);
if (!signet_txs) {
- LogPrint(BCLog::VALIDATION, "CheckSignetBlockSolution: Errors in block (block solution parse failure)\n");
+ LogDebug(BCLog::VALIDATION, "CheckSignetBlockSolution: Errors in block (block solution parse failure)\n");
return false;
}
@@ -144,7 +145,7 @@ bool CheckSignetBlockSolution(const CBlock& block, const Consensus::Params& cons
TransactionSignatureChecker sigcheck(&signet_txs->m_to_sign, /* nInIn= */ 0, /* amountIn= */ signet_txs->m_to_spend.vout[0].nValue, txdata, MissingDataBehavior::ASSERT_FAIL);
if (!VerifyScript(scriptSig, signet_txs->m_to_spend.vout[0].scriptPubKey, &witness, BLOCK_SCRIPT_VERIFY_FLAGS, sigcheck)) {
- LogPrint(BCLog::VALIDATION, "CheckSignetBlockSolution: Errors in block (block solution invalid)\n");
+ LogDebug(BCLog::VALIDATION, "CheckSignetBlockSolution: Errors in block (block solution invalid)\n");
return false;
}
return true;
diff --git a/src/span.h b/src/span.h
index c974c265ce..3c5028f0b7 100644
--- a/src/span.h
+++ b/src/span.h
@@ -5,11 +5,11 @@
#ifndef BITCOIN_SPAN_H
#define BITCOIN_SPAN_H
-#include <algorithm>
#include <cassert>
#include <cstddef>
#include <span>
#include <type_traits>
+#include <utility>
#ifdef DEBUG
#define CONSTEXPR_IF_NOT_DEBUG
@@ -213,13 +213,6 @@ public:
return Span<C>(m_data + m_size - count, count);
}
- friend constexpr bool operator==(const Span& a, const Span& b) noexcept { return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin()); }
- friend constexpr bool operator!=(const Span& a, const Span& b) noexcept { return !(a == b); }
- friend constexpr bool operator<(const Span& a, const Span& b) noexcept { return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()); }
- friend constexpr bool operator<=(const Span& a, const Span& b) noexcept { return !(b < a); }
- friend constexpr bool operator>(const Span& a, const Span& b) noexcept { return (b < a); }
- friend constexpr bool operator>=(const Span& a, const Span& b) noexcept { return !(a < b); }
-
template <typename O> friend class Span;
};
diff --git a/src/test/.gitignore b/src/test/.gitignore
deleted file mode 100644
index 036df1430c..0000000000
--- a/src/test/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# capnp generated files
-*.capnp.*
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
new file mode 100644
index 0000000000..2c9957117c
--- /dev/null
+++ b/src/test/CMakeLists.txt
@@ -0,0 +1,224 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+include(GenerateHeaders)
+generate_header_from_json(data/base58_encode_decode.json)
+generate_header_from_json(data/bip341_wallet_vectors.json)
+generate_header_from_json(data/blockfilters.json)
+generate_header_from_json(data/key_io_invalid.json)
+generate_header_from_json(data/key_io_valid.json)
+generate_header_from_json(data/script_tests.json)
+generate_header_from_json(data/sighash.json)
+generate_header_from_json(data/tx_invalid.json)
+generate_header_from_json(data/tx_valid.json)
+generate_header_from_raw(data/asmap.raw test::data)
+
+# Do not use generator expressions in test sources because the
+# SOURCES property is processed to gather test suite macros.
+add_executable(test_bitcoin
+ main.cpp
+ $<TARGET_OBJECTS:bitcoin_consensus>
+ ${CMAKE_CURRENT_BINARY_DIR}/data/asmap.raw.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/base58_encode_decode.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/bip341_wallet_vectors.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/blockfilters.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/key_io_invalid.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/key_io_valid.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/script_tests.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/sighash.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/tx_invalid.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/tx_valid.json.h
+ addrman_tests.cpp
+ allocator_tests.cpp
+ amount_tests.cpp
+ argsman_tests.cpp
+ arith_uint256_tests.cpp
+ banman_tests.cpp
+ base32_tests.cpp
+ base58_tests.cpp
+ base64_tests.cpp
+ bech32_tests.cpp
+ bip32_tests.cpp
+ bip324_tests.cpp
+ blockchain_tests.cpp
+ blockencodings_tests.cpp
+ blockfilter_index_tests.cpp
+ blockfilter_tests.cpp
+ blockmanager_tests.cpp
+ bloom_tests.cpp
+ bswap_tests.cpp
+ checkqueue_tests.cpp
+ cluster_linearize_tests.cpp
+ coins_tests.cpp
+ coinscachepair_tests.cpp
+ coinstatsindex_tests.cpp
+ common_url_tests.cpp
+ compilerbug_tests.cpp
+ compress_tests.cpp
+ crypto_tests.cpp
+ cuckoocache_tests.cpp
+ dbwrapper_tests.cpp
+ denialofservice_tests.cpp
+ descriptor_tests.cpp
+ disconnected_transactions.cpp
+ feefrac_tests.cpp
+ flatfile_tests.cpp
+ fs_tests.cpp
+ getarg_tests.cpp
+ hash_tests.cpp
+ headers_sync_chainwork_tests.cpp
+ httpserver_tests.cpp
+ i2p_tests.cpp
+ interfaces_tests.cpp
+ key_io_tests.cpp
+ key_tests.cpp
+ logging_tests.cpp
+ mempool_tests.cpp
+ merkle_tests.cpp
+ merkleblock_tests.cpp
+ miner_tests.cpp
+ miniminer_tests.cpp
+ miniscript_tests.cpp
+ minisketch_tests.cpp
+ multisig_tests.cpp
+ net_peer_connection_tests.cpp
+ net_peer_eviction_tests.cpp
+ net_tests.cpp
+ netbase_tests.cpp
+ node_warnings_tests.cpp
+ orphanage_tests.cpp
+ peerman_tests.cpp
+ pmt_tests.cpp
+ policy_fee_tests.cpp
+ policyestimator_tests.cpp
+ pool_tests.cpp
+ pow_tests.cpp
+ prevector_tests.cpp
+ raii_event_tests.cpp
+ random_tests.cpp
+ rbf_tests.cpp
+ rest_tests.cpp
+ result_tests.cpp
+ reverselock_tests.cpp
+ rpc_tests.cpp
+ sanity_tests.cpp
+ scheduler_tests.cpp
+ script_p2sh_tests.cpp
+ script_parse_tests.cpp
+ script_segwit_tests.cpp
+ script_standard_tests.cpp
+ script_tests.cpp
+ scriptnum_tests.cpp
+ serfloat_tests.cpp
+ serialize_tests.cpp
+ settings_tests.cpp
+ sighash_tests.cpp
+ sigopcount_tests.cpp
+ skiplist_tests.cpp
+ sock_tests.cpp
+ span_tests.cpp
+ streams_tests.cpp
+ sync_tests.cpp
+ system_tests.cpp
+ timeoffsets_tests.cpp
+ torcontrol_tests.cpp
+ transaction_tests.cpp
+ translation_tests.cpp
+ txindex_tests.cpp
+ txpackage_tests.cpp
+ txreconciliation_tests.cpp
+ txrequest_tests.cpp
+ txvalidation_tests.cpp
+ txvalidationcache_tests.cpp
+ uint256_tests.cpp
+ util_string_tests.cpp
+ util_tests.cpp
+ util_threadnames_tests.cpp
+ validation_block_tests.cpp
+ validation_chainstate_tests.cpp
+ validation_chainstatemanager_tests.cpp
+ validation_flush_tests.cpp
+ validation_tests.cpp
+ validationinterface_tests.cpp
+ versionbits_tests.cpp
+)
+
+target_link_libraries(test_bitcoin
+ core_interface
+ test_util
+ bitcoin_cli
+ bitcoin_node
+ minisketch
+ secp256k1
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:libevent::libevent>
+)
+
+if(ENABLE_WALLET)
+ add_subdirectory(${PROJECT_SOURCE_DIR}/src/wallet/test wallet)
+endif()
+
+if(WITH_MULTIPROCESS)
+ add_library(bitcoin_ipc_test STATIC EXCLUDE_FROM_ALL
+ ipc_test.cpp
+ )
+
+ target_capnp_sources(bitcoin_ipc_test ${PROJECT_SOURCE_DIR}
+ ipc_test.capnp
+ )
+
+ target_link_libraries(bitcoin_ipc_test
+ PRIVATE
+ core_interface
+ univalue
+ )
+
+ target_sources(test_bitcoin
+ PRIVATE
+ ipc_tests.cpp
+ )
+ target_link_libraries(test_bitcoin bitcoin_ipc_test bitcoin_ipc)
+endif()
+
+function(add_boost_test source_file)
+ if(NOT EXISTS ${source_file})
+ return()
+ endif()
+
+ file(READ "${source_file}" source_file_content)
+ string(REGEX
+ MATCH "(BOOST_FIXTURE_TEST_SUITE|BOOST_AUTO_TEST_SUITE)\\(([A-Za-z0-9_]+)"
+ test_suite_macro "${source_file_content}"
+ )
+ string(REGEX
+ REPLACE "(BOOST_FIXTURE_TEST_SUITE|BOOST_AUTO_TEST_SUITE)\\(" ""
+ test_suite_name "${test_suite_macro}"
+ )
+ if(test_suite_name)
+ add_test(NAME ${test_suite_name}
+ COMMAND test_bitcoin --run_test=${test_suite_name} --catch_system_error=no --log_level=test_suite -- DEBUG_LOG_OUT
+ )
+ set_property(TEST ${test_suite_name} PROPERTY
+ SKIP_REGULAR_EXPRESSION "no test cases matching filter"
+ )
+ endif()
+endfunction()
+
+function(add_all_test_targets)
+ get_target_property(test_source_dir test_bitcoin SOURCE_DIR)
+ get_target_property(test_sources test_bitcoin SOURCES)
+ foreach(test_source ${test_sources})
+ cmake_path(IS_RELATIVE test_source result)
+ if(result)
+ cmake_path(APPEND test_source_dir ${test_source} OUTPUT_VARIABLE test_source)
+ endif()
+ add_boost_test(${test_source})
+ endforeach()
+endfunction()
+
+add_all_test_targets()
+
+install(TARGETS test_bitcoin
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
diff --git a/src/test/Makefile b/src/test/Makefile
deleted file mode 100644
index 87bf73fec9..0000000000
--- a/src/test/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-all:
- $(MAKE) -C .. bitcoin_test
-clean:
- $(MAKE) -C .. bitcoin_test_clean
-check:
- $(MAKE) -C .. bitcoin_test_check
diff --git a/src/test/README.md b/src/test/README.md
index bab1a28f61..7e0f245ee8 100644
--- a/src/test/README.md
+++ b/src/test/README.md
@@ -10,59 +10,76 @@ The build system is set up to compile an executable called `test_bitcoin`
that runs all of the unit tests. The main source file for the test library is found in
`util/setup_common.cpp`.
+The examples in this document assume the build directory is named
+`build`. You'll need to adapt them if you named it differently.
+
### Compiling/running unit tests
-Unit tests will be automatically compiled if dependencies were met in `./configure`
+Unit tests will be automatically compiled if dependencies were met
+during the generation of the Bitcoin Core build system
and tests weren't explicitly disabled.
-After configuring, they can be run with `make check`, which includes unit tests from
-subtrees, or `make && make -C src check-unit` for just the unit tests.
+The unit tests can be run with `ctest --test-dir build`, which includes unit
+tests from subtrees.
+
+Run `test_bitcoin --list_content` for the full list of tests.
-To run the unit tests manually, launch `src/test/test_bitcoin`. To recompile
-after a test file was modified, run `make` and then run the test again. If you
-modify a non-test file, use `make -C src/test` to recompile only what's needed
+To run the unit tests manually, launch `build/src/test/test_bitcoin`. To recompile
+after a test file was modified, run `cmake --build build` and then run the test again. If you
+modify a non-test file, use `cmake --build build --target test_bitcoin` to recompile only what's needed
to run the unit tests.
To add more unit tests, add `BOOST_AUTO_TEST_CASE` functions to the existing
.cpp files in the `test/` directory or add new .cpp files that
implement new `BOOST_AUTO_TEST_SUITE` sections.
-To run the GUI unit tests manually, launch `src/qt/test/test_bitcoin-qt`
+To run the GUI unit tests manually, launch `build/src/qt/test/test_bitcoin-qt`
To add more GUI unit tests, add them to the `src/qt/test/` directory and
the `src/qt/test/test_main.cpp` file.
### Running individual tests
-`test_bitcoin` accepts the command line arguments from the boost framework.
-For example, to run just the `getarg_tests` suite of tests:
+The `test_bitcoin` runner accepts command line arguments from the Boost
+framework. To see the list of arguments that may be passed, run:
+
+```
+test_bitcoin --help
+```
+
+For example, to run only the tests in the `getarg_tests` file, with full logging:
```bash
-test_bitcoin --log_level=all --run_test=getarg_tests
+build/src/test/test_bitcoin --log_level=all --run_test=getarg_tests
```
-`log_level` controls the verbosity of the test framework, which logs when a
-test case is entered, for example.
+or
-`test_bitcoin` also accepts some of the command line arguments accepted by
-`bitcoind`. Use `--` to separate these sets of arguments:
+```bash
+build/src/test/test_bitcoin -l all -t getarg_tests
+```
+
+or to run only the doubledash test in `getarg_tests`
```bash
-test_bitcoin --log_level=all --run_test=getarg_tests -- -printtoconsole=1
+build/src/test/test_bitcoin --run_test=getarg_tests/doubledash
```
-The `-printtoconsole=1` after the two dashes sends debug logging, which
-normally goes only to `debug.log` within the data directory, also to the
-standard terminal output.
+The `--log_level=` (or `-l`) argument controls the verbosity of the test output.
-... or to run just the doubledash test:
+The `test_bitcoin` runner also accepts some of the command line arguments accepted by
+`bitcoind`. Use `--` to separate these sets of arguments:
```bash
-test_bitcoin --run_test=getarg_tests/doubledash
+build/src/test/test_bitcoin --log_level=all --run_test=getarg_tests -- -printtoconsole=1
```
-`test_bitcoin` creates a temporary working (data) directory with a randomly
-generated pathname within `test_common_Bitcoin Core/`, which in turn is within
+The `-printtoconsole=1` after the two dashes sends debug logging, which
+normally goes only to `debug.log` within the data directory, to the
+standard terminal output as well.
+
+Running `test_bitcoin` creates a temporary working (data) directory with a randomly
+generated pathname within `test_common bitcoin/`, which in turn is within
the system's temporary directory (see
[`temp_directory_path`](https://en.cppreference.com/w/cpp/filesystem/temp_directory_path)).
This data directory looks like a simplified form of the standard `bitcoind` data
@@ -72,7 +89,7 @@ have a `debug.log` file, for example.
The location of the temporary data directory can be specified with the
`-testdatadir` option. This can make debugging easier. The directory
path used is the argument path appended with
-`/test_common_Bitcoin Core/<test-name>/datadir`.
+`/test_common bitcoin/<test-name>/datadir`.
The directory path is created if necessary.
Specifying this argument also causes the data directory
not to be removed after the last test. This is useful for looking at
@@ -81,12 +98,12 @@ what the test wrote to `debug.log` after it completes, for example.
so no leftover state is used.)
```bash
-$ test_bitcoin --run_test=getarg_tests/doubledash -- -testdatadir=/somewhere/mydatadir
-Test directory (will not be deleted): "/somewhere/mydatadir/test_common_Bitcoin Core/getarg_tests/doubledash/datadir
+$ build/src/test/test_bitcoin --run_test=getarg_tests/doubledash -- -testdatadir=/somewhere/mydatadir
+Test directory (will not be deleted): "/somewhere/mydatadir/test_common bitcoin/getarg_tests/doubledash/datadir"
Running 1 test case...
*** No errors detected
-$ ls -l '/somewhere/mydatadir/test_common_Bitcoin Core/getarg_tests/doubledash/datadir'
+$ ls -l '/somewhere/mydatadir/test_common bitcoin/getarg_tests/doubledash/datadir'
total 8
drwxrwxr-x 2 admin admin 4096 Nov 27 22:45 blocks
-rw-rw-r-- 1 admin admin 1003 Nov 27 22:45 debug.log
@@ -96,12 +113,11 @@ If you run an entire test suite, such as `--run_test=getarg_tests`, or all the t
(by not specifying `--run_test`), a separate directory
will be created for each individual test.
-Run `test_bitcoin --help` for the full list of tests.
-
### Adding test cases
-To add a new unit test file to our test suite you need
-to add the file to `src/Makefile.test.include`. The pattern is to create
+To add a new unit test file to our test suite, you need
+to add the file to either `src/test/CMakeLists.txt` or
+`src/wallet/test/CMakeLists.txt` for wallet-related tests. The pattern is to create
one test file for each class or source file for which you want to create
unit tests. The file naming convention is `<source_filename>_tests.cpp`
and such files should wrap their tests in a test suite
@@ -110,7 +126,8 @@ see `uint256_tests.cpp`.
### Logging and debugging in unit tests
-`make check` will write to a log file `foo_tests.cpp.log` and display this file
+`ctest --test-dir build` will write to the log file `build/Testing/Temporary/LastTest.log`. You can
+additionally use the `--output-on-failure` option to display logs of the failed tests automatically
on failure. For running individual tests verbosely, refer to the section
[above](#running-individual-tests).
@@ -121,13 +138,13 @@ For debugging you can launch the `test_bitcoin` executable with `gdb` or `lldb`
start debugging, just like you would with any other program:
```bash
-gdb src/test/test_bitcoin
+gdb build/src/test/test_bitcoin
```
#### Segmentation faults
If you hit a segmentation fault during a test run, you can diagnose where the fault
-is happening by running `gdb ./src/test/test_bitcoin` and then using the `bt` command
+is happening by running `gdb ./build/src/test/test_bitcoin` and then using the `bt` command
within gdb.
Another tool that can be used to resolve segmentation faults is
@@ -145,7 +162,7 @@ Running the tests and hitting a segmentation fault should now produce a file cal
You can then explore the core dump using
```bash
-gdb src/test/test_bitcoin core
+gdb build/src/test/test_bitcoin core
-(gbd) bt # produce a backtrace for where a segfault occurred
+(gdb) bt # produce a backtrace for where a segfault occurred
```
diff --git a/src/test/addrman_tests.cpp b/src/test/addrman_tests.cpp
index e5d25637bd..c4f58ebecf 100644
--- a/src/test/addrman_tests.cpp
+++ b/src/test/addrman_tests.cpp
@@ -47,11 +47,12 @@ static CService ResolveService(const std::string& ip, uint16_t port = 0)
}
-static std::vector<bool> FromBytes(const unsigned char* source, int vector_size)
+static std::vector<bool> FromBytes(std::span<const std::byte> source)
{
+ int vector_size(source.size() * 8);
std::vector<bool> result(vector_size);
for (int byte_i = 0; byte_i < vector_size / 8; ++byte_i) {
- unsigned char cur_byte = source[byte_i];
+ uint8_t cur_byte{std::to_integer<uint8_t>(source[byte_i])};
for (int bit_i = 0; bit_i < 8; ++bit_i) {
result[byte_i * 8 + bit_i] = (cur_byte >> bit_i) & 1;
}
@@ -195,21 +196,21 @@ BOOST_AUTO_TEST_CASE(addrman_select)
BOOST_AUTO_TEST_CASE(addrman_select_by_network)
{
auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node));
- BOOST_CHECK(!addrman->Select(/*new_only=*/true, NET_IPV4).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_IPV4).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/true, {NET_IPV4}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_IPV4}).first.IsValid());
// add ipv4 address to the new table
CNetAddr source = ResolveIP("252.2.2.2");
CService addr1 = ResolveService("250.1.1.1", 8333);
BOOST_CHECK(addrman->Add({CAddress(addr1, NODE_NONE)}, source));
- BOOST_CHECK(addrman->Select(/*new_only=*/true, NET_IPV4).first == addr1);
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_IPV4).first == addr1);
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_IPV6).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_ONION).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_I2P).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_CJDNS).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/true, NET_CJDNS).first.IsValid());
+ BOOST_CHECK(addrman->Select(/*new_only=*/true, {NET_IPV4}).first == addr1);
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_IPV4}).first == addr1);
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_IPV6}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_ONION}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_I2P}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_CJDNS}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/true, {NET_CJDNS}).first.IsValid());
BOOST_CHECK(addrman->Select(/*new_only=*/false).first == addr1);
// add I2P address to the new table
@@ -217,25 +218,29 @@ BOOST_AUTO_TEST_CASE(addrman_select_by_network)
i2p_addr.SetSpecial("udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p");
BOOST_CHECK(addrman->Add({i2p_addr}, source));
- BOOST_CHECK(addrman->Select(/*new_only=*/true, NET_I2P).first == i2p_addr);
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_I2P).first == i2p_addr);
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_IPV4).first == addr1);
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_IPV6).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_ONION).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_CJDNS).first.IsValid());
+ BOOST_CHECK(addrman->Select(/*new_only=*/true, {NET_I2P}).first == i2p_addr);
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_I2P}).first == i2p_addr);
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_IPV4}).first == addr1);
+ std::unordered_set<Network> nets_with_entries = {NET_IPV4, NET_I2P};
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, nets_with_entries).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_IPV6}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_ONION}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_CJDNS}).first.IsValid());
+ std::unordered_set<Network> nets_without_entries = {NET_IPV6, NET_ONION, NET_CJDNS};
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, nets_without_entries).first.IsValid());
// bump I2P address to tried table
BOOST_CHECK(addrman->Good(i2p_addr));
- BOOST_CHECK(!addrman->Select(/*new_only=*/true, NET_I2P).first.IsValid());
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_I2P).first == i2p_addr);
+ BOOST_CHECK(!addrman->Select(/*new_only=*/true, {NET_I2P}).first.IsValid());
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_I2P}).first == i2p_addr);
// add another I2P address to the new table
CAddress i2p_addr2;
i2p_addr2.SetSpecial("c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p");
BOOST_CHECK(addrman->Add({i2p_addr2}, source));
- BOOST_CHECK(addrman->Select(/*new_only=*/true, NET_I2P).first == i2p_addr2);
+ BOOST_CHECK(addrman->Select(/*new_only=*/true, {NET_I2P}).first == i2p_addr2);
// ensure that both new and tried table are selected from
bool new_selected{false};
@@ -243,7 +248,7 @@ BOOST_AUTO_TEST_CASE(addrman_select_by_network)
int counter = 256;
while (--counter > 0 && (!new_selected || !tried_selected)) {
- const CAddress selected{addrman->Select(/*new_only=*/false, NET_I2P).first};
+ const CAddress selected{addrman->Select(/*new_only=*/false, {NET_I2P}).first};
BOOST_REQUIRE(selected == i2p_addr || selected == i2p_addr2);
if (selected == i2p_addr) {
tried_selected = true;
@@ -276,7 +281,7 @@ BOOST_AUTO_TEST_CASE(addrman_select_special)
// since the only ipv4 address is on the new table, ensure that the new
// table gets selected even if new_only is false. if the table was being
// selected at random, this test will sporadically fail
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_IPV4).first == addr1);
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_IPV4}).first == addr1);
}
BOOST_AUTO_TEST_CASE(addrman_new_collisions)
@@ -576,7 +581,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket_legacy)
// 101.8.0.0/16 AS8
BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
{
- std::vector<bool> asmap = FromBytes(asmap_raw, sizeof(asmap_raw) * 8);
+ std::vector<bool> asmap = FromBytes(test::data::asmap);
NetGroupManager ngm_asmap{asmap};
CAddress addr1 = CAddress(ResolveService("250.1.1.1", 8333), NODE_NONE);
@@ -630,7 +635,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
{
- std::vector<bool> asmap = FromBytes(asmap_raw, sizeof(asmap_raw) * 8);
+ std::vector<bool> asmap = FromBytes(test::data::asmap);
NetGroupManager ngm_asmap{asmap};
CAddress addr1 = CAddress(ResolveService("250.1.2.1", 8333), NODE_NONE);
@@ -708,7 +713,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
BOOST_AUTO_TEST_CASE(addrman_serialization)
{
- std::vector<bool> asmap1 = FromBytes(asmap_raw, sizeof(asmap_raw) * 8);
+ std::vector<bool> asmap1 = FromBytes(test::data::asmap);
NetGroupManager netgroupman{asmap1};
const auto ratio = GetCheckRatio(m_node);
diff --git a/src/test/arith_uint256_tests.cpp b/src/test/arith_uint256_tests.cpp
index f178499299..37a39adb9c 100644
--- a/src/test/arith_uint256_tests.cpp
+++ b/src/test/arith_uint256_tests.cpp
@@ -23,9 +23,6 @@ static inline arith_uint256 arith_uint256V(const std::vector<unsigned char>& vch
{
return UintToArith256(uint256(vch));
}
-// Takes a number written in hex (with most significant digits first).
-static inline arith_uint256 arith_uint256S(std::string_view str) { return UintToArith256(uint256S(str)); }
-
const unsigned char R1Array[] =
"\x9c\x52\x4a\xdb\xcf\x56\x11\x12\x2b\x29\x12\x5e\x5d\x35\xd2\xd2"
"\x22\x81\xaa\xb5\x33\xf0\x08\x32\xd5\x56\xb1\xf9\xea\xe5\x1d\x7d";
@@ -39,8 +36,6 @@ const unsigned char R2Array[] =
"\x13\x30\x47\xa3\x19\x2d\xda\x71\x49\x13\x72\xf0\xb4\xca\x81\xd7";
const arith_uint256 R2L = arith_uint256V(std::vector<unsigned char>(R2Array,R2Array+32));
-const char R1LplusR2L[] = "549FB09FEA236A1EA3E31D4D58F1B1369288D204211CA751527CFC175767850C";
-
const unsigned char ZeroArray[] =
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
@@ -97,27 +92,25 @@ BOOST_AUTO_TEST_CASE( basics ) // constructors, equality, inequality
}
BOOST_CHECK(ZeroL == (OneL << 256));
- // String Constructor and Copy Constructor
- BOOST_CHECK(arith_uint256S("0x" + R1L.ToString()) == R1L);
- BOOST_CHECK(arith_uint256S("0x" + R2L.ToString()) == R2L);
- BOOST_CHECK(arith_uint256S("0x" + ZeroL.ToString()) == ZeroL);
- BOOST_CHECK(arith_uint256S("0x" + OneL.ToString()) == OneL);
- BOOST_CHECK(arith_uint256S("0x" + MaxL.ToString()) == MaxL);
- BOOST_CHECK(arith_uint256S(R1L.ToString()) == R1L);
- BOOST_CHECK(arith_uint256S(" 0x" + R1L.ToString() + " ") == R1L);
- BOOST_CHECK(arith_uint256S("") == ZeroL);
- BOOST_CHECK(arith_uint256S("1") == OneL);
- BOOST_CHECK(R1L == arith_uint256S(R1ArrayHex));
+ // Construct from hex string
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(R1L.ToString()).value()), R1L);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(R2L.ToString()).value()), R2L);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(ZeroL.ToString()).value()), ZeroL);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(OneL.ToString()).value()), OneL);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(MaxL.ToString()).value()), MaxL);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(R1ArrayHex).value()), R1L);
+
+ // Copy constructor
BOOST_CHECK(arith_uint256(R1L) == R1L);
BOOST_CHECK((arith_uint256(R1L^R2L)^R2L) == R1L);
BOOST_CHECK(arith_uint256(ZeroL) == ZeroL);
BOOST_CHECK(arith_uint256(OneL) == OneL);
// uint64_t constructor
- BOOST_CHECK((R1L & arith_uint256S("0xffffffffffffffff")) == arith_uint256(R1LLow64));
- BOOST_CHECK(ZeroL == arith_uint256(0));
- BOOST_CHECK(OneL == arith_uint256(1));
- BOOST_CHECK(arith_uint256S("0xffffffffffffffff") == arith_uint256(0xffffffffffffffffULL));
+ BOOST_CHECK_EQUAL(R1L & arith_uint256{0xffffffffffffffff}, arith_uint256{R1LLow64});
+ BOOST_CHECK_EQUAL(ZeroL, arith_uint256{0});
+ BOOST_CHECK_EQUAL(OneL, arith_uint256{1});
+ BOOST_CHECK_EQUAL(arith_uint256{0xffffffffffffffff}, arith_uint256{0xffffffffffffffffULL});
// Assignment (from base_uint)
arith_uint256 tmpL = ~ZeroL; BOOST_CHECK(tmpL == ~ZeroL);
@@ -284,15 +277,12 @@ BOOST_AUTO_TEST_CASE( comparison ) // <= >= < >
BOOST_CHECK_LT(ZeroL,
OneL);
- // Verify hex number representation has the most significant digits first.
- BOOST_CHECK_LT(arith_uint256S("0000000000000000000000000000000000000000000000000000000000000001"),
- arith_uint256S("1000000000000000000000000000000000000000000000000000000000000000"));
}
BOOST_AUTO_TEST_CASE( plusMinus )
{
arith_uint256 TmpL = 0;
- BOOST_CHECK(R1L + R2L == arith_uint256S(R1LplusR2L));
+ BOOST_CHECK_EQUAL(R1L + R2L, UintToArith256(uint256{"549fb09fea236a1ea3e31d4d58f1b1369288d204211ca751527cfc175767850c"}));
TmpL += R1L;
BOOST_CHECK(TmpL == R1L);
TmpL += R2L;
@@ -356,8 +346,8 @@ BOOST_AUTO_TEST_CASE( multiply )
BOOST_AUTO_TEST_CASE( divide )
{
- arith_uint256 D1L{arith_uint256S("AD7133AC1977FA2B7")};
- arith_uint256 D2L{arith_uint256S("ECD751716")};
+ arith_uint256 D1L{UintToArith256(uint256{"00000000000000000000000000000000000000000000000ad7133ac1977fa2b7"})};
+ arith_uint256 D2L{UintToArith256(uint256{"0000000000000000000000000000000000000000000000000000000ecd751716"})};
BOOST_CHECK((R1L / D1L).ToString() == "00000000000000000b8ac01106981635d9ed112290f8895545a7654dde28fb3a");
BOOST_CHECK((R1L / D2L).ToString() == "000000000873ce8efec5b67150bad3aa8c5fcb70e947586153bf2cec7c37c57a");
BOOST_CHECK(R1L / OneL == R1L);
@@ -571,4 +561,51 @@ BOOST_AUTO_TEST_CASE( getmaxcoverage ) // some more tests just to get 100% cover
CHECKBITWISEOPERATOR(R1,~R2,&)
}
+BOOST_AUTO_TEST_CASE(conversion)
+{
+ for (const arith_uint256& arith : {ZeroL, OneL, R1L, R2L}) {
+ const auto u256{uint256::FromHex(arith.GetHex()).value()};
+ BOOST_CHECK_EQUAL(UintToArith256(ArithToUint256(arith)), arith);
+ BOOST_CHECK_EQUAL(UintToArith256(u256), arith);
+ BOOST_CHECK_EQUAL(u256, ArithToUint256(arith));
+ BOOST_CHECK_EQUAL(ArithToUint256(arith).GetHex(), UintToArith256(u256).GetHex());
+ }
+
+ for (uint8_t num : {0, 1, 0xff}) {
+ BOOST_CHECK_EQUAL(UintToArith256(uint256{num}), arith_uint256{num});
+ BOOST_CHECK_EQUAL(uint256{num}, ArithToUint256(arith_uint256{num}));
+ BOOST_CHECK_EQUAL(UintToArith256(uint256{num}), num);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(operator_with_self)
+{
+ /* Clang 16 and earlier detects v -= v and v /= v as self-assignments
+ to 0 and 1 respectively.
+ See: https://github.com/llvm/llvm-project/issues/42469
+ and the fix in commit c5302325b2a62d77cf13dd16cd5c19141862fed0 .
+
+ This makes some sense for arithmetic classes, but could be considered a bug
+ elsewhere. Disable the warning here so that the code can be tested, but the
+ warning should remain on as there will likely always be a better way to
+ express this.
+ */
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wself-assign-overloaded"
+#endif
+ arith_uint256 v{2};
+ v *= v;
+ BOOST_CHECK_EQUAL(v, arith_uint256{4});
+ v /= v;
+ BOOST_CHECK_EQUAL(v, arith_uint256{1});
+ v += v;
+ BOOST_CHECK_EQUAL(v, arith_uint256{2});
+ v -= v;
+ BOOST_CHECK_EQUAL(v, arith_uint256{0});
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/base32_tests.cpp b/src/test/base32_tests.cpp
index 4617beecd9..be3b0c2d1f 100644
--- a/src/test/base32_tests.cpp
+++ b/src/test/base32_tests.cpp
@@ -5,6 +5,8 @@
#include <util/strencodings.h>
#include <boost/test/unit_test.hpp>
+
+#include <algorithm>
#include <string>
using namespace std::literals;
@@ -24,7 +26,7 @@ BOOST_AUTO_TEST_CASE(base32_testvectors)
BOOST_CHECK_EQUAL(strEnc, vstrOutNoPadding[i]);
auto dec = DecodeBase32(vstrOut[i]);
BOOST_REQUIRE(dec);
- BOOST_CHECK_MESSAGE(MakeByteSpan(*dec) == MakeByteSpan(vstrIn[i]), vstrOut[i]);
+ BOOST_CHECK_MESSAGE(std::ranges::equal(*dec, vstrIn[i]), vstrOut[i]);
}
// Decoding strings with embedded NUL characters should fail
diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp
index bb3defb93e..5e97c9f4d6 100644
--- a/src/test/base58_tests.cpp
+++ b/src/test/base58_tests.cpp
@@ -17,6 +17,7 @@
#include <string>
using namespace std::literals;
+using namespace util::hex_literals;
BOOST_FIXTURE_TEST_SUITE(base58_tests, BasicTestingSetup)
@@ -72,7 +73,7 @@ BOOST_AUTO_TEST_CASE(base58_DecodeBase58)
// check that DecodeBase58 skips whitespace, but still fails with unexpected non-whitespace at the end.
BOOST_CHECK(!DecodeBase58(" \t\n\v\f\r skip \r\f\v\n\t a", result, 3));
BOOST_CHECK( DecodeBase58(" \t\n\v\f\r skip \r\f\v\n\t ", result, 3));
- std::vector<unsigned char> expected = ParseHex("971a55");
+ constexpr auto expected{"971a55"_hex_u8};
BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
BOOST_CHECK(DecodeBase58Check("3vQB7B6MrGQZaxCuFg4oh"s, result, 100));
@@ -84,14 +85,14 @@ BOOST_AUTO_TEST_CASE(base58_DecodeBase58)
BOOST_AUTO_TEST_CASE(base58_random_encode_decode)
{
for (int n = 0; n < 1000; ++n) {
- unsigned int len = 1 + InsecureRandBits(8);
- unsigned int zeroes = InsecureRandBool() ? InsecureRandRange(len + 1) : 0;
- auto data = Cat(std::vector<unsigned char>(zeroes, '\000'), g_insecure_rand_ctx.randbytes(len - zeroes));
+ unsigned int len = 1 + m_rng.randbits(8);
+ unsigned int zeroes = m_rng.randbool() ? m_rng.randrange(len + 1) : 0;
+ auto data = Cat(std::vector<unsigned char>(zeroes, '\000'), m_rng.randbytes(len - zeroes));
auto encoded = EncodeBase58Check(data);
std::vector<unsigned char> decoded;
- auto ok_too_small = DecodeBase58Check(encoded, decoded, InsecureRandRange(len));
+ auto ok_too_small = DecodeBase58Check(encoded, decoded, m_rng.randrange(len));
BOOST_CHECK(!ok_too_small);
- auto ok = DecodeBase58Check(encoded, decoded, len + InsecureRandRange(257 - len));
+ auto ok = DecodeBase58Check(encoded, decoded, len + m_rng.randrange(257 - len));
BOOST_CHECK(ok);
BOOST_CHECK(data == decoded);
}
diff --git a/src/test/base64_tests.cpp b/src/test/base64_tests.cpp
index 6462aa82fb..b9d0d2b241 100644
--- a/src/test/base64_tests.cpp
+++ b/src/test/base64_tests.cpp
@@ -5,6 +5,8 @@
#include <util/strencodings.h>
#include <boost/test/unit_test.hpp>
+
+#include <algorithm>
#include <string>
using namespace std::literals;
@@ -21,7 +23,7 @@ BOOST_AUTO_TEST_CASE(base64_testvectors)
BOOST_CHECK_EQUAL(strEnc, vstrOut[i]);
auto dec = DecodeBase64(strEnc);
BOOST_REQUIRE(dec);
- BOOST_CHECK_MESSAGE(MakeByteSpan(*dec) == MakeByteSpan(vstrIn[i]), vstrOut[i]);
+ BOOST_CHECK_MESSAGE(std::ranges::equal(*dec, vstrIn[i]), vstrOut[i]);
}
{
diff --git a/src/test/bip324_tests.cpp b/src/test/bip324_tests.cpp
index 1ed7e23bcf..adabb7ef57 100644
--- a/src/test/bip324_tests.cpp
+++ b/src/test/bip324_tests.cpp
@@ -11,6 +11,7 @@
#include <test/util/setup_common.h>
#include <util/strencodings.h>
+#include <algorithm>
#include <array>
#include <cstddef>
#include <cstdint>
@@ -20,6 +21,7 @@
namespace {
+struct BIP324Test : BasicTestingSetup {
void TestBIP324PacketVector(
uint32_t in_idx,
const std::string& in_priv_ours_hex,
@@ -62,9 +64,9 @@ void TestBIP324PacketVector(
BOOST_CHECK(cipher);
// Compare session variables.
- BOOST_CHECK(Span{out_session_id} == cipher.GetSessionID());
- BOOST_CHECK(Span{mid_send_garbage} == cipher.GetSendGarbageTerminator());
- BOOST_CHECK(Span{mid_recv_garbage} == cipher.GetReceiveGarbageTerminator());
+ BOOST_CHECK(std::ranges::equal(out_session_id, cipher.GetSessionID()));
+ BOOST_CHECK(std::ranges::equal(mid_send_garbage, cipher.GetSendGarbageTerminator()));
+ BOOST_CHECK(std::ranges::equal(mid_recv_garbage, cipher.GetReceiveGarbageTerminator()));
// Vector of encrypted empty messages, encrypted in order to seek to the right position.
std::vector<std::vector<std::byte>> dummies(in_idx);
@@ -89,7 +91,7 @@ void TestBIP324PacketVector(
BOOST_CHECK(out_ciphertext == ciphertext);
} else {
BOOST_CHECK(ciphertext.size() >= out_ciphertext_endswith.size());
- BOOST_CHECK(Span{out_ciphertext_endswith} == Span{ciphertext}.last(out_ciphertext_endswith.size()));
+ BOOST_CHECK(std::ranges::equal(out_ciphertext_endswith, Span{ciphertext}.last(out_ciphertext_endswith.size())));
}
for (unsigned error = 0; error <= 12; ++error) {
@@ -109,13 +111,13 @@ void TestBIP324PacketVector(
BOOST_CHECK(dec_cipher);
// Compare session variables.
- BOOST_CHECK((Span{out_session_id} == dec_cipher.GetSessionID()) == (error != 1));
- BOOST_CHECK((Span{mid_send_garbage} == dec_cipher.GetSendGarbageTerminator()) == (error != 1));
- BOOST_CHECK((Span{mid_recv_garbage} == dec_cipher.GetReceiveGarbageTerminator()) == (error != 1));
+ BOOST_CHECK(std::ranges::equal(out_session_id, dec_cipher.GetSessionID()) == (error != 1));
+ BOOST_CHECK(std::ranges::equal(mid_send_garbage, dec_cipher.GetSendGarbageTerminator()) == (error != 1));
+ BOOST_CHECK(std::ranges::equal(mid_recv_garbage, dec_cipher.GetReceiveGarbageTerminator()) == (error != 1));
// Seek to the numbered packet.
if (in_idx == 0 && error == 12) continue;
- uint32_t dec_idx = in_idx ^ (error == 12 ? (1U << InsecureRandRange(16)) : 0);
+ uint32_t dec_idx = in_idx ^ (error == 12 ? (1U << m_rng.randrange(16)) : 0);
for (uint32_t i = 0; i < dec_idx; ++i) {
unsigned use_idx = i < in_idx ? i : 0;
bool dec_ignore{false};
@@ -127,7 +129,7 @@ void TestBIP324PacketVector(
// Decrypt length
auto to_decrypt = ciphertext;
if (error >= 2 && error <= 9) {
- to_decrypt[InsecureRandRange(to_decrypt.size())] ^= std::byte(1U << (error - 2));
+ to_decrypt[m_rng.randrange(to_decrypt.size())] ^= std::byte(1U << (error - 2));
}
// Decrypt length and resize ciphertext to accommodate.
@@ -138,7 +140,7 @@ void TestBIP324PacketVector(
auto dec_aad = in_aad;
if (error == 10) {
if (in_aad.size() == 0) continue;
- dec_aad[InsecureRandRange(dec_aad.size())] ^= std::byte(1U << InsecureRandRange(8));
+ dec_aad[m_rng.randrange(dec_aad.size())] ^= std::byte(1U << m_rng.randrange(8));
}
if (error == 11) dec_aad.push_back({});
@@ -155,10 +157,11 @@ void TestBIP324PacketVector(
}
}
}
+}; // struct BIP324Test
} // namespace
-BOOST_FIXTURE_TEST_SUITE(bip324_tests, BasicTestingSetup)
+BOOST_FIXTURE_TEST_SUITE(bip324_tests, BIP324Test)
BOOST_AUTO_TEST_CASE(packet_test_vectors) {
// BIP324 key derivation uses network magic in the HKDF process. We use mainnet params here
diff --git a/src/test/blockencodings_tests.cpp b/src/test/blockencodings_tests.cpp
index b0749c851c..3a33bdb7ec 100644
--- a/src/test/blockencodings_tests.cpp
+++ b/src/test/blockencodings_tests.cpp
@@ -356,7 +356,7 @@ BOOST_AUTO_TEST_CASE(ReceiveWithExtraTransactions) {
BOOST_AUTO_TEST_CASE(TransactionsRequestSerializationTest) {
BlockTransactionsRequest req1;
- req1.blockhash = InsecureRand256();
+ req1.blockhash = m_rng.rand256();
req1.indexes.resize(4);
req1.indexes[0] = 0;
req1.indexes[1] = 1;
@@ -380,7 +380,7 @@ BOOST_AUTO_TEST_CASE(TransactionsRequestSerializationTest) {
BOOST_AUTO_TEST_CASE(TransactionsRequestDeserializationMaxTest) {
// Check that the highest legal index is decoded correctly
BlockTransactionsRequest req0;
- req0.blockhash = InsecureRand256();
+ req0.blockhash = m_rng.rand256();
req0.indexes.resize(1);
req0.indexes[0] = 0xffff;
DataStream stream{};
@@ -398,7 +398,7 @@ BOOST_AUTO_TEST_CASE(TransactionsRequestDeserializationOverflowTest) {
// a request cannot be created by serializing a real BlockTransactionsRequest
// due to the overflow, so here we'll serialize from raw deltas.
BlockTransactionsRequest req0;
- req0.blockhash = InsecureRand256();
+ req0.blockhash = m_rng.rand256();
req0.indexes.resize(3);
req0.indexes[0] = 0x7000;
req0.indexes[1] = 0x10000 - 0x7000 - 2;
diff --git a/src/test/blockfilter_index_tests.cpp b/src/test/blockfilter_index_tests.cpp
index 067a32d6a4..f6024f1ef3 100644
--- a/src/test/blockfilter_index_tests.cpp
+++ b/src/test/blockfilter_index_tests.cpp
@@ -103,7 +103,7 @@ bool BuildChainTestingSetup::BuildChain(const CBlockIndex* pindex,
CBlockHeader header = block->GetBlockHeader();
BlockValidationState state;
- if (!Assert(m_node.chainman)->ProcessNewBlockHeaders({header}, true, state, &pindex)) {
+ if (!Assert(m_node.chainman)->ProcessNewBlockHeaders({{header}}, true, state, &pindex)) {
return false;
}
}
diff --git a/src/test/bloom_tests.cpp b/src/test/bloom_tests.cpp
index 0c6e2e752d..1c732a8267 100644
--- a/src/test/bloom_tests.cpp
+++ b/src/test/bloom_tests.cpp
@@ -22,33 +22,39 @@
#include <boost/test/unit_test.hpp>
-BOOST_FIXTURE_TEST_SUITE(bloom_tests, BasicTestingSetup)
+using namespace util::hex_literals;
+
+namespace bloom_tests {
+struct BloomTest : public BasicTestingSetup {
+ std::vector<unsigned char> RandomData();
+};
+} // namespace bloom_tests
+
+BOOST_FIXTURE_TEST_SUITE(bloom_tests, BloomTest)
BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize)
{
CBloomFilter filter(3, 0.01, 0, BLOOM_UPDATE_ALL);
- BOOST_CHECK_MESSAGE( !filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter should be empty!");
- filter.insert(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8"));
- BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
+ BOOST_CHECK_MESSAGE( !filter.contains("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter should be empty!");
+ filter.insert("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8);
+ BOOST_CHECK_MESSAGE( filter.contains("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter doesn't contain just-inserted object!");
// One bit different in first byte
- BOOST_CHECK_MESSAGE(!filter.contains(ParseHex("19108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter contains something it shouldn't!");
+ BOOST_CHECK_MESSAGE(!filter.contains("19108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter contains something it shouldn't!");
- filter.insert(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"));
- BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")), "Bloom filter doesn't contain just-inserted object (2)!");
+ filter.insert("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"_hex_u8);
+ BOOST_CHECK_MESSAGE(filter.contains("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"_hex_u8), "Bloom filter doesn't contain just-inserted object (2)!");
- filter.insert(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5"));
- BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")), "Bloom filter doesn't contain just-inserted object (3)!");
+ filter.insert("b9300670b4c5366e95b2699e8b18bc75e5f729c5"_hex_u8);
+ BOOST_CHECK_MESSAGE(filter.contains("b9300670b4c5366e95b2699e8b18bc75e5f729c5"_hex_u8), "Bloom filter doesn't contain just-inserted object (3)!");
DataStream stream{};
stream << filter;
- std::vector<uint8_t> expected = ParseHex("03614e9b050000000000000001");
- auto result{MakeUCharSpan(stream)};
-
- BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
+ constexpr auto expected{"03614e9b050000000000000001"_hex};
+ BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
- BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
+ BOOST_CHECK_MESSAGE( filter.contains("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter doesn't contain just-inserted object!");
}
BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize_with_tweak)
@@ -56,24 +62,22 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize_with_tweak)
// Same test as bloom_create_insert_serialize, but we add a nTweak of 100
CBloomFilter filter(3, 0.01, 2147483649UL, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8"));
- BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
+ filter.insert("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8);
+ BOOST_CHECK_MESSAGE( filter.contains("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter doesn't contain just-inserted object!");
// One bit different in first byte
- BOOST_CHECK_MESSAGE(!filter.contains(ParseHex("19108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter contains something it shouldn't!");
+ BOOST_CHECK_MESSAGE(!filter.contains("19108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter contains something it shouldn't!");
- filter.insert(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"));
- BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")), "Bloom filter doesn't contain just-inserted object (2)!");
+ filter.insert("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"_hex_u8);
+ BOOST_CHECK_MESSAGE(filter.contains("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"_hex_u8), "Bloom filter doesn't contain just-inserted object (2)!");
- filter.insert(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5"));
- BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")), "Bloom filter doesn't contain just-inserted object (3)!");
+ filter.insert("b9300670b4c5366e95b2699e8b18bc75e5f729c5"_hex_u8);
+ BOOST_CHECK_MESSAGE(filter.contains("b9300670b4c5366e95b2699e8b18bc75e5f729c5"_hex_u8), "Bloom filter doesn't contain just-inserted object (3)!");
DataStream stream{};
stream << filter;
- std::vector<uint8_t> expected = ParseHex("03ce4299050000000100008001");
- auto result{MakeUCharSpan(stream)};
-
- BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
+ constexpr auto expected{"03ce4299050000000100008001"_hex};
+ BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
}
BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
@@ -91,17 +95,15 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
DataStream stream{};
stream << filter;
- std::vector<unsigned char> expected = ParseHex("038fc16b080000000000000001");
- auto result{MakeUCharSpan(stream)};
-
- BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
+ constexpr auto expected{"038fc16b080000000000000001"_hex};
+ BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
}
BOOST_AUTO_TEST_CASE(bloom_match)
{
// Random real transaction (b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b)
DataStream stream{
- ParseHex("01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"),
+ "01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"_hex,
};
CTransaction tx(deserialize, TX_WITH_WITNESS, stream);
@@ -117,24 +119,24 @@ BOOST_AUTO_TEST_CASE(bloom_match)
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// byte-reversed tx hash
- filter.insert(ParseHex("6bff7fcd4f8565ef406dd5d63d4ff94f318fe82027fd4dc451b04474019f74b4"));
+ filter.insert("6bff7fcd4f8565ef406dd5d63d4ff94f318fe82027fd4dc451b04474019f74b4"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match manually serialized tx hash");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("30450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a01"));
+ filter.insert("30450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a01"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match input signature");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339"));
+ filter.insert("046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match input pub key");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("04943fdd508053c75000106d3bc6e2754dbcff19"));
+ filter.insert("04943fdd508053c75000106d3bc6e2754dbcff19"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match output address");
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(spendingTx), "Simple Bloom filter didn't add output");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("a266436d2965547608b9e15d9032a7b9d64fa431"));
+ filter.insert("a266436d2965547608b9e15d9032a7b9d64fa431"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match output address");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
@@ -156,7 +158,7 @@ BOOST_AUTO_TEST_CASE(bloom_match)
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched random tx hash");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("0000006d2965547608b9e15d9032a7b9d64fa431"));
+ filter.insert("0000006d2965547608b9e15d9032a7b9d64fa431"_hex_u8);
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched random address");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
@@ -215,7 +217,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2)
// With 4 txes
CBlock block;
DataStream stream{
- ParseHex("0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000"),
+ "0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
@@ -242,7 +244,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2)
// Match an output from the second transaction (the pubkey for address 1DZTzaBHUDM7T3QvUKBz4qXMRpkg8jsfB5)
// This should match the third transaction because it spends the output matched
// It also matches the fourth transaction, which spends to the pubkey again
- filter.insert(ParseHex("044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45af"));
+ filter.insert("044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45af"_hex_u8);
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -272,7 +274,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
// With 4 txes
CBlock block;
DataStream stream{
- ParseHex("0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000"),
+ "0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
@@ -299,7 +301,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
// Match an output from the second transaction (the pubkey for address 1DZTzaBHUDM7T3QvUKBz4qXMRpkg8jsfB5)
// This should not match the third transaction though it spends the output matched
// It will match the fourth transaction, which has another pay-to-pubkey output to the same address
- filter.insert(ParseHex("044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45af"));
+ filter.insert("044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45af"_hex_u8);
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -326,7 +328,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_3_and_serialize)
// With one tx
CBlock block;
DataStream stream{
- ParseHex("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020a02ffffffff0100f2052a01000000434104ecd3229b0571c3be876feaac0442a9f13c5a572742927af1dc623353ecf8c202225f64868137a18cdd85cbbb4c74fbccfd4f49639cf1bdc94a5672bb15ad5d4cac00000000"),
+ "0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020a02ffffffff0100f2052a01000000434104ecd3229b0571c3be876feaac0442a9f13c5a572742927af1dc623353ecf8c202225f64868137a18cdd85cbbb4c74fbccfd4f49639cf1bdc94a5672bb15ad5d4cac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
@@ -352,10 +354,8 @@ BOOST_AUTO_TEST_CASE(merkle_block_3_and_serialize)
DataStream merkleStream{};
merkleStream << merkleBlock;
- std::vector<uint8_t> expected = ParseHex("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101");
- auto result{MakeUCharSpan(merkleStream)};
-
- BOOST_CHECK_EQUAL_COLLECTIONS(expected.begin(), expected.end(), result.begin(), result.end());
+ constexpr auto expected{"0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101"_hex};
+ BOOST_CHECK_EQUAL_COLLECTIONS(merkleStream.begin(), merkleStream.end(), expected.begin(), expected.end());
}
BOOST_AUTO_TEST_CASE(merkle_block_4)
@@ -364,7 +364,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_4)
// With 7 txes
CBlock block;
DataStream stream{
- ParseHex("0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"),
+ "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
@@ -412,15 +412,15 @@ BOOST_AUTO_TEST_CASE(merkle_block_4_test_p2pubkey_only)
// With 7 txes
CBlock block;
DataStream stream{
- ParseHex("0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"),
+ "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_P2PUBKEY_ONLY);
// Match the generation pubkey
- filter.insert(ParseHex("04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91"));
+ filter.insert("04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91"_hex_u8);
// ...and the output address of the 4th transaction
- filter.insert(ParseHex("b6efd80d99179f4f4ff6f4dd0a007d018c385d21"));
+ filter.insert("b6efd80d99179f4f4ff6f4dd0a007d018c385d21"_hex_u8);
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -437,15 +437,15 @@ BOOST_AUTO_TEST_CASE(merkle_block_4_test_update_none)
// With 7 txes
CBlock block;
DataStream stream{
- ParseHex("0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"),
+ "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_NONE);
// Match the generation pubkey
- filter.insert(ParseHex("04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91"));
+ filter.insert("04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91"_hex_u8);
// ...and the output address of the 4th transaction
- filter.insert(ParseHex("b6efd80d99179f4f4ff6f4dd0a007d018c385d21"));
+ filter.insert("b6efd80d99179f4f4ff6f4dd0a007d018c385d21"_hex_u8);
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -455,9 +455,9 @@ BOOST_AUTO_TEST_CASE(merkle_block_4_test_update_none)
BOOST_CHECK(!filter.contains(COutPoint(Txid::FromHex("02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041").value(), 0)));
}
-static std::vector<unsigned char> RandomData()
+std::vector<unsigned char> BloomTest::RandomData()
{
- uint256 r = InsecureRand256();
+ uint256 r = m_rng.rand256();
return std::vector<unsigned char>(r.begin(), r.end());
}
diff --git a/src/test/checkqueue_tests.cpp b/src/test/checkqueue_tests.cpp
index 7810d91a77..a9a1e47070 100644
--- a/src/test/checkqueue_tests.cpp
+++ b/src/test/checkqueue_tests.cpp
@@ -34,7 +34,9 @@ struct NoLockLoggingTestingSetup : public TestingSetup {
#endif
};
-BOOST_FIXTURE_TEST_SUITE(checkqueue_tests, NoLockLoggingTestingSetup)
+struct CheckQueueTest : NoLockLoggingTestingSetup {
+ void Correct_Queue_range(std::vector<size_t> range);
+};
static const unsigned int QUEUE_BATCH_SIZE = 128;
static const int SCRIPT_CHECK_THREADS = 3;
@@ -156,7 +158,7 @@ typedef CCheckQueue<FrozenCleanupCheck> FrozenCleanup_Queue;
/** This test case checks that the CCheckQueue works properly
* with each specified size_t Checks pushed.
*/
-static void Correct_Queue_range(std::vector<size_t> range)
+void CheckQueueTest::Correct_Queue_range(std::vector<size_t> range)
{
auto small_queue = std::make_unique<Correct_Queue>(QUEUE_BATCH_SIZE, SCRIPT_CHECK_THREADS);
// Make vChecks here to save on malloc (this test can be slow...)
@@ -168,7 +170,7 @@ static void Correct_Queue_range(std::vector<size_t> range)
CCheckQueueControl<FakeCheckCheckCompletion> control(small_queue.get());
while (total) {
vChecks.clear();
- vChecks.resize(std::min<size_t>(total, InsecureRandRange(10)));
+ vChecks.resize(std::min<size_t>(total, m_rng.randrange(10)));
total -= vChecks.size();
control.Add(std::move(vChecks));
}
@@ -177,6 +179,8 @@ static void Correct_Queue_range(std::vector<size_t> range)
}
}
+BOOST_FIXTURE_TEST_SUITE(checkqueue_tests, CheckQueueTest)
+
/** Test that 0 checks is correct
*/
BOOST_AUTO_TEST_CASE(test_CheckQueue_Correct_Zero)
@@ -207,7 +211,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Correct_Random)
{
std::vector<size_t> range;
range.reserve(100000/1000);
- for (size_t i = 2; i < 100000; i += std::max((size_t)1, (size_t)InsecureRandRange(std::min((size_t)1000, ((size_t)100000) - i))))
+ for (size_t i = 2; i < 100000; i += std::max((size_t)1, (size_t)m_rng.randrange(std::min((size_t)1000, ((size_t)100000) - i))))
range.push_back(i);
Correct_Queue_range(range);
}
@@ -221,7 +225,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Catches_Failure)
CCheckQueueControl<FailingCheck> control(fail_queue.get());
size_t remaining = i;
while (remaining) {
- size_t r = InsecureRandRange(10);
+ size_t r = m_rng.randrange(10);
std::vector<FailingCheck> vChecks;
vChecks.reserve(r);
@@ -268,7 +272,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_UniqueCheck)
{
CCheckQueueControl<UniqueCheck> control(queue.get());
while (total) {
- size_t r = InsecureRandRange(10);
+ size_t r = m_rng.randrange(10);
std::vector<UniqueCheck> vChecks;
for (size_t k = 0; k < r && total; k++)
vChecks.emplace_back(--total);
@@ -300,7 +304,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Memory)
{
CCheckQueueControl<MemoryCheck> control(queue.get());
while (total) {
- size_t r = InsecureRandRange(10);
+ size_t r = m_rng.randrange(10);
std::vector<MemoryCheck> vChecks;
for (size_t k = 0; k < r && total; k++) {
total--;
diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp
index fb929a2b0e..0d18cd0c2b 100644
--- a/src/test/coins_tests.cpp
+++ b/src/test/coins_tests.cpp
@@ -19,6 +19,8 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
+
int ApplyTxInUndo(Coin&& undo, CCoinsViewCache& view, const COutPoint& out);
void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, CTxUndo &txundo, int nHeight);
@@ -35,10 +37,13 @@ bool operator==(const Coin &a, const Coin &b) {
class CCoinsViewTest : public CCoinsView
{
+ FastRandomContext& m_rng;
uint256 hashBestBlock_;
std::map<COutPoint, Coin> map_;
public:
+ CCoinsViewTest(FastRandomContext& rng) : m_rng{rng} {}
+
[[nodiscard]] bool GetCoin(const COutPoint& outpoint, Coin& coin) const override
{
std::map<COutPoint, Coin>::const_iterator it = map_.find(outpoint);
@@ -46,7 +51,7 @@ public:
return false;
}
coin = it->second;
- if (coin.IsSpent() && InsecureRandBool() == 0) {
+ if (coin.IsSpent() && m_rng.randbool() == 0) {
// Randomly return false in case of an empty entry.
return false;
}
@@ -61,7 +66,7 @@ public:
if (it->second.IsDirty()) {
// Same optimization used in CCoinsViewDB is to only write dirty entries.
map_[it->first] = it->second.coin;
- if (it->second.coin.IsSpent() && InsecureRandRange(3) == 0) {
+ if (it->second.coin.IsSpent() && m_rng.randrange(3) == 0) {
// Randomly delete empty entries on write.
map_.erase(it->first);
}
@@ -105,6 +110,7 @@ BOOST_FIXTURE_TEST_SUITE(coins_tests, BasicTestingSetup)
static const unsigned int NUM_SIMULATION_ITERATIONS = 40000;
+struct CacheTest : BasicTestingSetup {
// This is a large randomized insert/remove simulation test on a variable-size
// stack of caches on top of CCoinsViewTest.
//
@@ -144,26 +150,26 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
std::vector<Txid> txids;
txids.resize(NUM_SIMULATION_ITERATIONS / 8);
for (unsigned int i = 0; i < txids.size(); i++) {
- txids[i] = Txid::FromUint256(InsecureRand256());
+ txids[i] = Txid::FromUint256(m_rng.rand256());
}
for (unsigned int i = 0; i < NUM_SIMULATION_ITERATIONS; i++) {
// Do a random modification.
{
- auto txid = txids[InsecureRandRange(txids.size())]; // txid we're going to modify in this iteration.
+ auto txid = txids[m_rng.randrange(txids.size())]; // txid we're going to modify in this iteration.
Coin& coin = result[COutPoint(txid, 0)];
// Determine whether to test HaveCoin before or after Access* (or both). As these functions
// can influence each other's behaviour by pulling things into the cache, all combinations
// are tested.
- bool test_havecoin_before = InsecureRandBits(2) == 0;
- bool test_havecoin_after = InsecureRandBits(2) == 0;
+ bool test_havecoin_before = m_rng.randbits(2) == 0;
+ bool test_havecoin_after = m_rng.randbits(2) == 0;
bool result_havecoin = test_havecoin_before ? stack.back()->HaveCoin(COutPoint(txid, 0)) : false;
// Infrequently, test usage of AccessByTxid instead of AccessCoin - the
// former just delegates to the latter and returns the first unspent in a txn.
- const Coin& entry = (InsecureRandRange(500) == 0) ?
+ const Coin& entry = (m_rng.randrange(500) == 0) ?
AccessByTxid(*stack.back(), txid) : stack.back()->AccessCoin(COutPoint(txid, 0));
BOOST_CHECK(coin == entry);
@@ -176,23 +182,23 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
BOOST_CHECK(ret == !entry.IsSpent());
}
- if (InsecureRandRange(5) == 0 || coin.IsSpent()) {
+ if (m_rng.randrange(5) == 0 || coin.IsSpent()) {
Coin newcoin;
- newcoin.out.nValue = InsecureRandMoneyAmount();
+ newcoin.out.nValue = RandMoney(m_rng);
newcoin.nHeight = 1;
// Infrequently test adding unspendable coins.
- if (InsecureRandRange(16) == 0 && coin.IsSpent()) {
- newcoin.out.scriptPubKey.assign(1 + InsecureRandBits(6), OP_RETURN);
+ if (m_rng.randrange(16) == 0 && coin.IsSpent()) {
+ newcoin.out.scriptPubKey.assign(1 + m_rng.randbits(6), OP_RETURN);
BOOST_CHECK(newcoin.out.scriptPubKey.IsUnspendable());
added_an_unspendable_entry = true;
} else {
// Random sizes so we can test memory usage accounting
- newcoin.out.scriptPubKey.assign(InsecureRandBits(6), 0);
+ newcoin.out.scriptPubKey.assign(m_rng.randbits(6), 0);
(coin.IsSpent() ? added_an_entry : updated_an_entry) = true;
coin = newcoin;
}
- bool is_overwrite = !coin.IsSpent() || InsecureRand32() & 1;
+ bool is_overwrite = !coin.IsSpent() || m_rng.rand32() & 1;
stack.back()->AddCoin(COutPoint(txid, 0), std::move(newcoin), is_overwrite);
} else {
// Spend the coin.
@@ -203,15 +209,15 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
}
// Once every 10 iterations, remove a random entry from the cache
- if (InsecureRandRange(10) == 0) {
- COutPoint out(txids[InsecureRand32() % txids.size()], 0);
- int cacheid = InsecureRand32() % stack.size();
+ if (m_rng.randrange(10) == 0) {
+ COutPoint out(txids[m_rng.rand32() % txids.size()], 0);
+ int cacheid = m_rng.rand32() % stack.size();
stack[cacheid]->Uncache(out);
uncached_an_entry |= !stack[cacheid]->HaveCoinInCache(out);
}
// Once every 1000 iterations and at the end, verify the full cache.
- if (InsecureRandRange(1000) == 1 || i == NUM_SIMULATION_ITERATIONS - 1) {
+ if (m_rng.randrange(1000) == 1 || i == NUM_SIMULATION_ITERATIONS - 1) {
for (const auto& entry : result) {
bool have = stack.back()->HaveCoin(entry.first);
const Coin& coin = stack.back()->AccessCoin(entry.first);
@@ -229,27 +235,27 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
}
}
- if (InsecureRandRange(100) == 0) {
+ if (m_rng.randrange(100) == 0) {
// Every 100 iterations, flush an intermediate cache
- if (stack.size() > 1 && InsecureRandBool() == 0) {
- unsigned int flushIndex = InsecureRandRange(stack.size() - 1);
- if (fake_best_block) stack[flushIndex]->SetBestBlock(InsecureRand256());
- bool should_erase = InsecureRandRange(4) < 3;
+ if (stack.size() > 1 && m_rng.randbool() == 0) {
+ unsigned int flushIndex = m_rng.randrange(stack.size() - 1);
+ if (fake_best_block) stack[flushIndex]->SetBestBlock(m_rng.rand256());
+ bool should_erase = m_rng.randrange(4) < 3;
BOOST_CHECK(should_erase ? stack[flushIndex]->Flush() : stack[flushIndex]->Sync());
flushed_without_erase |= !should_erase;
}
}
- if (InsecureRandRange(100) == 0) {
+ if (m_rng.randrange(100) == 0) {
// Every 100 iterations, change the cache stack.
- if (stack.size() > 0 && InsecureRandBool() == 0) {
+ if (stack.size() > 0 && m_rng.randbool() == 0) {
//Remove the top cache
- if (fake_best_block) stack.back()->SetBestBlock(InsecureRand256());
- bool should_erase = InsecureRandRange(4) < 3;
+ if (fake_best_block) stack.back()->SetBestBlock(m_rng.rand256());
+ bool should_erase = m_rng.randrange(4) < 3;
BOOST_CHECK(should_erase ? stack.back()->Flush() : stack.back()->Sync());
flushed_without_erase |= !should_erase;
stack.pop_back();
}
- if (stack.size() == 0 || (stack.size() < 4 && InsecureRandBool())) {
+ if (stack.size() == 0 || (stack.size() < 4 && m_rng.randbool())) {
//Add a new cache
CCoinsView* tip = base;
if (stack.size() > 0) {
@@ -277,24 +283,26 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
BOOST_CHECK(uncached_an_entry);
BOOST_CHECK(flushed_without_erase);
}
+}; // struct CacheTest
// Run the above simulation for multiple base types.
-BOOST_AUTO_TEST_CASE(coins_cache_simulation_test)
+BOOST_FIXTURE_TEST_CASE(coins_cache_simulation_test, CacheTest)
{
- CCoinsViewTest base;
+ CCoinsViewTest base{m_rng};
SimulationTest(&base, false);
CCoinsViewDB db_base{{.path = "test", .cache_bytes = 1 << 23, .memory_only = true}, {}};
SimulationTest(&db_base, true);
}
+struct UpdateTest : BasicTestingSetup {
// Store of all necessary tx and undo data for next test
typedef std::map<COutPoint, std::tuple<CTransaction,CTxUndo,Coin>> UtxoData;
UtxoData utxoData;
UtxoData::iterator FindRandomFrom(const std::set<COutPoint> &utxoSet) {
assert(utxoSet.size());
- auto utxoSetIt = utxoSet.lower_bound(COutPoint(Txid::FromUint256(InsecureRand256()), 0));
+ auto utxoSetIt = utxoSet.lower_bound(COutPoint(Txid::FromUint256(m_rng.rand256()), 0));
if (utxoSetIt == utxoSet.end()) {
utxoSetIt = utxoSet.begin();
}
@@ -302,6 +310,7 @@ UtxoData::iterator FindRandomFrom(const std::set<COutPoint> &utxoSet) {
assert(utxoDataIt != utxoData.end());
return utxoDataIt;
}
+}; // struct UpdateTest
// This test is similar to the previous test
@@ -309,7 +318,7 @@ UtxoData::iterator FindRandomFrom(const std::set<COutPoint> &utxoSet) {
// random txs are created and UpdateCoins is used to update the cache stack
// In particular it is tested that spending a duplicate coinbase tx
// has the expected effect (the other duplicate is overwritten at all cache levels)
-BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
+BOOST_FIXTURE_TEST_CASE(updatecoins_simulation_test, UpdateTest)
{
SeedRandomForTest(SeedRand::ZEROS);
@@ -318,7 +327,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
std::map<COutPoint, Coin> result;
// The cache stack.
- CCoinsViewTest base; // A CCoinsViewTest at the bottom.
+ CCoinsViewTest base{m_rng}; // A CCoinsViewTest at the bottom.
std::vector<std::unique_ptr<CCoinsViewCacheTest>> stack; // A stack of CCoinsViewCaches on top.
stack.push_back(std::make_unique<CCoinsViewCacheTest>(&base)); // Start with one cache.
@@ -329,7 +338,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
std::set<COutPoint> utxoset;
for (unsigned int i = 0; i < NUM_SIMULATION_ITERATIONS; i++) {
- uint32_t randiter = InsecureRand32();
+ uint32_t randiter = m_rng.rand32();
// 19/20 txs add a new transaction
if (randiter % 20 < 19) {
@@ -337,14 +346,14 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
tx.vin.resize(1);
tx.vout.resize(1);
tx.vout[0].nValue = i; //Keep txs unique unless intended to duplicate
- tx.vout[0].scriptPubKey.assign(InsecureRand32() & 0x3F, 0); // Random sizes so we can test memory usage accounting
- const int height{int(InsecureRand32() >> 1)};
+ tx.vout[0].scriptPubKey.assign(m_rng.rand32() & 0x3F, 0); // Random sizes so we can test memory usage accounting
+ const int height{int(m_rng.rand32() >> 1)};
Coin old_coin;
// 2/20 times create a new coinbase
if (randiter % 20 < 2 || coinbase_coins.size() < 10) {
// 1/10 of those times create a duplicate coinbase
- if (InsecureRandRange(10) == 0 && coinbase_coins.size()) {
+ if (m_rng.randrange(10) == 0 && coinbase_coins.size()) {
auto utxod = FindRandomFrom(coinbase_coins);
// Reuse the exact same coinbase
tx = CMutableTransaction{std::get<0>(utxod->second)};
@@ -454,7 +463,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
}
// Once every 1000 iterations and at the end, verify the full cache.
- if (InsecureRandRange(1000) == 1 || i == NUM_SIMULATION_ITERATIONS - 1) {
+ if (m_rng.randrange(1000) == 1 || i == NUM_SIMULATION_ITERATIONS - 1) {
for (const auto& entry : result) {
bool have = stack.back()->HaveCoin(entry.first);
const Coin& coin = stack.back()->AccessCoin(entry.first);
@@ -464,30 +473,30 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
}
// One every 10 iterations, remove a random entry from the cache
- if (utxoset.size() > 1 && InsecureRandRange(30) == 0) {
- stack[InsecureRand32() % stack.size()]->Uncache(FindRandomFrom(utxoset)->first);
+ if (utxoset.size() > 1 && m_rng.randrange(30) == 0) {
+ stack[m_rng.rand32() % stack.size()]->Uncache(FindRandomFrom(utxoset)->first);
}
- if (disconnected_coins.size() > 1 && InsecureRandRange(30) == 0) {
- stack[InsecureRand32() % stack.size()]->Uncache(FindRandomFrom(disconnected_coins)->first);
+ if (disconnected_coins.size() > 1 && m_rng.randrange(30) == 0) {
+ stack[m_rng.rand32() % stack.size()]->Uncache(FindRandomFrom(disconnected_coins)->first);
}
- if (duplicate_coins.size() > 1 && InsecureRandRange(30) == 0) {
- stack[InsecureRand32() % stack.size()]->Uncache(FindRandomFrom(duplicate_coins)->first);
+ if (duplicate_coins.size() > 1 && m_rng.randrange(30) == 0) {
+ stack[m_rng.rand32() % stack.size()]->Uncache(FindRandomFrom(duplicate_coins)->first);
}
- if (InsecureRandRange(100) == 0) {
+ if (m_rng.randrange(100) == 0) {
// Every 100 iterations, flush an intermediate cache
- if (stack.size() > 1 && InsecureRandBool() == 0) {
- unsigned int flushIndex = InsecureRandRange(stack.size() - 1);
+ if (stack.size() > 1 && m_rng.randbool() == 0) {
+ unsigned int flushIndex = m_rng.randrange(stack.size() - 1);
BOOST_CHECK(stack[flushIndex]->Flush());
}
}
- if (InsecureRandRange(100) == 0) {
+ if (m_rng.randrange(100) == 0) {
// Every 100 iterations, change the cache stack.
- if (stack.size() > 0 && InsecureRandBool() == 0) {
+ if (stack.size() > 0 && m_rng.randbool() == 0) {
BOOST_CHECK(stack.back()->Flush());
stack.pop_back();
}
- if (stack.size() == 0 || (stack.size() < 4 && InsecureRandBool())) {
+ if (stack.size() == 0 || (stack.size() < 4 && m_rng.randbool())) {
CCoinsView* tip = &base;
if (stack.size() > 0) {
tip = stack.back().get();
@@ -504,25 +513,25 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
BOOST_AUTO_TEST_CASE(ccoins_serialization)
{
// Good example
- DataStream ss1{ParseHex("97f23c835800816115944e077fe7c803cfa57f29b36bf87c1d35")};
+ DataStream ss1{"97f23c835800816115944e077fe7c803cfa57f29b36bf87c1d35"_hex};
Coin cc1;
ss1 >> cc1;
BOOST_CHECK_EQUAL(cc1.fCoinBase, false);
BOOST_CHECK_EQUAL(cc1.nHeight, 203998U);
BOOST_CHECK_EQUAL(cc1.out.nValue, CAmount{60000000000});
- BOOST_CHECK_EQUAL(HexStr(cc1.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160(ParseHex("816115944e077fe7c803cfa57f29b36bf87c1d35"))))));
+ BOOST_CHECK_EQUAL(HexStr(cc1.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160("816115944e077fe7c803cfa57f29b36bf87c1d35"_hex_u8)))));
// Good example
- DataStream ss2{ParseHex("8ddf77bbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa4")};
+ DataStream ss2{"8ddf77bbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa4"_hex};
Coin cc2;
ss2 >> cc2;
BOOST_CHECK_EQUAL(cc2.fCoinBase, true);
BOOST_CHECK_EQUAL(cc2.nHeight, 120891U);
BOOST_CHECK_EQUAL(cc2.out.nValue, 110397);
- BOOST_CHECK_EQUAL(HexStr(cc2.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160(ParseHex("8c988f1a4a4de2161e0f50aac7f17e7f9555caa4"))))));
+ BOOST_CHECK_EQUAL(HexStr(cc2.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160("8c988f1a4a4de2161e0f50aac7f17e7f9555caa4"_hex_u8)))));
// Smallest possible example
- DataStream ss3{ParseHex("000006")};
+ DataStream ss3{"000006"_hex};
Coin cc3;
ss3 >> cc3;
BOOST_CHECK_EQUAL(cc3.fCoinBase, false);
@@ -531,7 +540,7 @@ BOOST_AUTO_TEST_CASE(ccoins_serialization)
BOOST_CHECK_EQUAL(cc3.out.scriptPubKey.size(), 0U);
// scriptPubKey that ends beyond the end of the stream
- DataStream ss4{ParseHex("000007")};
+ DataStream ss4{"000007"_hex};
try {
Coin cc4;
ss4 >> cc4;
@@ -544,7 +553,7 @@ BOOST_AUTO_TEST_CASE(ccoins_serialization)
uint64_t x = 3000000000ULL;
tmp << VARINT(x);
BOOST_CHECK_EQUAL(HexStr(tmp), "8a95c0bb00");
- DataStream ss5{ParseHex("00008a95c0bb00")};
+ DataStream ss5{"00008a95c0bb00"_hex};
try {
Coin cc5;
ss5 >> cc5;
@@ -888,11 +897,12 @@ BOOST_AUTO_TEST_CASE(ccoins_write)
}
+struct FlushTest : BasicTestingSetup {
Coin MakeCoin()
{
Coin coin;
- coin.out.nValue = InsecureRand32();
- coin.nHeight = InsecureRandRange(4096);
+ coin.out.nValue = m_rng.rand32();
+ coin.nHeight = m_rng.randrange(4096);
coin.fCoinBase = 0;
return coin;
}
@@ -919,19 +929,19 @@ void TestFlushBehavior(
size_t cache_usage;
size_t cache_size;
- auto flush_all = [&all_caches](bool erase) {
+ auto flush_all = [this, &all_caches](bool erase) {
// Flush in reverse order to ensure that flushes happen from children up.
for (auto i = all_caches.rbegin(); i != all_caches.rend(); ++i) {
auto& cache = *i;
cache->SanityCheck();
// hashBlock must be filled before flushing to disk; value is
// unimportant here. This is normally done during connect/disconnect block.
- cache->SetBestBlock(InsecureRand256());
+ cache->SetBestBlock(m_rng.rand256());
erase ? cache->Flush() : cache->Sync();
}
};
- Txid txid = Txid::FromUint256(InsecureRand256());
+ Txid txid = Txid::FromUint256(m_rng.rand256());
COutPoint outp = COutPoint(txid, 0);
Coin coin = MakeCoin();
// Ensure the coins views haven't seen this coin before.
@@ -1022,7 +1032,7 @@ void TestFlushBehavior(
// --- Bonus check: ensure that a coin added to the base view via one cache
// can be spent by another cache which has never seen it.
//
- txid = Txid::FromUint256(InsecureRand256());
+ txid = Txid::FromUint256(m_rng.rand256());
outp = COutPoint(txid, 0);
coin = MakeCoin();
BOOST_CHECK(!base.HaveCoin(outp));
@@ -1045,7 +1055,7 @@ void TestFlushBehavior(
// --- Bonus check 2: ensure that a FRESH, spent coin is deleted by Sync()
//
- txid = Txid::FromUint256(InsecureRand256());
+ txid = Txid::FromUint256(m_rng.rand256());
outp = COutPoint(txid, 0);
coin = MakeCoin();
CAmount coin_val = coin.out.nValue;
@@ -1074,8 +1084,9 @@ void TestFlushBehavior(
BOOST_CHECK(!all_caches[0]->HaveCoinInCache(outp));
BOOST_CHECK(!base.HaveCoin(outp));
}
+}; // struct FlushTest
-BOOST_AUTO_TEST_CASE(ccoins_flush_behavior)
+BOOST_FIXTURE_TEST_CASE(ccoins_flush_behavior, FlushTest)
{
// Create two in-memory caches atop a leveldb view.
CCoinsViewDB base{{.path = "test", .cache_bytes = 1 << 23, .memory_only = true}, {}};
diff --git a/src/test/compress_tests.cpp b/src/test/compress_tests.cpp
index 13c2740553..7e17e6ef93 100644
--- a/src/test/compress_tests.cpp
+++ b/src/test/compress_tests.cpp
@@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(compress_p2pk_scripts_not_on_curve)
{
XOnlyPubKey x_not_on_curve;
do {
- x_not_on_curve = XOnlyPubKey(g_insecure_rand_ctx.randbytes(32));
+ x_not_on_curve = XOnlyPubKey(m_rng.randbytes(32));
} while (x_not_on_curve.IsFullyValid());
// Check that P2PK script with uncompressed pubkey [=> OP_PUSH65 <0x04 .....> OP_CHECKSIG]
diff --git a/src/test/crypto_tests.cpp b/src/test/crypto_tests.cpp
index f84e04e819..e2ea7ed5fd 100644
--- a/src/test/crypto_tests.cpp
+++ b/src/test/crypto_tests.cpp
@@ -21,14 +21,18 @@
#include <test/util/setup_common.h>
#include <util/strencodings.h>
+#include <algorithm>
#include <vector>
#include <boost/test/unit_test.hpp>
-BOOST_FIXTURE_TEST_SUITE(crypto_tests, BasicTestingSetup)
+using namespace util::hex_literals;
+
+namespace crypto_tests {
+struct CryptoTest : BasicTestingSetup {
template<typename Hasher, typename In, typename Out>
-static void TestVector(const Hasher &h, const In &in, const Out &out) {
+void TestVector(const Hasher &h, const In &in, const Out &out) {
Out hash;
BOOST_CHECK(out.size() == h.OUTPUT_SIZE);
hash.resize(out.size());
@@ -42,7 +46,7 @@ static void TestVector(const Hasher &h, const In &in, const Out &out) {
Hasher hasher(h);
size_t pos = 0;
while (pos < in.size()) {
- size_t len = InsecureRandRange((in.size() - pos + 1) / 2 + 1);
+ size_t len = m_rng.randrange((in.size() - pos + 1) / 2 + 1);
hasher.Write((const uint8_t*)in.data() + pos, len);
pos += len;
if (pos > 0 && pos + 2 * out.size() > in.size() && pos < in.size()) {
@@ -56,22 +60,22 @@ static void TestVector(const Hasher &h, const In &in, const Out &out) {
}
}
-static void TestSHA1(const std::string &in, const std::string &hexout) { TestVector(CSHA1(), in, ParseHex(hexout));}
-static void TestSHA256(const std::string &in, const std::string &hexout) { TestVector(CSHA256(), in, ParseHex(hexout));}
-static void TestSHA512(const std::string &in, const std::string &hexout) { TestVector(CSHA512(), in, ParseHex(hexout));}
-static void TestRIPEMD160(const std::string &in, const std::string &hexout) { TestVector(CRIPEMD160(), in, ParseHex(hexout));}
+void TestSHA1(const std::string &in, const std::string &hexout) { TestVector(CSHA1(), in, ParseHex(hexout));}
+void TestSHA256(const std::string &in, const std::string &hexout) { TestVector(CSHA256(), in, ParseHex(hexout));}
+void TestSHA512(const std::string &in, const std::string &hexout) { TestVector(CSHA512(), in, ParseHex(hexout));}
+void TestRIPEMD160(const std::string &in, const std::string &hexout) { TestVector(CRIPEMD160(), in, ParseHex(hexout));}
-static void TestHMACSHA256(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
+void TestHMACSHA256(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
std::vector<unsigned char> key = ParseHex(hexkey);
TestVector(CHMAC_SHA256(key.data(), key.size()), ParseHex(hexin), ParseHex(hexout));
}
-static void TestHMACSHA512(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
+void TestHMACSHA512(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
std::vector<unsigned char> key = ParseHex(hexkey);
TestVector(CHMAC_SHA512(key.data(), key.size()), ParseHex(hexin), ParseHex(hexout));
}
-static void TestAES256(const std::string &hexkey, const std::string &hexin, const std::string &hexout)
+void TestAES256(const std::string &hexkey, const std::string &hexin, const std::string &hexout)
{
std::vector<unsigned char> key = ParseHex(hexkey);
std::vector<unsigned char> in = ParseHex(hexin);
@@ -90,7 +94,7 @@ static void TestAES256(const std::string &hexkey, const std::string &hexin, cons
BOOST_CHECK(buf == in);
}
-static void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, bool pad, const std::string &hexin, const std::string &hexout)
+void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, bool pad, const std::string &hexin, const std::string &hexout)
{
std::vector<unsigned char> key = ParseHex(hexkey);
std::vector<unsigned char> iv = ParseHex(hexiv);
@@ -131,7 +135,7 @@ static void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, b
}
}
-static void TestChaCha20(const std::string &hex_message, const std::string &hexkey, ChaCha20::Nonce96 nonce, uint32_t seek, const std::string& hexout)
+void TestChaCha20(const std::string &hex_message, const std::string &hexkey, ChaCha20::Nonce96 nonce, uint32_t seek, const std::string& hexout)
{
auto key = ParseHex<std::byte>(hexkey);
assert(key.size() == 32);
@@ -163,8 +167,8 @@ static void TestChaCha20(const std::string &hex_message, const std::string &hexk
// Repeat 10x, but fragmented into 3 chunks, to exercise the ChaCha20 class's caching.
for (int i = 0; i < 10; ++i) {
size_t lens[3];
- lens[0] = InsecureRandRange(hexout.size() / 2U + 1U);
- lens[1] = InsecureRandRange(hexout.size() / 2U + 1U - lens[0]);
+ lens[0] = m_rng.randrange(hexout.size() / 2U + 1U);
+ lens[1] = m_rng.randrange(hexout.size() / 2U + 1U - lens[0]);
lens[2] = hexout.size() / 2U - lens[0] - lens[1];
rng.Seek(nonce, seek);
@@ -182,7 +186,7 @@ static void TestChaCha20(const std::string &hex_message, const std::string &hexk
}
}
-static void TestFSChaCha20(const std::string& hex_plaintext, const std::string& hexkey, uint32_t rekey_interval, const std::string& ciphertext_after_rotation)
+void TestFSChaCha20(const std::string& hex_plaintext, const std::string& hexkey, uint32_t rekey_interval, const std::string& ciphertext_after_rotation)
{
auto key = ParseHex<std::byte>(hexkey);
BOOST_CHECK_EQUAL(FSChaCha20::KEYLEN, key.size());
@@ -222,7 +226,7 @@ static void TestFSChaCha20(const std::string& hex_plaintext, const std::string&
BOOST_CHECK_EQUAL(HexStr(fsc20_output), ciphertext_after_rotation);
}
-static void TestPoly1305(const std::string &hexmessage, const std::string &hexkey, const std::string& hextag)
+void TestPoly1305(const std::string &hexmessage, const std::string &hexkey, const std::string& hextag)
{
auto key = ParseHex<std::byte>(hexkey);
auto m = ParseHex<std::byte>(hexmessage);
@@ -236,7 +240,7 @@ static void TestPoly1305(const std::string &hexmessage, const std::string &hexke
auto data = Span{m};
Poly1305 poly1305{key};
for (int chunk = 0; chunk < splits; ++chunk) {
- size_t now = InsecureRandRange(data.size() + 1);
+ size_t now = m_rng.randrange(data.size() + 1);
poly1305.Update(data.first(now));
data = data.subspan(now);
}
@@ -247,7 +251,7 @@ static void TestPoly1305(const std::string &hexmessage, const std::string &hexke
}
}
-static void TestChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, ChaCha20::Nonce96 nonce, const std::string& cipher_hex)
+void TestChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, ChaCha20::Nonce96 nonce, const std::string& cipher_hex)
{
auto plain = ParseHex<std::byte>(plain_hex);
auto aad = ParseHex<std::byte>(aad_hex);
@@ -256,7 +260,7 @@ static void TestChaCha20Poly1305(const std::string& plain_hex, const std::string
for (int i = 0; i < 10; ++i) {
// During i=0, use single-plain Encrypt/Decrypt; others use a split at prefix.
- size_t prefix = i ? InsecureRandRange(plain.size() + 1) : plain.size();
+ size_t prefix = i ? m_rng.randrange(plain.size() + 1) : plain.size();
// Encrypt.
std::vector<std::byte> cipher(plain.size() + AEADChaCha20Poly1305::EXPANSION);
AEADChaCha20Poly1305 aead{key};
@@ -288,7 +292,7 @@ static void TestChaCha20Poly1305(const std::string& plain_hex, const std::string
}
}
-static void TestFSChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, uint64_t msg_idx, const std::string& cipher_hex)
+void TestFSChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, uint64_t msg_idx, const std::string& cipher_hex)
{
auto plain = ParseHex<std::byte>(plain_hex);
auto aad = ParseHex<std::byte>(aad_hex);
@@ -298,7 +302,7 @@ static void TestFSChaCha20Poly1305(const std::string& plain_hex, const std::stri
for (int it = 0; it < 10; ++it) {
// During it==0 we use the single-plain Encrypt/Decrypt; others use a split at prefix.
- size_t prefix = it ? InsecureRandRange(plain.size() + 1) : plain.size();
+ size_t prefix = it ? m_rng.randrange(plain.size() + 1) : plain.size();
std::byte dummy_tag[FSChaCha20Poly1305::EXPANSION] = {{}};
// Do msg_idx dummy encryptions to seek to the correct packet.
@@ -334,7 +338,7 @@ static void TestFSChaCha20Poly1305(const std::string& plain_hex, const std::stri
}
}
-static void TestHKDF_SHA256_32(const std::string &ikm_hex, const std::string &salt_hex, const std::string &info_hex, const std::string &okm_check_hex) {
+void TestHKDF_SHA256_32(const std::string &ikm_hex, const std::string &salt_hex, const std::string &info_hex, const std::string &okm_check_hex) {
std::vector<unsigned char> initial_key_material = ParseHex(ikm_hex);
std::vector<unsigned char> salt = ParseHex(salt_hex);
std::vector<unsigned char> info = ParseHex(info_hex);
@@ -350,6 +354,10 @@ static void TestHKDF_SHA256_32(const std::string &ikm_hex, const std::string &sa
BOOST_CHECK(HexStr(out) == okm_check_hex);
}
+void TestSHA3_256(const std::string& input, const std::string& output);
+}; // struct CryptoTests
+} // namespace crypto_tests
+
static std::string LongTestString()
{
std::string ret;
@@ -365,6 +373,8 @@ static std::string LongTestString()
const std::string test1 = LongTestString();
+BOOST_FIXTURE_TEST_SUITE(crypto_tests, CryptoTest)
+
BOOST_AUTO_TEST_CASE(ripemd160_testvectors) {
TestRIPEMD160("", "9c1185a5c5e9fc54612808977ee8f548b2258d31");
TestRIPEMD160("abc", "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc");
@@ -822,7 +832,7 @@ BOOST_AUTO_TEST_CASE(chacha20_testvector)
BOOST_AUTO_TEST_CASE(chacha20_midblock)
{
- auto key = ParseHex<std::byte>("0000000000000000000000000000000000000000000000000000000000000000");
+ auto key = "0000000000000000000000000000000000000000000000000000000000000000"_hex;
ChaCha20 c20{key};
// get one block of keystream
std::byte block[64];
@@ -833,9 +843,9 @@ BOOST_AUTO_TEST_CASE(chacha20_midblock)
c20.Keystream(b2);
c20.Keystream(b3);
- BOOST_CHECK(Span{block}.first(5) == Span{b1});
- BOOST_CHECK(Span{block}.subspan(5, 7) == Span{b2});
- BOOST_CHECK(Span{block}.last(52) == Span{b3});
+ BOOST_CHECK(std::ranges::equal(Span{block}.first(5), b1));
+ BOOST_CHECK(std::ranges::equal(Span{block}.subspan(5, 7), b2));
+ BOOST_CHECK(std::ranges::equal(Span{block}.last(52), b3));
}
BOOST_AUTO_TEST_CASE(poly1305_testvector)
@@ -918,7 +928,7 @@ BOOST_AUTO_TEST_CASE(poly1305_testvector)
{
// mac of the macs of messages of length 0 to 256, where the key and messages have all
// their values set to the length.
- auto total_key = ParseHex<std::byte>("01020304050607fffefdfcfbfaf9ffffffffffffffffffffffffffff00000000");
+ auto total_key = "01020304050607fffefdfcfbfaf9ffffffffffffffffffffffffffff00000000"_hex;
Poly1305 total_ctx(total_key);
for (unsigned i = 0; i < 256; ++i) {
std::vector<std::byte> key(32, std::byte{uint8_t(i)});
@@ -1066,7 +1076,7 @@ BOOST_AUTO_TEST_CASE(sha256d64)
unsigned char in[64 * 32];
unsigned char out1[32 * 32], out2[32 * 32];
for (int j = 0; j < 64 * i; ++j) {
- in[j] = InsecureRandBits(8);
+ in[j] = m_rng.randbits(8);
}
for (int j = 0; j < i; ++j) {
CHash256().Write({in + 64 * j, 64}).Finalize({out1 + 32 * j, 32});
@@ -1076,7 +1086,7 @@ BOOST_AUTO_TEST_CASE(sha256d64)
}
}
-static void TestSHA3_256(const std::string& input, const std::string& output)
+void CryptoTest::TestSHA3_256(const std::string& input, const std::string& output)
{
const auto in_bytes = ParseHex(input);
const auto out_bytes = ParseHex(output);
@@ -1090,8 +1100,8 @@ static void TestSHA3_256(const std::string& input, const std::string& output)
// Reset and split randomly in 3
sha.Reset();
- int s1 = InsecureRandRange(in_bytes.size() + 1);
- int s2 = InsecureRandRange(in_bytes.size() + 1 - s1);
+ int s1 = m_rng.randrange(in_bytes.size() + 1);
+ int s2 = m_rng.randrange(in_bytes.size() + 1 - s1);
int s3 = in_bytes.size() - s1 - s2;
sha.Write(Span{in_bytes}.first(s1)).Write(Span{in_bytes}.subspan(s1, s2));
sha.Write(Span{in_bytes}.last(s3)).Finalize(out);
@@ -1195,7 +1205,7 @@ BOOST_AUTO_TEST_CASE(muhash_tests)
uint256 res;
int table[4];
for (int i = 0; i < 4; ++i) {
- table[i] = g_insecure_rand_ctx.randbits<3>();
+ table[i] = m_rng.randbits<3>();
}
for (int order = 0; order < 4; ++order) {
MuHash3072 acc;
@@ -1215,8 +1225,8 @@ BOOST_AUTO_TEST_CASE(muhash_tests)
}
}
- MuHash3072 x = FromInt(g_insecure_rand_ctx.randbits<4>()); // x=X
- MuHash3072 y = FromInt(g_insecure_rand_ctx.randbits<4>()); // x=X, y=Y
+ MuHash3072 x = FromInt(m_rng.randbits<4>()); // x=X
+ MuHash3072 y = FromInt(m_rng.randbits<4>()); // x=X, y=Y
MuHash3072 z; // x=X, y=Y, z=1
z *= x; // x=X, y=Y, z=X
z *= y; // x=X, y=Y, z=X*Y
@@ -1261,7 +1271,7 @@ BOOST_AUTO_TEST_CASE(muhash_tests)
BOOST_CHECK_EQUAL(HexStr(out), HexStr(out3));
// Test MuHash3072 overflow, meaning the internal data is larger than the modulus.
- DataStream ss_max{ParseHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")};
+ DataStream ss_max{"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"_hex};
MuHash3072 overflowchk;
ss_max >> overflowchk;
diff --git a/src/test/cuckoocache_tests.cpp b/src/test/cuckoocache_tests.cpp
index fc22daeb57..bb4c8c7093 100644
--- a/src/test/cuckoocache_tests.cpp
+++ b/src/test/cuckoocache_tests.cpp
@@ -29,11 +29,11 @@
* using BOOST_CHECK_CLOSE to fail.
*
*/
-BOOST_AUTO_TEST_SUITE(cuckoocache_tests);
+BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup);
/* Test that no values not inserted into the cache are read out of it.
*
- * There are no repeats in the first 200000 InsecureRand256() calls
+ * There are no repeats in the first 200000 m_rng.rand256() calls
*/
BOOST_AUTO_TEST_CASE(test_cuckoocache_no_fakes)
{
@@ -42,18 +42,19 @@ BOOST_AUTO_TEST_CASE(test_cuckoocache_no_fakes)
size_t megabytes = 4;
cc.setup_bytes(megabytes << 20);
for (int x = 0; x < 100000; ++x) {
- cc.insert(InsecureRand256());
+ cc.insert(m_rng.rand256());
}
for (int x = 0; x < 100000; ++x) {
- BOOST_CHECK(!cc.contains(InsecureRand256(), false));
+ BOOST_CHECK(!cc.contains(m_rng.rand256(), false));
}
};
+struct HitRateTest : BasicTestingSetup {
/** This helper returns the hit rate when megabytes*load worth of entries are
* inserted into a megabytes sized cache
*/
template <typename Cache>
-static double test_cache(size_t megabytes, double load)
+double test_cache(size_t megabytes, double load)
{
SeedRandomForTest(SeedRand::ZEROS);
std::vector<uint256> hashes;
@@ -65,7 +66,7 @@ static double test_cache(size_t megabytes, double load)
for (uint32_t i = 0; i < n_insert; ++i) {
uint32_t* ptr = (uint32_t*)hashes[i].begin();
for (uint8_t j = 0; j < 8; ++j)
- *(ptr++) = InsecureRand32();
+ *(ptr++) = m_rng.rand32();
}
/** We make a copy of the hashes because future optimizations of the
* cuckoocache may overwrite the inserted element, so the test is
@@ -104,9 +105,10 @@ static double normalize_hit_rate(double hits, double load)
{
return hits * std::max(load, 1.0);
}
+}; // struct HitRateTest
/** Check the hit rate on loads ranging from 0.1 to 1.6 */
-BOOST_AUTO_TEST_CASE(cuckoocache_hit_rate_ok)
+BOOST_FIXTURE_TEST_CASE(cuckoocache_hit_rate_ok, HitRateTest)
{
/** Arbitrarily selected Hit Rate threshold that happens to work for this test
* as a lower bound on performance.
@@ -120,10 +122,11 @@ BOOST_AUTO_TEST_CASE(cuckoocache_hit_rate_ok)
}
+struct EraseTest : BasicTestingSetup {
/** This helper checks that erased elements are preferentially inserted onto and
* that the hit rate of "fresher" keys is reasonable*/
template <typename Cache>
-static void test_cache_erase(size_t megabytes)
+void test_cache_erase(size_t megabytes)
{
double load = 1;
SeedRandomForTest(SeedRand::ZEROS);
@@ -136,7 +139,7 @@ static void test_cache_erase(size_t megabytes)
for (uint32_t i = 0; i < n_insert; ++i) {
uint32_t* ptr = (uint32_t*)hashes[i].begin();
for (uint8_t j = 0; j < 8; ++j)
- *(ptr++) = InsecureRand32();
+ *(ptr++) = m_rng.rand32();
}
/** We make a copy of the hashes because future optimizations of the
* cuckoocache may overwrite the inserted element, so the test is
@@ -178,15 +181,17 @@ static void test_cache_erase(size_t megabytes)
// erased elements.
BOOST_CHECK(hit_rate_stale > 2 * hit_rate_erased_but_contained);
}
+}; // struct EraseTest
-BOOST_AUTO_TEST_CASE(cuckoocache_erase_ok)
+BOOST_FIXTURE_TEST_CASE(cuckoocache_erase_ok, EraseTest)
{
size_t megabytes = 4;
test_cache_erase<CuckooCache::cache<uint256, SignatureCacheHasher>>(megabytes);
}
+struct EraseParallelTest : BasicTestingSetup {
template <typename Cache>
-static void test_cache_erase_parallel(size_t megabytes)
+void test_cache_erase_parallel(size_t megabytes)
{
double load = 1;
SeedRandomForTest(SeedRand::ZEROS);
@@ -199,7 +204,7 @@ static void test_cache_erase_parallel(size_t megabytes)
for (uint32_t i = 0; i < n_insert; ++i) {
uint32_t* ptr = (uint32_t*)hashes[i].begin();
for (uint8_t j = 0; j < 8; ++j)
- *(ptr++) = InsecureRand32();
+ *(ptr++) = m_rng.rand32();
}
/** We make a copy of the hashes because future optimizations of the
* cuckoocache may overwrite the inserted element, so the test is
@@ -268,15 +273,17 @@ static void test_cache_erase_parallel(size_t megabytes)
// erased elements.
BOOST_CHECK(hit_rate_stale > 2 * hit_rate_erased_but_contained);
}
-BOOST_AUTO_TEST_CASE(cuckoocache_erase_parallel_ok)
+}; // struct EraseParallelTest
+BOOST_FIXTURE_TEST_CASE(cuckoocache_erase_parallel_ok, EraseParallelTest)
{
size_t megabytes = 4;
test_cache_erase_parallel<CuckooCache::cache<uint256, SignatureCacheHasher>>(megabytes);
}
+struct GenerationsTest : BasicTestingSetup {
template <typename Cache>
-static void test_cache_generations()
+void test_cache_generations()
{
// This test checks that for a simulation of network activity, the fresh hit
// rate is never below 99%, and the number of times that it is worse than
@@ -302,7 +309,7 @@ static void test_cache_generations()
// immediately and never uses the other half.
struct block_activity {
std::vector<uint256> reads;
- block_activity(uint32_t n_insert, Cache& c) : reads()
+ block_activity(uint32_t n_insert, FastRandomContext& rng, Cache& c)
{
std::vector<uint256> inserts;
inserts.resize(n_insert);
@@ -310,7 +317,7 @@ static void test_cache_generations()
for (uint32_t i = 0; i < n_insert; ++i) {
uint32_t* ptr = (uint32_t*)inserts[i].begin();
for (uint8_t j = 0; j < 8; ++j)
- *(ptr++) = InsecureRand32();
+ *(ptr++) = rng.rand32();
}
for (uint32_t i = 0; i < n_insert / 4; ++i)
reads.push_back(inserts[i]);
@@ -344,7 +351,7 @@ static void test_cache_generations()
for (uint32_t i = 0; i < total; ++i) {
if (last_few.size() == WINDOW_SIZE)
last_few.pop_front();
- last_few.emplace_back(BLOCK_SIZE, set);
+ last_few.emplace_back(BLOCK_SIZE, m_rng, set);
uint32_t count = 0;
for (auto& act : last_few)
for (uint32_t k = 0; k < POP_AMOUNT; ++k) {
@@ -365,7 +372,8 @@ static void test_cache_generations()
// max_rate_less_than_tight_hit_rate of the time
BOOST_CHECK(double(out_of_tight_tolerance) / double(total) < max_rate_less_than_tight_hit_rate);
}
-BOOST_AUTO_TEST_CASE(cuckoocache_generations)
+}; // struct GenerationsTest
+BOOST_FIXTURE_TEST_CASE(cuckoocache_generations, GenerationsTest)
{
test_cache_generations<CuckooCache::cache<uint256, SignatureCacheHasher>>();
}
diff --git a/src/test/dbwrapper_tests.cpp b/src/test/dbwrapper_tests.cpp
index 167e4be288..3a86036327 100644
--- a/src/test/dbwrapper_tests.cpp
+++ b/src/test/dbwrapper_tests.cpp
@@ -33,7 +33,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper)
fs::path ph = m_args.GetDataDirBase() / (obfuscate ? "dbwrapper_obfuscate_true" : "dbwrapper_obfuscate_false");
CDBWrapper dbw({.path = ph, .cache_bytes = 1 << 20, .memory_only = true, .wipe_data = false, .obfuscate = obfuscate});
uint8_t key{'k'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
uint256 res;
// Ensure that we're doing real obfuscation when obfuscate=true
@@ -60,65 +60,65 @@ BOOST_AUTO_TEST_CASE(dbwrapper_basic_data)
BOOST_CHECK(obfuscate != is_null_key(dbwrapper_private::GetObfuscateKey(dbw)));
//Simulate block raw data - "b + block hash"
- std::string key_block = "b" + InsecureRand256().ToString();
+ std::string key_block = "b" + m_rng.rand256().ToString();
- uint256 in_block = InsecureRand256();
+ uint256 in_block = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_block, in_block));
BOOST_CHECK(dbw.Read(key_block, res));
BOOST_CHECK_EQUAL(res.ToString(), in_block.ToString());
//Simulate file raw data - "f + file_number"
- std::string key_file = strprintf("f%04x", InsecureRand32());
+ std::string key_file = strprintf("f%04x", m_rng.rand32());
- uint256 in_file_info = InsecureRand256();
+ uint256 in_file_info = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_file, in_file_info));
BOOST_CHECK(dbw.Read(key_file, res));
BOOST_CHECK_EQUAL(res.ToString(), in_file_info.ToString());
//Simulate transaction raw data - "t + transaction hash"
- std::string key_transaction = "t" + InsecureRand256().ToString();
+ std::string key_transaction = "t" + m_rng.rand256().ToString();
- uint256 in_transaction = InsecureRand256();
+ uint256 in_transaction = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_transaction, in_transaction));
BOOST_CHECK(dbw.Read(key_transaction, res));
BOOST_CHECK_EQUAL(res.ToString(), in_transaction.ToString());
//Simulate UTXO raw data - "c + transaction hash"
- std::string key_utxo = "c" + InsecureRand256().ToString();
+ std::string key_utxo = "c" + m_rng.rand256().ToString();
- uint256 in_utxo = InsecureRand256();
+ uint256 in_utxo = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_utxo, in_utxo));
BOOST_CHECK(dbw.Read(key_utxo, res));
BOOST_CHECK_EQUAL(res.ToString(), in_utxo.ToString());
//Simulate last block file number - "l"
uint8_t key_last_blockfile_number{'l'};
- uint32_t lastblockfilenumber = InsecureRand32();
+ uint32_t lastblockfilenumber = m_rng.rand32();
BOOST_CHECK(dbw.Write(key_last_blockfile_number, lastblockfilenumber));
BOOST_CHECK(dbw.Read(key_last_blockfile_number, res_uint_32));
BOOST_CHECK_EQUAL(lastblockfilenumber, res_uint_32);
//Simulate Is Reindexing - "R"
uint8_t key_IsReindexing{'R'};
- bool isInReindexing = InsecureRandBool();
+ bool isInReindexing = m_rng.randbool();
BOOST_CHECK(dbw.Write(key_IsReindexing, isInReindexing));
BOOST_CHECK(dbw.Read(key_IsReindexing, res_bool));
BOOST_CHECK_EQUAL(isInReindexing, res_bool);
//Simulate last block hash up to which UXTO covers - 'B'
uint8_t key_lastblockhash_uxto{'B'};
- uint256 lastblock_hash = InsecureRand256();
+ uint256 lastblock_hash = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_lastblockhash_uxto, lastblock_hash));
BOOST_CHECK(dbw.Read(key_lastblockhash_uxto, res));
BOOST_CHECK_EQUAL(lastblock_hash, res);
//Simulate file raw data - "F + filename_number + filename"
std::string file_option_tag = "F";
- uint8_t filename_length = InsecureRandBits(8);
+ uint8_t filename_length = m_rng.randbits(8);
std::string filename = "randomfilename";
std::string key_file_option = strprintf("%s%01x%s", file_option_tag,filename_length,filename);
- bool in_file_bool = InsecureRandBool();
+ bool in_file_bool = m_rng.randbool();
BOOST_CHECK(dbw.Write(key_file_option, in_file_bool));
BOOST_CHECK(dbw.Read(key_file_option, res_bool));
BOOST_CHECK_EQUAL(res_bool, in_file_bool);
@@ -134,11 +134,11 @@ BOOST_AUTO_TEST_CASE(dbwrapper_batch)
CDBWrapper dbw({.path = ph, .cache_bytes = 1 << 20, .memory_only = true, .wipe_data = false, .obfuscate = obfuscate});
uint8_t key{'i'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
uint8_t key2{'j'};
- uint256 in2 = InsecureRand256();
+ uint256 in2 = m_rng.rand256();
uint8_t key3{'k'};
- uint256 in3 = InsecureRand256();
+ uint256 in3 = m_rng.rand256();
uint256 res;
CDBBatch batch(dbw);
@@ -171,10 +171,10 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
// The two keys are intentionally chosen for ordering
uint8_t key{'j'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
BOOST_CHECK(dbw.Write(key, in));
uint8_t key2{'k'};
- uint256 in2 = InsecureRand256();
+ uint256 in2 = m_rng.rand256();
BOOST_CHECK(dbw.Write(key2, in2));
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper&>(dbw).NewIterator());
@@ -212,7 +212,7 @@ BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
// Set up a non-obfuscated wrapper to write some initial data.
std::unique_ptr<CDBWrapper> dbw = std::make_unique<CDBWrapper>(DBParams{.path = ph, .cache_bytes = 1 << 10, .memory_only = false, .wipe_data = false, .obfuscate = false});
uint8_t key{'k'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
uint256 res;
BOOST_CHECK(dbw->Write(key, in));
@@ -234,7 +234,7 @@ BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
BOOST_CHECK(!odbw.IsEmpty()); // There should be existing data
BOOST_CHECK(is_null_key(dbwrapper_private::GetObfuscateKey(odbw))); // The key should be an empty string
- uint256 in2 = InsecureRand256();
+ uint256 in2 = m_rng.rand256();
uint256 res3;
// Check that we can write successfully
@@ -253,7 +253,7 @@ BOOST_AUTO_TEST_CASE(existing_data_reindex)
// Set up a non-obfuscated wrapper to write some initial data.
std::unique_ptr<CDBWrapper> dbw = std::make_unique<CDBWrapper>(DBParams{.path = ph, .cache_bytes = 1 << 10, .memory_only = false, .wipe_data = false, .obfuscate = false});
uint8_t key{'k'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
uint256 res;
BOOST_CHECK(dbw->Write(key, in));
@@ -271,7 +271,7 @@ BOOST_AUTO_TEST_CASE(existing_data_reindex)
BOOST_CHECK(!odbw.Read(key, res2));
BOOST_CHECK(!is_null_key(dbwrapper_private::GetObfuscateKey(odbw)));
- uint256 in2 = InsecureRand256();
+ uint256 in2 = m_rng.rand256();
uint256 res3;
// Check that we can write successfully
diff --git a/src/test/denialofservice_tests.cpp b/src/test/denialofservice_tests.cpp
index 42db28daf5..9ee7e9c9fe 100644
--- a/src/test/denialofservice_tests.cpp
+++ b/src/test/denialofservice_tests.cpp
@@ -106,17 +106,18 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
peerman.FinalizeNode(dummyNode1);
}
-static void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman, ConnectionType connType, bool onion_peer = false)
+struct OutboundTest : TestingSetup {
+void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman, ConnectionType connType, bool onion_peer = false)
{
CAddress addr;
if (onion_peer) {
- auto tor_addr{g_insecure_rand_ctx.randbytes(ADDR_TORV3_SIZE)};
+ auto tor_addr{m_rng.randbytes(ADDR_TORV3_SIZE)};
BOOST_REQUIRE(addr.SetSpecial(OnionToString(tor_addr)));
}
while (!addr.IsRoutable()) {
- addr = CAddress(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE);
+ addr = CAddress(ip(m_rng.randbits(32)), NODE_NONE);
}
vNodes.emplace_back(new CNode{id++,
@@ -136,8 +137,9 @@ static void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerM
connman.AddTestNode(node);
}
+}; // struct OutboundTest
-BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
+BOOST_FIXTURE_TEST_CASE(stale_tip_peer_management, OutboundTest)
{
NodeId id{0};
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman, Params());
@@ -235,7 +237,7 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
connman->ClearTestNodes();
}
-BOOST_AUTO_TEST_CASE(block_relay_only_eviction)
+BOOST_FIXTURE_TEST_CASE(block_relay_only_eviction, OutboundTest)
{
NodeId id{0};
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman, Params());
diff --git a/src/test/descriptor_tests.cpp b/src/test/descriptor_tests.cpp
index 01b13fa794..24b8f2f793 100644
--- a/src/test/descriptor_tests.cpp
+++ b/src/test/descriptor_tests.cpp
@@ -15,6 +15,7 @@
#include <string>
#include <vector>
+using namespace util::hex_literals;
using util::Split;
namespace {
@@ -25,8 +26,8 @@ void CheckUnparsable(const std::string& prv, const std::string& pub, const std::
std::string error;
auto parse_priv = Parse(prv, keys_priv, error);
auto parse_pub = Parse(pub, keys_pub, error);
- BOOST_CHECK_MESSAGE(!parse_priv, prv);
- BOOST_CHECK_MESSAGE(!parse_pub, pub);
+ BOOST_CHECK_MESSAGE(parse_priv.empty(), prv);
+ BOOST_CHECK_MESSAGE(parse_pub.empty(), pub);
BOOST_CHECK_EQUAL(error, expected_error);
}
@@ -133,25 +134,29 @@ void DoCheck(std::string prv, std::string pub, const std::string& norm_pub, int
const std::vector<std::vector<std::string>>& scripts, const std::optional<OutputType>& type, std::optional<uint256> op_desc_id = std::nullopt,
const std::set<std::vector<uint32_t>>& paths = ONLY_EMPTY, bool replace_apostrophe_with_h_in_prv=false,
bool replace_apostrophe_with_h_in_pub=false, uint32_t spender_nlocktime=0, uint32_t spender_nsequence=CTxIn::SEQUENCE_FINAL,
- std::map<std::vector<uint8_t>, std::vector<uint8_t>> preimages={})
+ std::map<std::vector<uint8_t>, std::vector<uint8_t>> preimages={},
+ std::optional<std::string> expected_prv = std::nullopt, std::optional<std::string> expected_pub = std::nullopt, int desc_index = 0)
{
FlatSigningProvider keys_priv, keys_pub;
std::set<std::vector<uint32_t>> left_paths = paths;
std::string error;
- std::unique_ptr<Descriptor> parse_priv;
- std::unique_ptr<Descriptor> parse_pub;
+ std::vector<std::unique_ptr<Descriptor>> parse_privs;
+ std::vector<std::unique_ptr<Descriptor>> parse_pubs;
// Check that parsing succeeds.
if (replace_apostrophe_with_h_in_prv) {
prv = UseHInsteadOfApostrophe(prv);
}
- parse_priv = Parse(prv, keys_priv, error);
- BOOST_CHECK_MESSAGE(parse_priv, error);
+ parse_privs = Parse(prv, keys_priv, error);
+ BOOST_CHECK_MESSAGE(!parse_privs.empty(), error);
if (replace_apostrophe_with_h_in_pub) {
pub = UseHInsteadOfApostrophe(pub);
}
- parse_pub = Parse(pub, keys_pub, error);
- BOOST_CHECK_MESSAGE(parse_pub, error);
+ parse_pubs = Parse(pub, keys_pub, error);
+ BOOST_CHECK_MESSAGE(!parse_pubs.empty(), error);
+
+ auto& parse_priv = parse_privs.at(desc_index);
+ auto& parse_pub = parse_pubs.at(desc_index);
// We must be able to estimate the max satisfaction size for any solvable descriptor top descriptor (but combo).
const bool is_nontop_or_nonsolvable{!parse_priv->IsSolvable() || !parse_priv->GetOutputType()};
@@ -173,11 +178,17 @@ void DoCheck(std::string prv, std::string pub, const std::string& norm_pub, int
BOOST_CHECK(keys_priv.keys.size());
BOOST_CHECK(!keys_pub.keys.size());
- // Check that both versions serialize back to the public version.
+ // If expected_pub is provided, check that the serialize matches that.
+ // Otherwise check that they serialize back to the public version.
std::string pub1 = parse_priv->ToString();
std::string pub2 = parse_pub->ToString();
- BOOST_CHECK_MESSAGE(EqualDescriptor(pub, pub1), "Private ser: " + pub1 + " Public desc: " + pub);
- BOOST_CHECK_MESSAGE(EqualDescriptor(pub, pub2), "Public ser: " + pub2 + " Public desc: " + pub);
+ if (expected_pub) {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(*expected_pub, pub1), "Private ser: " + pub1 + " Public desc: " + *expected_pub);
+ BOOST_CHECK_MESSAGE(EqualDescriptor(*expected_pub, pub2), "Public ser: " + pub2 + " Public desc: " + *expected_pub);
+ } else {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(pub, pub1), "Private ser: " + pub1 + " Public desc: " + pub);
+ BOOST_CHECK_MESSAGE(EqualDescriptor(pub, pub2), "Public ser: " + pub2 + " Public desc: " + pub);
+ }
// Check that the COMPAT identifier did not change
if (op_desc_id) {
@@ -188,10 +199,19 @@ void DoCheck(std::string prv, std::string pub, const std::string& norm_pub, int
if (!(flags & MISSING_PRIVKEYS)) {
std::string prv1;
BOOST_CHECK(parse_priv->ToPrivateString(keys_priv, prv1));
- BOOST_CHECK_MESSAGE(EqualDescriptor(prv, prv1), "Private ser: " + prv1 + " Private desc: " + prv);
+ if (expected_prv) {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(*expected_prv, prv1), "Private ser: " + prv1 + "Private desc: " + *expected_prv);
+ } else {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(prv, prv1), "Private ser: " + prv1 + " Private desc: " + prv);
+ }
BOOST_CHECK(!parse_priv->ToPrivateString(keys_pub, prv1));
BOOST_CHECK(parse_pub->ToPrivateString(keys_priv, prv1));
- BOOST_CHECK_MESSAGE(EqualDescriptor(prv, prv1), "Private ser: " + prv1 + " Private desc: " + prv);
+ if (expected_prv) {
+ BOOST_CHECK(EqualDescriptor(*expected_prv, prv1));
+ BOOST_CHECK_MESSAGE(EqualDescriptor(*expected_prv, prv1), "Private ser: " + prv1 + " Private desc: " + *expected_prv);
+ } else {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(prv, prv1), "Private ser: " + prv1 + " Private desc: " + prv);
+ }
BOOST_CHECK(!parse_pub->ToPrivateString(keys_pub, prv1));
}
@@ -372,18 +392,42 @@ void DoCheck(std::string prv, std::string pub, const std::string& norm_pub, int
void Check(const std::string& prv, const std::string& pub, const std::string& norm_pub, int flags,
const std::vector<std::vector<std::string>>& scripts, const std::optional<OutputType>& type, std::optional<uint256> op_desc_id = std::nullopt,
const std::set<std::vector<uint32_t>>& paths = ONLY_EMPTY, uint32_t spender_nlocktime=0,
- uint32_t spender_nsequence=CTxIn::SEQUENCE_FINAL, std::map<std::vector<uint8_t>, std::vector<uint8_t>> preimages={})
+ uint32_t spender_nsequence=CTxIn::SEQUENCE_FINAL, std::map<std::vector<uint8_t>, std::vector<uint8_t>> preimages={},
+ std::optional<std::string> expected_prv = std::nullopt, std::optional<std::string> expected_pub = std::nullopt, int desc_index = 0)
{
// Do not replace apostrophes with 'h' in prv and pub
DoCheck(prv, pub, norm_pub, flags, scripts, type, op_desc_id, paths, /*replace_apostrophe_with_h_in_prv=*/false,
/*replace_apostrophe_with_h_in_pub=*/false, /*spender_nlocktime=*/spender_nlocktime,
- /*spender_nsequence=*/spender_nsequence, /*preimages=*/preimages);
+ /*spender_nsequence=*/spender_nsequence, /*preimages=*/preimages,
+ expected_prv, expected_pub, desc_index);
// Replace apostrophes with 'h' both in prv and in pub, if apostrophes are found in both
if (prv.find('\'') != std::string::npos && pub.find('\'') != std::string::npos) {
DoCheck(prv, pub, norm_pub, flags, scripts, type, op_desc_id, paths, /*replace_apostrophe_with_h_in_prv=*/true,
/*replace_apostrophe_with_h_in_pub=*/true, /*spender_nlocktime=*/spender_nlocktime,
- /*spender_nsequence=*/spender_nsequence, /*preimages=*/preimages);
+ /*spender_nsequence=*/spender_nsequence, /*preimages=*/preimages,
+ expected_prv, expected_pub, desc_index);
+ }
+}
+
+void CheckMultipath(const std::string& prv,
+ const std::string& pub,
+ const std::vector<std::string>& expanded_prvs,
+ const std::vector<std::string>& expanded_pubs,
+ const std::vector<std::string>& expanded_norm_pubs,
+ int flags,
+ const std::vector<std::vector<std::vector<std::string>>>& scripts,
+ const std::optional<OutputType>& type,
+ const std::vector<std::set<std::vector<uint32_t>>>& paths)
+{
+ assert(expanded_prvs.size() == expanded_pubs.size());
+ assert(expanded_prvs.size() == expanded_norm_pubs.size());
+ assert(expanded_prvs.size() == scripts.size());
+ assert(expanded_prvs.size() == paths.size());
+ for (size_t i = 0; i < expanded_prvs.size(); ++i) {
+ Check(prv, pub, expanded_norm_pubs.at(i), flags, scripts.at(i), type, std::nullopt, paths.at(i),
+ /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, /*preimages=*/{},
+ expanded_prvs.at(i), expanded_pubs.at(i), i);
}
}
@@ -492,6 +536,293 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
CheckUnparsable("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/1aa)", "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1aa)", "pkh(): Key path value '1aa' is not a valid uint32"); // Path is not valid uint
Check("pkh([01234567/10/20]xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647'/0)", "pkh([01234567/10/20]xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647'/0)", "pkh([01234567/10/20/2147483647h]xpub69H7F5dQzmVd3vPuLKtcXJziMEQByuDidnX3YdwgtNsecY5HRGtAAQC5mXTt4dsv9RzyjgDjAQs9VGVV6ydYCHnprc9vvaA5YtqWyL6hyds/0)", HARDENED, {{"76a914ebdc90806a9c4356c1c88e42216611e1cb4c1c1788ac"}}, OutputType::LEGACY, /*op_desc_id=*/std::nullopt, {{10, 20, 0xFFFFFFFFUL, 0}});
+ // Multipath versions with BIP32 derivations
+ CheckMultipath("pk(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/<0;1>)",
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/<0;1>)",
+ {
+ "pk(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0)",
+ "pk(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/1)",
+ },
+ {
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)",
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/1)",
+ },
+ {
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)",
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/1)",
+ },
+ DEFAULT,
+ {
+ {{"210379e45b3cf75f9c5f9befd8e9506fb962f6a9d185ac87001ec44a8d3df8d4a9e3ac"}},
+ {{"21034f8d02282ac6786737d0f37f0df7655f49daa24843bc7de3f4ea88603d26d10aac"}},
+ },
+ std::nullopt,
+ {
+ {{0}},
+ {{1}},
+ }
+ );
+ CheckMultipath("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<2147483647h;0>/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<2147483647h;0>/0)",
+ {
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647h/0)",
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/0/0)",
+ },
+ {
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647h/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0/0)",
+ },
+ {
+ "pkh([bd16bee5/2147483647h]xpub69H7F5dQzmVd3vPuLKtcXJziMEQByuDidnX3YdwgtNsecY5HRGtAAQC5mXTt4dsv9RzyjgDjAQs9VGVV6ydYCHnprc9vvaA5YtqWyL6hyds/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0/0)",
+ },
+ HARDENED,
+ {
+ {{"76a914ebdc90806a9c4356c1c88e42216611e1cb4c1c1788ac"}},
+ {{"76a914f103317b9f0b758a62cb3879281d23e3b1deb90d88ac"}},
+ },
+ OutputType::LEGACY,
+ {
+ {{0xFFFFFFFFUL,0}},
+ {{0,0}},
+ }
+ );
+ CheckMultipath("wpkh([ffffffff/13h]xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/<1;3>/2/*)",
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/<1;3>/2/*)",
+ {
+ "wpkh([ffffffff/13h]xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/1/2/*)",
+ "wpkh([ffffffff/13h]xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/3/2/*)",
+ },
+ {
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*)",
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/3/2/*)",
+ },
+ {
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*)",
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/3/2/*)",
+ },
+ RANGE,
+ {
+ {{"0014326b2249e3a25d5dc60935f044ee835d090ba859"},{"0014af0bd98abc2f2cae66e36896a39ffe2d32984fb7"},{"00141fa798efd1cbf95cebf912c031b8a4a6e9fb9f27"}},
+ {{"001426183882ef9c76b9a44386e9b387f33cee7c3a2d"},{"001447c1b9dc215c3f8b47e572981eb97528768cde4e"},{"00146e92cbaa397f9caeccf9a049460258af6ccd67e2"}},
+ },
+ OutputType::BECH32,
+ {
+ {{0x8000000DUL, 1, 2, 0}, {0x8000000DUL, 1, 2, 1}, {0x8000000DUL, 1, 2, 2}},
+ {{0x8000000DUL, 3, 2, 0}, {0x8000000DUL, 3, 2, 1}, {0x8000000DUL, 3, 2, 2}},
+ }
+ );
+ CheckMultipath("sh(wpkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/<10;100h>/20/30/40/*h))",
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/<10;100h>/20/30/40/*h))",
+ {
+ "sh(wpkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*h))",
+ "sh(wpkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/100h/20/30/40/*h))",
+ },
+ {
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*h))",
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/100h/20/30/40/*h))",
+ },
+ {
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*h))",
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/100h/20/30/40/*h))",
+ },
+ RANGE | HARDENED | DERIVE_HARDENED,
+ {
+ {{"a9149a4d9901d6af519b2a23d4a2f51650fcba87ce7b87"},{"a914bed59fc0024fae941d6e20a3b44a109ae740129287"},{"a9148483aa1116eb9c05c482a72bada4b1db24af654387"}},
+ {{"a91470192039cb9529aadf4e53e46d9ac6a13790865787"},{"a914855859faffabf1e4ed2bb7411ab66f4599b1abd287"},{"a9148f2cfd4b486de247c44684160da164617ccf2c2687"}},
+ },
+ OutputType::P2SH_SEGWIT,
+ {
+ {{10, 20, 30, 40, 0x80000000UL}, {10, 20, 30, 40, 0x80000001UL}, {10, 20, 30, 40, 0x80000002UL}},
+ {{0x80000064UL, 20, 30, 40, 0x80000000UL}, {0x80000064UL, 20, 30, 40, 0x80000001UL}, {0x80000064UL, 20, 30, 40, 0x80000002UL}},
+ }
+ );
+ CheckMultipath("multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2>/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/<3;4>/0/*)",
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2>/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/<3;4>/0/*)",
+ {
+ "multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/3/0/*)",
+ "multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/2/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/4/0/*)",
+ },
+ {
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/3/0/*)",
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/4/0/*)",
+ },
+ {
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/3/0/*)",
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/4/0/*)",
+ },
+ RANGE,
+ {
+ {{"522103095e95d8c50ae3f3fea93fa8e983f710489f60ff681a658c06eba64622c824b121020443e9e729b42628913f1a69b46b7d43ff87c46e86140e12ee420d7e2e8caf8c52ae"},{"5221027512d6bd74e24eeb1ad752d5be800adc5886ded11c5293a9a701db83658b526a2102371e912dea5fefa56158908fe4c9f66bc925a8939b10f3821e8f8be797b9ca8252ae"},{"522102cc9fd211dc0a1c8bb7a106ff831be0e253bc992f21d08fb8a6fd43fae51b9b892103e43eddc68afc9746c9d09ce0bf8067b4f2416287abbc422ed1ac300673b1104952ae"}},
+ {{"5221031c0517fff3d483f06ca769bd2326bf30aca1c4de278e676e6ef760c3301244c6210316e171ff4f82dc62ad3f0d84c97865034fc5041eaa508b48c1d7af77f301c8bd52ae"},{"52210240f010ccff4202ade2ef87756f6b9af57bbf5ebcb0393b949e6e5d45d30bff36210229057a7e03510b8cb66727fab3f47a52a02ea94eae03e7c2e81b72a26781bfde52ae"},{"5221034052522058a07b647bd08fa1a9eaedae0222eac76ddd122ff8096ec969398de721038cb8180dd4c956848bcf191e45aaf297146207559fb8737881156aadaf13704152ae"}},
+ },
+ std::nullopt,
+ {
+ {{1, 0}, {1, 1}, {1, 2}, {3, 0, 0}, {3, 0, 1}, {3, 0, 2}},
+ {{2, 0}, {2, 1}, {2, 2}, {4, 0, 0}, {4, 0, 1}, {4, 0, 2}},
+ }
+ );
+ CheckMultipath("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0;1;2>)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0;1;2>)",
+ {
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/0)",
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/1)",
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2)",
+ },
+ {
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2)",
+ },
+ {
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2)",
+ },
+ DEFAULT,
+ {
+ {{"76a9145a61ff8eb7aaca3010db97ebda76121610b7809688ac"}},
+ {{"76a9142f792a782cf4adbb321fe646c8e220563649b8fa88ac"}},
+ {{"76a914dcc5b93b52177d78f97b3f2d259b9a86ee1403b188ac"}},
+ },
+ OutputType::LEGACY,
+ {
+ {{0}},
+ {{1}},
+ {{2}},
+ }
+ );
+ CheckMultipath("sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*))",
+ {
+ "sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/3/*))",
+ "sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/2/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/4/*))",
+ "sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/3/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/5/*))",
+ },
+ {
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*))",
+ },
+ {
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*))",
+ },
+ RANGE,
+ {
+ {{"a914689cdf7de5836ec04fb971d128cc84858f73e11487"},{"a9142ea7dbaf0a77ee19f080cdacb3e13560e3cd9cf587"},{"a9143da854021f58f5e2d3ff6bb4fcd0ced877deb34987"}},
+ {{"a9143dd613d162e89b83369bbf08e5f1977cfdc9b02787"},{"a91449eef5d3df5c465b20a630c66058fe689082d8e187"},{"a91492be56babf54ea2109c577f799ba6d73948e8c3287"}},
+ {{"a9140093ca92097bdf557fbb0570bb77e1efd2e7529c87"},{"a914e4d0419d3d2ce8f921a800796811ff5462bb151887"},{"a914997bf69841ac444190dc02f5e6031dd6f8feab4587"}},
+ },
+ OutputType::LEGACY,
+ {
+ {{1, 0, 0}, {1, 0, 1}, {1, 0, 2}, {0, 0}, {0, 1}, {0, 2}, {0, 0, 3, 0}, {0, 0, 3, 1}, {0, 0, 3, 2}},
+ {{2, 0, 0}, {2, 0, 1}, {2, 0, 2}, {0, 0}, {0, 1}, {0, 2}, {0, 0, 4, 0}, {0, 0, 4, 1}, {0, 0, 4, 2}},
+ {{3, 0, 0}, {3, 0, 1}, {3, 0, 2}, {0, 0}, {0, 1}, {0, 2}, {0, 0, 5, 0}, {0, 0, 5, 1}, {0, 0, 5, 2}},
+ }
+ );
+ CheckMultipath("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/<6;7;8>/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/<6;7;8>/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*)})",
+ {
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/3/*)})",
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/7/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/2/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/4/*)})",
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/8/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/3/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/5/*)})",
+ },
+ {
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/7/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/8/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*)})",
+ },
+ {
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/7/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/8/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*)})",
+ },
+ XONLY_KEYS | RANGE,
+ {
+ {{"5120993e5b1d71d14cbb0a90c57ea0fed1d5bf77d5804cee206c3dbd7e4d2c67d869"},{"51207b8f629f6d406b92ffa6284f5545085eafb837c469018b715755f619b587163b"},{"512061f52925826e51e4615007557ddbea55b22c817909d7ebcfd3c454c634643ece"}},
+ {{"5120633808b2156d0a6597e8b07f59c387bb4c2d5c02c4cb98f1802748e64c6abf5f"},{"5120fc5f06ded29328c170bf7e49e71c9cc8699befa2bf0a2a80802a1f32ab72d291"},{"5120fd05e2227e0dac972dff9941e332db8461bedc320c2a74def44e469ddbad9d21"}},
+ {{"51205d19538c7c0901520eb712d079ae6eebed4f691021da466dc24e9575d9815ad0"},{"5120b9fc348ede2b7b9fb1f84c21741bb36bb3fa0905d0bc9417e07145d3142673f7"},{"51203a655bc5181b12efac82a5a5d1d0969b2ceb92c6fc37f505fdf00ee8afa09b33"}},
+ },
+ OutputType::BECH32M,
+ {
+ {{6, 0}, {6, 1}, {6, 2}, {1, 0, 0}, {1, 0, 1}, {1, 0, 2}, {0, 0, 3, 0}, {0, 0, 3, 1}, {0, 0, 3, 2}},
+ {{7, 0}, {7, 1}, {7, 2}, {2, 0, 0}, {2, 0, 1}, {2, 0, 2}, {0, 0, 4, 0}, {0, 0, 4, 1}, {0, 0, 4, 2}},
+ {{8, 0}, {8, 1}, {8, 2}, {3, 0, 0}, {3, 0, 1}, {3, 0, 2}, {0, 0, 5, 0}, {0, 0, 5, 1}, {0, 0, 5, 2}},
+ }
+ );
+ CheckMultipath("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*)})",
+ {
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/3/*)})",
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/2/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/4/*)})",
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/3/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/5/*)})",
+ },
+ {
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*)})",
+ },
+ {
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*)})",
+ },
+ XONLY_KEYS | RANGE,
+ {
+ {{"5120993e5b1d71d14cbb0a90c57ea0fed1d5bf77d5804cee206c3dbd7e4d2c67d869"},{"51207b8f629f6d406b92ffa6284f5545085eafb837c469018b715755f619b587163b"},{"512061f52925826e51e4615007557ddbea55b22c817909d7ebcfd3c454c634643ece"}},
+ {{"5120c481a8ada38d1070094f62af526d4f8aae2eb1e44d1fd961be6a25198b4da77b"},{"512034a2d31c091905e62def62b575b88beff41723d83acb02dfada2e73d9c529b40"},{"5120e0ecc278655b092962ded92a5781bd8e86e8408055de05f121e107fa211e5dfb"}},
+ {{"51206052cff5efc848e4b38a947803943eb1eb0076523eec1041969851ebcd265555"},{"512009ed83d758c0bdd36e225c961810761c7a360533434a41a17bba709e331e6cd1"},{"5120fcd77851ebaac37564b87e9b351c54492a8fbb1d6afdf7f3a9317703a002b22b"}},
+ },
+ OutputType::BECH32M,
+ {
+ {{6, 0}, {6, 1}, {6, 2}, {1, 0, 0}, {1, 0, 1}, {1, 0, 2}, {0, 0, 3, 0}, {0, 0, 3, 1}, {0, 0, 3, 2}},
+ {{6, 0}, {6, 1}, {6, 2}, {2, 0, 0}, {2, 0, 1}, {2, 0, 2}, {0, 0, 4, 0}, {0, 0, 4, 1}, {0, 0, 4, 2}},
+ {{6, 0}, {6, 1}, {6, 2}, {3, 0, 0}, {3, 0, 1}, {3, 0, 2}, {0, 0, 5, 0}, {0, 0, 5, 1}, {0, 0, 5, 2}},
+ }
+ );
+ CheckMultipath("wsh(or_d(pk([2557c640/48h/1h/0h/2h]xprv9ws7hGFQPbDga6QrETbFM7Gqc7m15UNoJ7KF5kkDhyZCBcANAqRMUCytQ4JM1nLSYvGyFjg6TvBEfNrN3znaFdb67jQoQ7z9kFnd4BUUJiE/<0;1>/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xprv9ws7hGFQPbDgbCvNcYVfGeGK8UTSFmAho4iAXZf13yQVJmHuKHN9oMXCv7zsJn8Dcqvqy2iugFWAhDdUUX6r5VLNWkRTpxVoQJ6DbzY9eYa/<0;1>/*),older(2))))",
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/<0;1>/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/<0;1>/*),older(2))))",
+ {
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xprv9ws7hGFQPbDga6QrETbFM7Gqc7m15UNoJ7KF5kkDhyZCBcANAqRMUCytQ4JM1nLSYvGyFjg6TvBEfNrN3znaFdb67jQoQ7z9kFnd4BUUJiE/0/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xprv9ws7hGFQPbDgbCvNcYVfGeGK8UTSFmAho4iAXZf13yQVJmHuKHN9oMXCv7zsJn8Dcqvqy2iugFWAhDdUUX6r5VLNWkRTpxVoQJ6DbzY9eYa/0/*),older(2))))",
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xprv9ws7hGFQPbDga6QrETbFM7Gqc7m15UNoJ7KF5kkDhyZCBcANAqRMUCytQ4JM1nLSYvGyFjg6TvBEfNrN3znaFdb67jQoQ7z9kFnd4BUUJiE/1/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xprv9ws7hGFQPbDgbCvNcYVfGeGK8UTSFmAho4iAXZf13yQVJmHuKHN9oMXCv7zsJn8Dcqvqy2iugFWAhDdUUX6r5VLNWkRTpxVoQJ6DbzY9eYa/1/*),older(2))))",
+ },
+ {
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/0/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/0/*),older(2))))",
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/1/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/1/*),older(2))))"
+ },
+ {
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/0/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/0/*),older(2))))",
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/1/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/1/*),older(2))))"
+ },
+ RANGE,
+ {
+ {{"0020538436a60f2a638ea9e1e1342e9b93374aa7ec559ff0a805b3a185d4ba855d7f"},{"00203a588d107d604b6913201c7c1e1722f07a0f8fb3a382744f17b9ae5f6ccfcdd7"},{"0020d30fb375f7c491a208e77c7b5d0996ca14cf4a770c2ab5981f915c0e4565c74a"}},
+ {{"002072b5fc3a691c48fdbaf485f27e787b4094055d4b434c90c81ed1090f3d48733b"},{"0020a9ccdf4496e5d60db4704b27494d9d74f54a16c180ff954a43ce5e3aa465113a"},{"0020d17e21820a0069ca87049513eca763f08a74b586724441e7d76fc5142bcc327c"}},
+ },
+ OutputType::BECH32,
+ {
+ {{0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 0, 0}, {0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 0, 1}, {0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 0, 2}},
+ {{0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 1, 0}, {0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 1, 1}, {0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 1, 2}},
+ }
+ );
+ CheckUnparsable("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0;1>/<2;3>)", "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0;1>/<2;3>)", "pkh(): Multiple multipath key path specifiers found");
+ CheckUnparsable("pkh([deadbeef/<0;1>]xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/0)", "pkh([deadbeef/<0;1>]xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0)", "pkh(): Key path value \'<0;1>\' specifies multipath in a section where multipath is not allowed");
+ CheckUnparsable("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4>/*)})", "tr(xpub6B4sSbNr8XFYXqqKB7PeUemqgEaVtCLjgd5Lf2VYtezSHozC7ffCvVNCyu9TCgHntRQdimjV3tHbxmNfocxtuh6saNtZEw91gjXLRhQ3Yar/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub6AhFhZJJGt9YB8i85RfrJ8jT3T2FF5EejDCXqXfm1DAczFEXkk8HD3CXTg2TmKM8wTbSnSw3wPg5JuyLitUrpRmkjn2BQXyZnqJx16AGy94/0/0/<3;4>/*)})", "tr(): Multipath subscripts have mismatched lengths");
+ CheckUnparsable("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/<6;7;8;9>/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*)})", "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/<6;7;8;9>/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*)})", "tr(): Multipath subscripts have mismatched lengths");
+ CheckUnparsable("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/<6;7>/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*)})", "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/<6;7>/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*)})", "tr(): Multipath internal key mismatches multipath subscripts lengths");
+ CheckUnparsable("sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4>/*))", "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4>/*))", "multi(): Multipath derivation paths have mismatched lengths");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0>/*)", "wpkh(): Multipath key path specifiers must have at least two items");
+ CheckUnparsable("wsh(andor(pk(xprv9xGFvhWa1Koc8dmeEG5JXVfMaNBkioYscFGmn7yx8YnhFQYeydFfudxdKRzR5p7v1kip85ohB6eUQbPpAee9cFZu9M85G9X4ovPP4xw4xbM/0'/<0;1;2;3>/*),older(10000),pk(xprv9x9bas78RYwopceXTStT8vDuTiu6g1u91L6sG3DhHfDDXKPrYdcHcDuDw4Hv1kjZBWKoZnobUHrdoFxBPUMBTMruUs8HwzL8GxGA95MmZ7v/8/<0;1;2>/*)))", "wsh(andor(pk(xpub6BFcLD3TqhMuM7r7LHcJtdc68Q2F8GGiyUCNaWPZgtKg8CsoXAZvTSH7AhaCPnuuewjwzA2gbAm1y6uaDNNxa7JqTiL76cdioT5rxjgxWXF/0'/<0;1;2;3>/*),older(10000),pk(xpub6B8wzNe2FvW736izZURTW4Ae1kjb5UczNZ2U4RdJqzkCQ7j16AvYA2DhnL8Kb5FeWAZJ43NnGPdjpeSKvAeM8YGaqhCzpD743Uv6S87hfAt/8/<0;1;2>/*)))", "Miniscript: Multipath derivation paths have mismatched lengths");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<>/*)", "wpkh(): Multipath key path specifiers must have at least two items");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0/*)", "wpkh(): Key path value '<0' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/0>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0>/*)", "wpkh(): Key path value '0>' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0;>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0;>/*)", "wpkh(): Key path value '' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<;1>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<;1>/*)", "wpkh(): Key path value '' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0;1;>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0;1;>/*)", "wpkh(): Key path value '' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<1;1>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<1;1>/*)", "wpkh(): Duplicated key path value 1 in multipath specifier");
+
// Multisig constructions
Check("multi(1,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "multi(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "multi(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"512103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea23552ae"}}, std::nullopt, /*op_desc_id=*/uint256{"b147e25eb4a9d3da4e86ed8e970d817563ae2cb9c71a756b11cfdeb4dc11b70c"});
Check("sortedmulti(1,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "sortedmulti(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "sortedmulti(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"512103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea23552ae"}}, std::nullopt, /*op_desc_id=*/uint256{"62b59d1e32a62176ef7a17538f3b80c7d1afc53e5644eb753525bdb5d556486c"});
@@ -622,16 +953,16 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
// We can't sign for a script requiring a ripemd160 preimage without providing it.
Check("wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"002001549deda34cbc4a5982263191380f522695a2ddc2f99fc3a65c736264bd6cab"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"1fed6fbd0e408eb4bddfefa075289dc7061e7a3240c84f6ba5b9f294d96a21f4"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
// But if we provide it, we can.
- Check("wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"002001549deda34cbc4a5982263191380f522695a2ddc2f99fc3a65c736264bd6cab"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"1fed6fbd0e408eb4bddfefa075289dc7061e7a3240c84f6ba5b9f294d96a21f4"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{ParseHex("ff9aa1829c90d26e73301383f549e1497b7d6325"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"002001549deda34cbc4a5982263191380f522695a2ddc2f99fc3a65c736264bd6cab"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"1fed6fbd0e408eb4bddfefa075289dc7061e7a3240c84f6ba5b9f294d96a21f4"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{"ff9aa1829c90d26e73301383f549e1497b7d6325"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Same for sha256
Check("wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"002071f7283dbbb9a55ed43a54cda16ba0efd0f16dc48fe200f299e57bb5d7be8dd4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"a1809a65ba5ca2f09a06c114d4881eed95d1b62f38743cf126cf71b2dd411374"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
- Check("wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"002071f7283dbbb9a55ed43a54cda16ba0efd0f16dc48fe200f299e57bb5d7be8dd4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"a1809a65ba5ca2f09a06c114d4881eed95d1b62f38743cf126cf71b2dd411374"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{ParseHex("7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"002071f7283dbbb9a55ed43a54cda16ba0efd0f16dc48fe200f299e57bb5d7be8dd4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"a1809a65ba5ca2f09a06c114d4881eed95d1b62f38743cf126cf71b2dd411374"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{"7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Same for hash160
Check("wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"00209b9d5b45735d0e15df5b41d6594602d3de472262f7b75edc6cf5f3e3fa4e3ae4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"d7bdbc680503a585925eec72d11fc99396f51855d0a03fce53c90bed4c2e319f"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
- Check("wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"00209b9d5b45735d0e15df5b41d6594602d3de472262f7b75edc6cf5f3e3fa4e3ae4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"d7bdbc680503a585925eec72d11fc99396f51855d0a03fce53c90bed4c2e319f"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{ParseHex("292e2df59e3a22109200beed0cdc84b12e66793e"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"00209b9d5b45735d0e15df5b41d6594602d3de472262f7b75edc6cf5f3e3fa4e3ae4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"d7bdbc680503a585925eec72d11fc99396f51855d0a03fce53c90bed4c2e319f"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{"292e2df59e3a22109200beed0cdc84b12e66793e"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Same for hash256
Check("wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"0020cf62bf97baf977aec69cbc290c372899f913337a9093e8f066ab59b8657a365c"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"8412ba3ac20ba3a30f81442d10d32e0468fa52814960d04e959bf84a9b813b88"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
- Check("wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"0020cf62bf97baf977aec69cbc290c372899f913337a9093e8f066ab59b8657a365c"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"8412ba3ac20ba3a30f81442d10d32e0468fa52814960d04e959bf84a9b813b88"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{ParseHex("ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"0020cf62bf97baf977aec69cbc290c372899f913337a9093e8f066ab59b8657a365c"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"8412ba3ac20ba3a30f81442d10d32e0468fa52814960d04e959bf84a9b813b88"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{"ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Can have a Miniscript expression under tr() if it's alone.
Check("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,thresh(2,pk(L1NKM8dVA1h52mwDrmk1YreTWkAZZTu2vmKLpmLEbFRqGQYjHeEV),s:pk(Kz3iCBy3HNGP5CZWDsAMmnCMFNwqdDohudVN9fvkrN7tAkzKNtM7),adv:older(42)))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,thresh(2,pk(30a6069f344fb784a2b4c99540a91ee727c91e3a25ef6aae867d9c65b5f23529),s:pk(9918d400c1b8c3c478340a40117ced4054b6b58f48cdb3c89b836bdfee1f5766),adv:older(42)))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,thresh(2,pk(30a6069f344fb784a2b4c99540a91ee727c91e3a25ef6aae867d9c65b5f23529),s:pk(9918d400c1b8c3c478340a40117ced4054b6b58f48cdb3c89b836bdfee1f5766),adv:older(42)))", MISSING_PRIVKEYS | XONLY_KEYS | SIGNABLE, {{"512033982eebe204dc66508e4b19cfc31b5ffc6e1bfcbf6e5597dfc2521a52270795"}}, OutputType::BECH32M);
// Can have a pkh() expression alone as tr() script path (because pkh() is valid Miniscript).
@@ -643,7 +974,7 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
// Can sign for a Miniscript expression containing a hash challenge inside a Taproot tree. (Fails without the
// preimages and the sequence, passes with.)
Check("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(KykUPmR5967F4URzMUeCv9kNMU9CNRWycrPmx3ZvfkWoQLabbimL)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,KztMyyi1pXUtuZfJSB7JzVdmJMAz7wfGVFoSRUR5CVZxXxULXuGR)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", MISSING_PRIVKEYS | XONLY_KEYS | SIGNABLE | SIGNABLE_FAILS, {{"51209a3d79db56fbe3ba4d905d827b62e1ed31cd6df1198b8c759d589c0f4efc27bd"}}, OutputType::BECH32M);
- Check("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(KykUPmR5967F4URzMUeCv9kNMU9CNRWycrPmx3ZvfkWoQLabbimL)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,KztMyyi1pXUtuZfJSB7JzVdmJMAz7wfGVFoSRUR5CVZxXxULXuGR)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", MISSING_PRIVKEYS | XONLY_KEYS | SIGNABLE, {{"51209a3d79db56fbe3ba4d905d827b62e1ed31cd6df1198b8c759d589c0f4efc27bd"}}, OutputType::BECH32M, /*op_desc_id=*/{}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/42, /*preimages=*/{{ParseHex("ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(KykUPmR5967F4URzMUeCv9kNMU9CNRWycrPmx3ZvfkWoQLabbimL)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,KztMyyi1pXUtuZfJSB7JzVdmJMAz7wfGVFoSRUR5CVZxXxULXuGR)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", MISSING_PRIVKEYS | XONLY_KEYS | SIGNABLE, {{"51209a3d79db56fbe3ba4d905d827b62e1ed31cd6df1198b8c759d589c0f4efc27bd"}}, OutputType::BECH32M, /*op_desc_id=*/{}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/42, /*preimages=*/{{"ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Basic sh(pkh()) with key origin
CheckInferDescriptor("a9141a31ad23bf49c247dd531a623c2ef57da3c400c587", "sh(pkh([deadbeef/0h/0h/0]03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", {"76a9149a1c78a507689f6f54b847ad1cef1e614ee23f1e88ac"}, {{"03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd", "deadbeef/0h/0h/0"}});
diff --git a/src/test/fuzz/CMakeLists.txt b/src/test/fuzz/CMakeLists.txt
new file mode 100644
index 0000000000..1c7b0d5c25
--- /dev/null
+++ b/src/test/fuzz/CMakeLists.txt
@@ -0,0 +1,147 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_subdirectory(util)
+
+add_executable(fuzz
+ addition_overflow.cpp
+ addrman.cpp
+ asmap.cpp
+ asmap_direct.cpp
+ autofile.cpp
+ banman.cpp
+ base_encode_decode.cpp
+ bech32.cpp
+ bip324.cpp
+ bitdeque.cpp
+ bitset.cpp
+ block.cpp
+ block_header.cpp
+ block_index.cpp
+ blockfilter.cpp
+ bloom_filter.cpp
+ buffered_file.cpp
+ chain.cpp
+ checkqueue.cpp
+ cluster_linearize.cpp
+ coins_view.cpp
+ coinscache_sim.cpp
+ connman.cpp
+ crypto.cpp
+ crypto_aes256.cpp
+ crypto_aes256cbc.cpp
+ crypto_chacha20.cpp
+ crypto_chacha20poly1305.cpp
+ crypto_common.cpp
+ crypto_diff_fuzz_chacha20.cpp
+ crypto_hkdf_hmac_sha256_l32.cpp
+ crypto_poly1305.cpp
+ cuckoocache.cpp
+ decode_tx.cpp
+ descriptor_parse.cpp
+ deserialize.cpp
+ eval_script.cpp
+ feefrac.cpp
+ fee_rate.cpp
+ feeratediagram.cpp
+ fees.cpp
+ flatfile.cpp
+ float.cpp
+ golomb_rice.cpp
+ headerssync.cpp
+ hex.cpp
+ http_request.cpp
+ i2p.cpp
+ integer.cpp
+ key.cpp
+ key_io.cpp
+ kitchen_sink.cpp
+ load_external_block_file.cpp
+ locale.cpp
+ merkleblock.cpp
+ message.cpp
+ miniscript.cpp
+ minisketch.cpp
+ mini_miner.cpp
+ muhash.cpp
+ multiplication_overflow.cpp
+ net.cpp
+ net_permissions.cpp
+ netaddress.cpp
+ netbase_dns_lookup.cpp
+ node_eviction.cpp
+ p2p_handshake.cpp
+ p2p_headers_presync.cpp
+ p2p_transport_serialization.cpp
+ package_eval.cpp
+ parse_hd_keypath.cpp
+ parse_numbers.cpp
+ parse_script.cpp
+ parse_univalue.cpp
+ partially_downloaded_block.cpp
+ policy_estimator.cpp
+ policy_estimator_io.cpp
+ poolresource.cpp
+ pow.cpp
+ prevector.cpp
+ primitives_transaction.cpp
+ process_message.cpp
+ process_messages.cpp
+ protocol.cpp
+ psbt.cpp
+ random.cpp
+ rbf.cpp
+ rolling_bloom_filter.cpp
+ rpc.cpp
+ script.cpp
+ script_assets_test_minimizer.cpp
+ script_descriptor_cache.cpp
+ script_flags.cpp
+ script_format.cpp
+ script_interpreter.cpp
+ script_ops.cpp
+ script_parsing.cpp
+ script_sigcache.cpp
+ script_sign.cpp
+ scriptnum_ops.cpp
+ secp256k1_ec_seckey_import_export_der.cpp
+ secp256k1_ecdsa_signature_parse_der_lax.cpp
+ signature_checker.cpp
+ signet.cpp
+ socks5.cpp
+ span.cpp
+ string.cpp
+ strprintf.cpp
+ system.cpp
+ timeoffsets.cpp
+ torcontrol.cpp
+ transaction.cpp
+ tx_in.cpp
+ tx_out.cpp
+ tx_pool.cpp
+ txorphan.cpp
+ txrequest.cpp
+ utxo_snapshot.cpp
+ utxo_total_supply.cpp
+ validation_load_mempool.cpp
+ vecdeque.cpp
+ versionbits.cpp
+)
+target_link_libraries(fuzz
+ core_interface
+ test_fuzz
+ bitcoin_cli
+ bitcoin_common
+ bitcoin_util
+ minisketch
+ leveldb
+ univalue
+ secp256k1
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:libevent::libevent>
+)
+
+if(ENABLE_WALLET)
+ add_subdirectory(${PROJECT_SOURCE_DIR}/src/wallet/test/fuzz wallet)
+endif()
diff --git a/src/test/fuzz/addrman.cpp b/src/test/fuzz/addrman.cpp
index dbec2bc858..593086af21 100644
--- a/src/test/fuzz/addrman.cpp
+++ b/src/test/fuzz/addrman.cpp
@@ -250,19 +250,30 @@ FUZZ_TARGET(addrman, .init = initialize_addrman)
LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
addresses.push_back(ConsumeAddress(fuzzed_data_provider));
}
- addr_man.Add(addresses, ConsumeNetAddr(fuzzed_data_provider), std::chrono::seconds{ConsumeTime(fuzzed_data_provider, 0, 100000000)});
+ auto net_addr = ConsumeNetAddr(fuzzed_data_provider);
+ auto time_penalty = std::chrono::seconds{ConsumeTime(fuzzed_data_provider, 0, 100000000)};
+ addr_man.Add(addresses, net_addr, time_penalty);
},
[&] {
- addr_man.Good(ConsumeService(fuzzed_data_provider), NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}});
+ auto addr = ConsumeService(fuzzed_data_provider);
+ auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}};
+ addr_man.Good(addr, time);
},
[&] {
- addr_man.Attempt(ConsumeService(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool(), NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}});
+ auto addr = ConsumeService(fuzzed_data_provider);
+ auto count_failure = fuzzed_data_provider.ConsumeBool();
+ auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}};
+ addr_man.Attempt(addr, count_failure, time);
},
[&] {
- addr_man.Connected(ConsumeService(fuzzed_data_provider), NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}});
+ auto addr = ConsumeService(fuzzed_data_provider);
+ auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}};
+ addr_man.Connected(addr, time);
},
[&] {
- addr_man.SetServices(ConsumeService(fuzzed_data_provider), ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS));
+ auto addr = ConsumeService(fuzzed_data_provider);
+ auto n_services = ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS);
+ addr_man.SetServices(addr, n_services);
});
}
const AddrMan& const_addr_man{addr_man};
@@ -270,12 +281,19 @@ FUZZ_TARGET(addrman, .init = initialize_addrman)
if (fuzzed_data_provider.ConsumeBool()) {
network = fuzzed_data_provider.PickValueInArray(ALL_NETWORKS);
}
- (void)const_addr_man.GetAddr(
- /*max_addresses=*/fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096),
- /*max_pct=*/fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096),
- network,
- /*filtered=*/fuzzed_data_provider.ConsumeBool());
- (void)const_addr_man.Select(fuzzed_data_provider.ConsumeBool(), network);
+ auto max_addresses = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096);
+ auto max_pct = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096);
+ auto filtered = fuzzed_data_provider.ConsumeBool();
+ (void)const_addr_man.GetAddr(max_addresses, max_pct, network, filtered);
+
+ std::unordered_set<Network> nets;
+ for (const auto& net : ALL_NETWORKS) {
+ if (fuzzed_data_provider.ConsumeBool()) {
+ nets.insert(net);
+ }
+ }
+ (void)const_addr_man.Select(fuzzed_data_provider.ConsumeBool(), nets);
+
std::optional<bool> in_new;
if (fuzzed_data_provider.ConsumeBool()) {
in_new = fuzzed_data_provider.ConsumeBool();
diff --git a/src/test/fuzz/banman.cpp b/src/test/fuzz/banman.cpp
index b26151f63c..4165cc6b2c 100644
--- a/src/test/fuzz/banman.cpp
+++ b/src/test/fuzz/banman.cpp
@@ -78,7 +78,9 @@ FUZZ_TARGET(banman, .init = initialize_banman)
contains_invalid = true;
}
}
- ban_man.Ban(net_addr, ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool());
+ auto ban_time_offset = ConsumeBanTimeOffset(fuzzed_data_provider);
+ auto since_unix_epoch = fuzzed_data_provider.ConsumeBool();
+ ban_man.Ban(net_addr, ban_time_offset, since_unix_epoch);
},
[&] {
CSubNet subnet{ConsumeSubNet(fuzzed_data_provider)};
@@ -86,7 +88,9 @@ FUZZ_TARGET(banman, .init = initialize_banman)
if (!subnet.IsValid()) {
contains_invalid = true;
}
- ban_man.Ban(subnet, ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool());
+ auto ban_time_offset = ConsumeBanTimeOffset(fuzzed_data_provider);
+ auto since_unix_epoch = fuzzed_data_provider.ConsumeBool();
+ ban_man.Ban(subnet, ban_time_offset, since_unix_epoch);
},
[&] {
ban_man.ClearBanned();
diff --git a/src/test/fuzz/bip324.cpp b/src/test/fuzz/bip324.cpp
index 9892e7a81c..f1fa15d8a3 100644
--- a/src/test/fuzz/bip324.cpp
+++ b/src/test/fuzz/bip324.cpp
@@ -10,6 +10,7 @@
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
+#include <algorithm>
#include <cstdint>
#include <vector>
@@ -59,9 +60,9 @@ FUZZ_TARGET(bip324_cipher_roundtrip, .init=Initialize)
InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>());
// Compare session IDs and garbage terminators.
- assert(initiator.GetSessionID() == responder.GetSessionID());
- assert(initiator.GetSendGarbageTerminator() == responder.GetReceiveGarbageTerminator());
- assert(initiator.GetReceiveGarbageTerminator() == responder.GetSendGarbageTerminator());
+ assert(std::ranges::equal(initiator.GetSessionID(), responder.GetSessionID()));
+ assert(std::ranges::equal(initiator.GetSendGarbageTerminator(), responder.GetReceiveGarbageTerminator()));
+ assert(std::ranges::equal(initiator.GetReceiveGarbageTerminator(), responder.GetSendGarbageTerminator()));
LIMITED_WHILE(provider.remaining_bytes(), 1000) {
// Mode:
diff --git a/src/test/fuzz/buffered_file.cpp b/src/test/fuzz/buffered_file.cpp
index e30c19b265..a6a042a25c 100644
--- a/src/test/fuzz/buffered_file.cpp
+++ b/src/test/fuzz/buffered_file.cpp
@@ -25,7 +25,9 @@ FUZZ_TARGET(buffered_file)
ConsumeRandomLengthByteVector<std::byte>(fuzzed_data_provider),
};
try {
- opt_buffered_file.emplace(fuzzed_file, fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096));
+ auto n_buf_size = fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096);
+ auto n_rewind_in = fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096);
+ opt_buffered_file.emplace(fuzzed_file, n_buf_size, n_rewind_in);
} catch (const std::ios_base::failure&) {
}
if (opt_buffered_file && !fuzzed_file.IsNull()) {
diff --git a/src/test/fuzz/cluster_linearize.cpp b/src/test/fuzz/cluster_linearize.cpp
index 2dfdfbb41d..d91f85d867 100644
--- a/src/test/fuzz/cluster_linearize.cpp
+++ b/src/test/fuzz/cluster_linearize.cpp
@@ -165,6 +165,23 @@ std::pair<std::vector<ClusterIndex>, bool> SimpleLinearize(const DepGraph<SetTyp
return {std::move(linearization), optimal};
}
+/** Stitch connected components together in a DepGraph, guaranteeing its corresponding cluster is connected. */
+template<typename BS>
+void MakeConnected(DepGraph<BS>& depgraph)
+{
+ auto todo = BS::Fill(depgraph.TxCount());
+ auto comp = depgraph.FindConnectedComponent(todo);
+ Assume(depgraph.IsConnected(comp));
+ todo -= comp;
+ while (todo.Any()) {
+ auto nextcomp = depgraph.FindConnectedComponent(todo);
+ Assume(depgraph.IsConnected(nextcomp));
+ depgraph.AddDependency(comp.Last(), nextcomp.First());
+ todo -= nextcomp;
+ comp = nextcomp;
+ }
+}
+
/** Given a dependency graph, and a todo set, read a topological subset of todo from reader. */
template<typename SetType>
SetType ReadTopologicalSet(const DepGraph<SetType>& depgraph, const SetType& todo, SpanReader& reader)
@@ -369,6 +386,20 @@ FUZZ_TARGET(clusterlin_components)
assert(depgraph.FindConnectedComponent(todo).None());
}
+FUZZ_TARGET(clusterlin_make_connected)
+{
+ // Verify that MakeConnected makes graphs connected.
+
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+ MakeConnected(depgraph);
+ SanityCheck(depgraph);
+ assert(depgraph.IsConnected());
+}
+
FUZZ_TARGET(clusterlin_chunking)
{
// Verify the correctness of the ChunkLinearization function.
@@ -398,7 +429,7 @@ FUZZ_TARGET(clusterlin_chunking)
SetInfo<TestBitSet> accumulator, best;
for (ClusterIndex idx : linearization) {
if (todo[idx]) {
- accumulator |= SetInfo(depgraph, idx);
+ accumulator.Set(depgraph, idx);
if (best.feerate.IsEmpty() || accumulator.feerate >> best.feerate) {
best = accumulator;
}
@@ -427,6 +458,7 @@ FUZZ_TARGET(clusterlin_ancestor_finder)
while (todo.Any()) {
// Call the ancestor finder's FindCandidateSet for what remains of the graph.
assert(!anc_finder.AllDone());
+ assert(todo.Count() == anc_finder.NumRemaining());
auto best_anc = anc_finder.FindCandidateSet();
// Sanity check the result.
assert(best_anc.transactions.Any());
@@ -458,6 +490,7 @@ FUZZ_TARGET(clusterlin_ancestor_finder)
anc_finder.MarkDone(del_set);
}
assert(anc_finder.AllDone());
+ assert(anc_finder.NumRemaining() == 0);
}
static constexpr auto MAX_SIMPLE_ITERATIONS = 300000;
@@ -468,13 +501,17 @@ FUZZ_TARGET(clusterlin_search_finder)
// and comparing with the results from SimpleCandidateFinder, ExhaustiveCandidateFinder, and
// AncestorCandidateFinder.
- // Retrieve an RNG seed and a depgraph from the fuzz input.
+ // Retrieve an RNG seed, a depgraph, and whether to make it connected, from the fuzz input.
SpanReader reader(buffer);
DepGraph<TestBitSet> depgraph;
uint64_t rng_seed{0};
+ uint8_t make_connected{1};
try {
- reader >> Using<DepGraphFormatter>(depgraph) >> rng_seed;
+ reader >> Using<DepGraphFormatter>(depgraph) >> rng_seed >> make_connected;
} catch (const std::ios_base::failure&) {}
+ // The most complicated graphs are connected ones (other ones just split up). Optionally force
+ // the graph to be connected.
+ if (make_connected) MakeConnected(depgraph);
// Instantiate ALL the candidate finders.
SearchCandidateFinder src_finder(depgraph, rng_seed);
@@ -488,6 +525,7 @@ FUZZ_TARGET(clusterlin_search_finder)
assert(!smp_finder.AllDone());
assert(!exh_finder.AllDone());
assert(!anc_finder.AllDone());
+ assert(anc_finder.NumRemaining() == todo.Count());
// For each iteration, read an iteration count limit from the fuzz input.
uint64_t max_iterations = 1;
@@ -513,9 +551,17 @@ FUZZ_TARGET(clusterlin_search_finder)
assert(found.transactions.IsSupersetOf(depgraph.Ancestors(i) & todo));
}
- // At most 2^N-1 iterations can be required: the number of non-empty subsets a graph with N
- // transactions has.
- assert(iterations_done <= ((uint64_t{1} << todo.Count()) - 1));
+ // At most 2^(N-1) iterations can be required: the maximum number of non-empty topological
+ // subsets a (connected) cluster with N transactions can have. Even when the cluster is no
+ // longer connected after removing certain transactions, this holds, because the connected
+ // components are searched separately.
+ assert(iterations_done <= (uint64_t{1} << (todo.Count() - 1)));
+ // Additionally, test that no more than sqrt(2^N)+1 iterations are required. This is just
+ // an empirical bound that seems to hold, without proof. Still, add a test for it so we
+ // can learn about counterexamples if they exist.
+ if (iterations_done >= 1 && todo.Count() <= 63) {
+ Assume((iterations_done - 1) * (iterations_done - 1) <= uint64_t{1} << todo.Count());
+ }
// Perform quality checks only if SearchCandidateFinder claims an optimal result.
if (iterations_done < max_iterations) {
@@ -562,6 +608,7 @@ FUZZ_TARGET(clusterlin_search_finder)
assert(smp_finder.AllDone());
assert(exh_finder.AllDone());
assert(anc_finder.AllDone());
+ assert(anc_finder.NumRemaining() == 0);
}
FUZZ_TARGET(clusterlin_linearization_chunking)
@@ -621,7 +668,7 @@ FUZZ_TARGET(clusterlin_linearization_chunking)
SetInfo<TestBitSet> accumulator, best;
for (auto j : linearization) {
if (todo[j] && !combined[j]) {
- accumulator |= SetInfo(depgraph, j);
+ accumulator.Set(depgraph, j);
if (best.feerate.IsEmpty() || accumulator.feerate > best.feerate) {
best = accumulator;
}
@@ -685,14 +732,19 @@ FUZZ_TARGET(clusterlin_linearize)
{
// Verify the behavior of Linearize().
- // Retrieve an RNG seed, an iteration count, and a depgraph from the fuzz input.
+ // Retrieve an RNG seed, an iteration count, a depgraph, and whether to make it connected from
+ // the fuzz input.
SpanReader reader(buffer);
DepGraph<TestBitSet> depgraph;
uint64_t rng_seed{0};
uint64_t iter_count{0};
+ uint8_t make_connected{1};
try {
- reader >> VARINT(iter_count) >> Using<DepGraphFormatter>(depgraph) >> rng_seed;
+ reader >> VARINT(iter_count) >> Using<DepGraphFormatter>(depgraph) >> rng_seed >> make_connected;
} catch (const std::ios_base::failure&) {}
+ // The most complicated graphs are connected ones (other ones just split up). Optionally force
+ // the graph to be connected.
+ if (make_connected) MakeConnected(depgraph);
// Optionally construct an old linearization for it.
std::vector<ClusterIndex> old_linearization;
@@ -721,12 +773,24 @@ FUZZ_TARGET(clusterlin_linearize)
}
// If the iteration count is sufficiently high, an optimal linearization must be found.
- // Each linearization step can use up to 2^k iterations, with steps k=1..n. That sum is
- // 2 * (2^n - 1)
+ // Each linearization step can use up to 2^(k-1) iterations, with steps k=1..n. That sum is
+ // 2^n - 1.
const uint64_t n = depgraph.TxCount();
- if (n <= 18 && iter_count > 2U * ((uint64_t{1} << n) - 1U)) {
+ if (n <= 19 && iter_count > (uint64_t{1} << n)) {
assert(optimal);
}
+ // Additionally, if the assumption of sqrt(2^k)+1 iterations per step holds, plus ceil(k/4)
+ // start-up cost per step, plus ceil(n^2/64) start-up cost overall, we can compute the upper
+ // bound for a whole linearization (summing for k=1..n) using the Python expression
+ // [sum((k+3)//4 + int(math.sqrt(2**k)) + 1 for k in range(1, n + 1)) + (n**2 + 63) // 64 for n in range(0, 35)]:
+ static constexpr uint64_t MAX_OPTIMAL_ITERS[] = {
+ 0, 4, 8, 12, 18, 26, 37, 51, 70, 97, 133, 182, 251, 346, 480, 666, 927, 1296, 1815, 2545,
+ 3576, 5031, 7087, 9991, 14094, 19895, 28096, 39690, 56083, 79263, 112041, 158391, 223936,
+ 316629, 447712
+ };
+ if (n < std::size(MAX_OPTIMAL_ITERS) && iter_count >= MAX_OPTIMAL_ITERS[n]) {
+ Assume(optimal);
+ }
// If Linearize claims optimal result, run quality tests.
if (optimal) {
diff --git a/src/test/fuzz/connman.cpp b/src/test/fuzz/connman.cpp
index 8f5f6a6071..beefc9d82e 100644
--- a/src/test/fuzz/connman.cpp
+++ b/src/test/fuzz/connman.cpp
@@ -91,17 +91,15 @@ FUZZ_TARGET(connman, .init = initialize_connman)
(void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
},
[&] {
- (void)connman.GetAddresses(
- /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
- /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
- /*network=*/std::nullopt,
- /*filtered=*/fuzzed_data_provider.ConsumeBool());
+ auto max_addresses = fuzzed_data_provider.ConsumeIntegral<size_t>();
+ auto max_pct = fuzzed_data_provider.ConsumeIntegral<size_t>();
+ auto filtered = fuzzed_data_provider.ConsumeBool();
+ (void)connman.GetAddresses(max_addresses, max_pct, /*network=*/std::nullopt, filtered);
},
[&] {
- (void)connman.GetAddresses(
- /*requestor=*/random_node,
- /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
- /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
+ auto max_addresses = fuzzed_data_provider.ConsumeIntegral<size_t>();
+ auto max_pct = fuzzed_data_provider.ConsumeIntegral<size_t>();
+ (void)connman.GetAddresses(/*requestor=*/random_node, max_addresses, max_pct);
},
[&] {
(void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
diff --git a/src/test/fuzz/crypto.cpp b/src/test/fuzz/crypto.cpp
index ca8c1cd033..aa478277e3 100644
--- a/src/test/fuzz/crypto.cpp
+++ b/src/test/fuzz/crypto.cpp
@@ -22,7 +22,9 @@ FUZZ_TARGET(crypto)
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
std::vector<uint8_t> data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
if (data.empty()) {
- data.resize(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096), fuzzed_data_provider.ConsumeIntegral<uint8_t>());
+ auto new_size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096);
+ auto x = fuzzed_data_provider.ConsumeIntegral<uint8_t>();
+ data.resize(new_size, x);
}
CHash160 hash160;
@@ -44,7 +46,9 @@ FUZZ_TARGET(crypto)
if (fuzzed_data_provider.ConsumeBool()) {
data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
if (data.empty()) {
- data.resize(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096), fuzzed_data_provider.ConsumeIntegral<uint8_t>());
+ auto new_size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096);
+ auto x = fuzzed_data_provider.ConsumeIntegral<uint8_t>();
+ data.resize(new_size, x);
}
}
diff --git a/src/test/fuzz/crypto_chacha20.cpp b/src/test/fuzz/crypto_chacha20.cpp
index d115a2b7e1..fe47f18923 100644
--- a/src/test/fuzz/crypto_chacha20.cpp
+++ b/src/test/fuzz/crypto_chacha20.cpp
@@ -28,11 +28,10 @@ FUZZ_TARGET(crypto_chacha20)
chacha20.SetKey(key);
},
[&] {
- chacha20.Seek(
- {
- fuzzed_data_provider.ConsumeIntegral<uint32_t>(),
- fuzzed_data_provider.ConsumeIntegral<uint64_t>()
- }, fuzzed_data_provider.ConsumeIntegral<uint32_t>());
+ ChaCha20::Nonce96 nonce{
+ fuzzed_data_provider.ConsumeIntegral<uint32_t>(),
+ fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
+ chacha20.Seek(nonce, fuzzed_data_provider.ConsumeIntegral<uint32_t>());
},
[&] {
std::vector<uint8_t> output(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
diff --git a/src/test/fuzz/crypto_chacha20poly1305.cpp b/src/test/fuzz/crypto_chacha20poly1305.cpp
index 2b39a06094..5e62e6f3df 100644
--- a/src/test/fuzz/crypto_chacha20poly1305.cpp
+++ b/src/test/fuzz/crypto_chacha20poly1305.cpp
@@ -130,7 +130,7 @@ FUZZ_TARGET(crypto_fschacha20poly1305)
// data).
InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>());
- LIMITED_WHILE(provider.ConsumeBool(), 10000)
+ LIMITED_WHILE(provider.ConsumeBool(), 100)
{
// Mode:
// - Bit 0: whether to use single-plain Encrypt/Decrypt; otherwise use a split at prefix.
diff --git a/src/test/fuzz/cuckoocache.cpp b/src/test/fuzz/cuckoocache.cpp
index 50a71ee03f..f8a5bde3e6 100644
--- a/src/test/fuzz/cuckoocache.cpp
+++ b/src/test/fuzz/cuckoocache.cpp
@@ -41,7 +41,9 @@ FUZZ_TARGET(cuckoocache)
if (fuzzed_data_provider.ConsumeBool()) {
cuckoo_cache.insert(fuzzed_data_provider.ConsumeBool());
} else {
- cuckoo_cache.contains(fuzzed_data_provider.ConsumeBool(), fuzzed_data_provider.ConsumeBool());
+ auto e = fuzzed_data_provider.ConsumeBool();
+ auto erase = fuzzed_data_provider.ConsumeBool();
+ cuckoo_cache.contains(e, erase);
}
}
fuzzed_data_provider_ptr = nullptr;
diff --git a/src/test/fuzz/descriptor_parse.cpp b/src/test/fuzz/descriptor_parse.cpp
index 6a3f4d6dfe..765daa3db7 100644
--- a/src/test/fuzz/descriptor_parse.cpp
+++ b/src/test/fuzz/descriptor_parse.cpp
@@ -15,14 +15,24 @@
MockedDescriptorConverter MOCKED_DESC_CONVERTER;
/** Test a successfully parsed descriptor. */
-static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_provider, std::string& dummy)
+static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_provider, std::string& dummy, std::optional<bool>& is_ranged, std::optional<bool>& is_solvable)
{
// Trivial helpers.
(void)desc.IsRange();
- const bool is_solvable{desc.IsSolvable()};
(void)desc.IsSingleType();
(void)desc.GetOutputType();
+ if (is_ranged.has_value()) {
+ assert(desc.IsRange() == *is_ranged);
+ } else {
+ is_ranged = desc.IsRange();
+ }
+ if (is_solvable.has_value()) {
+ assert(desc.IsSolvable() == *is_solvable);
+ } else {
+ is_solvable = desc.IsSolvable();
+ }
+
// Serialization to string representation.
(void)desc.ToString();
(void)desc.ToPrivateString(sig_provider, dummy);
@@ -48,7 +58,7 @@ static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_prov
const auto max_sat_nonmaxsig{desc.MaxSatisfactionWeight(true)};
const auto max_elems{desc.MaxSatisfactionElems()};
// We must be able to estimate the max satisfaction size for any solvable descriptor (but combo).
- const bool is_nontop_or_nonsolvable{!is_solvable || !desc.GetOutputType()};
+ const bool is_nontop_or_nonsolvable{!*is_solvable || !desc.GetOutputType()};
const bool is_input_size_info_set{max_sat_maxsig && max_sat_nonmaxsig && max_elems};
assert(is_input_size_info_set || is_nontop_or_nonsolvable);
}
@@ -85,7 +95,12 @@ FUZZ_TARGET(mocked_descriptor_parse, .init = initialize_mocked_descriptor_parse)
FlatSigningProvider signing_provider;
std::string error;
const auto desc = Parse(*descriptor, signing_provider, error);
- if (desc) TestDescriptor(*desc, signing_provider, error);
+ std::optional<bool> is_ranged;
+ std::optional<bool> is_solvable;
+ for (const auto& d : desc) {
+ assert(d);
+ TestDescriptor(*d, signing_provider, error, is_ranged, is_solvable);
+ }
}
}
@@ -101,6 +116,11 @@ FUZZ_TARGET(descriptor_parse, .init = initialize_descriptor_parse)
std::string error;
for (const bool require_checksum : {true, false}) {
const auto desc = Parse(descriptor, signing_provider, error, require_checksum);
- if (desc) TestDescriptor(*desc, signing_provider, error);
+ std::optional<bool> is_ranged;
+ std::optional<bool> is_solvable;
+ for (const auto& d : desc) {
+ assert(d);
+ TestDescriptor(*d, signing_provider, error, is_ranged, is_solvable);
+ }
}
}
diff --git a/src/test/fuzz/fuzz.cpp b/src/test/fuzz/fuzz.cpp
index 96283a3e15..bba2dd8e3a 100644
--- a/src/test/fuzz/fuzz.cpp
+++ b/src/test/fuzz/fuzz.cpp
@@ -49,7 +49,7 @@ static std::vector<const char*> g_args;
static void SetArgs(int argc, char** argv) {
for (int i = 1; i < argc; ++i) {
// Only take into account arguments that start with `--`. The others are for the fuzz engine:
- // `fuzz -runs=1 fuzz_seed_corpus/address_deserialize_v2 --checkaddrman=5`
+ // `fuzz -runs=1 fuzz_corpora/address_deserialize_v2 --checkaddrman=5`
if (strlen(argv[i]) > 2 && argv[i][0] == '-' && argv[i][1] == '-') {
g_args.push_back(argv[i]);
}
@@ -106,7 +106,7 @@ void initialize()
// randomness during the fuzz test, except:
// - GetStrongRandBytes(), which is used for the creation of private key material.
// - Creating a BasicTestingSetup or derived class will switch to a random seed.
- SeedRandomForTest(SeedRand::ZEROS);
+ SeedRandomStateForTest(SeedRand::ZEROS);
// Terminate immediately if a fuzzing harness ever tries to create a socket.
// Individual tests can override this by pointing CreateSock to a mocked alternative.
diff --git a/src/test/fuzz/hex.cpp b/src/test/fuzz/hex.cpp
index ebe30c3c1a..3dcf1ed3d5 100644
--- a/src/test/fuzz/hex.cpp
+++ b/src/test/fuzz/hex.cpp
@@ -12,6 +12,7 @@
#include <util/strencodings.h>
#include <util/transaction_identifier.h>
+#include <algorithm>
#include <cassert>
#include <cstdint>
#include <string>
@@ -22,18 +23,26 @@ FUZZ_TARGET(hex)
const std::string random_hex_string(buffer.begin(), buffer.end());
const std::vector<unsigned char> data = ParseHex(random_hex_string);
const std::vector<std::byte> bytes{ParseHex<std::byte>(random_hex_string)};
- assert(AsBytes(Span{data}) == Span{bytes});
+ assert(std::ranges::equal(AsBytes(Span{data}), bytes));
const std::string hex_data = HexStr(data);
if (IsHex(random_hex_string)) {
assert(ToLower(random_hex_string) == hex_data);
}
- (void)IsHexNumber(random_hex_string);
if (uint256::FromHex(random_hex_string)) {
assert(random_hex_string.length() == 64);
assert(Txid::FromHex(random_hex_string));
assert(Wtxid::FromHex(random_hex_string));
+ assert(uint256::FromUserHex(random_hex_string));
+ }
+ if (const auto result{uint256::FromUserHex(random_hex_string)}) {
+ const auto result_string{result->ToString()}; // ToString() returns a fixed-length string without "0x" prefix
+ assert(result_string.length() == 64);
+ assert(IsHex(result_string));
+ assert(TryParseHex(result_string));
+ assert(Txid::FromHex(result_string));
+ assert(Wtxid::FromHex(result_string));
+ assert(uint256::FromHex(result_string));
}
- (void)uint256S(random_hex_string);
try {
(void)HexToPubKey(random_hex_string);
} catch (const UniValue&) {
diff --git a/src/test/fuzz/integer.cpp b/src/test/fuzz/integer.cpp
index 02c6796d11..b9e3154106 100644
--- a/src/test/fuzz/integer.cpp
+++ b/src/test/fuzz/integer.cpp
@@ -69,7 +69,7 @@ FUZZ_TARGET(integer, .init = initialize_integer)
const bool b = fuzzed_data_provider.ConsumeBool();
const Consensus::Params& consensus_params = Params().GetConsensus();
- (void)CheckProofOfWork(u256, u32, consensus_params);
+ (void)CheckProofOfWorkImpl(u256, u32, consensus_params);
if (u64 <= MAX_MONEY) {
const uint64_t compressed_money_amount = CompressAmount(u64);
assert(u64 == DecompressAmount(compressed_money_amount));
@@ -140,7 +140,7 @@ FUZZ_TARGET(integer, .init = initialize_integer)
const arith_uint256 au256 = UintToArith256(u256);
assert(ArithToUint256(au256) == u256);
- assert(uint256S(au256.GetHex()) == u256);
+ assert(uint256::FromHex(au256.GetHex()).value() == u256);
(void)au256.bits();
(void)au256.GetCompact(/* fNegative= */ false);
(void)au256.GetCompact(/* fNegative= */ true);
diff --git a/src/test/fuzz/message.cpp b/src/test/fuzz/message.cpp
index 6763206f72..99bbad6591 100644
--- a/src/test/fuzz/message.cpp
+++ b/src/test/fuzz/message.cpp
@@ -39,7 +39,9 @@ FUZZ_TARGET(message, .init = initialize_message)
}
{
(void)MessageHash(random_message);
- (void)MessageVerify(fuzzed_data_provider.ConsumeRandomLengthString(1024), fuzzed_data_provider.ConsumeRandomLengthString(1024), random_message);
+ auto address = fuzzed_data_provider.ConsumeRandomLengthString(1024);
+ auto signature = fuzzed_data_provider.ConsumeRandomLengthString(1024);
+ (void)MessageVerify(address, signature, random_message);
(void)SigningResultString(fuzzed_data_provider.PickValueInArray({SigningResult::OK, SigningResult::PRIVATE_KEY_NOT_AVAILABLE, SigningResult::SIGNING_FAILED}));
}
}
diff --git a/src/test/fuzz/miniscript.cpp b/src/test/fuzz/miniscript.cpp
index 1f9ed9a064..5b9e168856 100644
--- a/src/test/fuzz/miniscript.cpp
+++ b/src/test/fuzz/miniscript.cpp
@@ -13,6 +13,8 @@
#include <test/fuzz/util.h>
#include <util/strencodings.h>
+#include <algorithm>
+
namespace {
using Fragment = miniscript::Fragment;
@@ -293,7 +295,7 @@ const struct CheckerContext: BaseSignatureChecker {
XOnlyPubKey pk{pubkey};
auto it = TEST_DATA.schnorr_sigs.find(pk);
if (it == TEST_DATA.schnorr_sigs.end()) return false;
- return it->second.first == sig;
+ return std::ranges::equal(it->second.first, sig);
}
bool CheckLockTime(const CScriptNum& nLockTime) const override { return nLockTime.GetInt64() & 1; }
bool CheckSequence(const CScriptNum& nSequence) const override { return nSequence.GetInt64() & 1; }
diff --git a/src/test/fuzz/p2p_handshake.cpp b/src/test/fuzz/p2p_handshake.cpp
index 217655ab70..6c1ed11d45 100644
--- a/src/test/fuzz/p2p_handshake.cpp
+++ b/src/test/fuzz/p2p_handshake.cpp
@@ -74,7 +74,7 @@ FUZZ_TARGET(p2p_handshake, .init = ::initialize)
{
CNode& connection = *PickValue(fuzzed_data_provider, peers);
if (connection.fDisconnect || connection.fSuccessfullyConnected) {
- // Skip if the the connection was disconnected or if the version
+ // Skip if the connection was disconnected or if the version
// handshake was already completed.
continue;
}
diff --git a/src/test/fuzz/p2p_headers_presync.cpp b/src/test/fuzz/p2p_headers_presync.cpp
new file mode 100644
index 0000000000..b86d03442d
--- /dev/null
+++ b/src/test/fuzz/p2p_headers_presync.cpp
@@ -0,0 +1,200 @@
+#include <blockencodings.h>
+#include <net.h>
+#include <net_processing.h>
+#include <netmessagemaker.h>
+#include <node/peerman_args.h>
+#include <pow.h>
+#include <test/fuzz/FuzzedDataProvider.h>
+#include <test/fuzz/fuzz.h>
+#include <test/fuzz/util.h>
+#include <test/util/net.h>
+#include <test/util/script.h>
+#include <test/util/setup_common.h>
+#include <validation.h>
+
+namespace {
+constexpr uint32_t FUZZ_MAX_HEADERS_RESULTS{16};
+
+class HeadersSyncSetup : public TestingSetup
+{
+ std::vector<CNode*> m_connections;
+
+public:
+ HeadersSyncSetup(const ChainType chain_type = ChainType::MAIN,
+ TestOpts opts = {})
+ : TestingSetup(chain_type, opts)
+ {
+ PeerManager::Options peerman_opts;
+ node::ApplyArgsManOptions(*m_node.args, peerman_opts);
+ peerman_opts.max_headers_result = FUZZ_MAX_HEADERS_RESULTS;
+ m_node.peerman = PeerManager::make(*m_node.connman, *m_node.addrman,
+ m_node.banman.get(), *m_node.chainman,
+ *m_node.mempool, *m_node.warnings, peerman_opts);
+
+ CConnman::Options options;
+ options.m_msgproc = m_node.peerman.get();
+ m_node.connman->Init(options);
+ }
+
+ void ResetAndInitialize() EXCLUSIVE_LOCKS_REQUIRED(NetEventsInterface::g_msgproc_mutex);
+ void SendMessage(FuzzedDataProvider& fuzzed_data_provider, CSerializedNetMsg&& msg)
+ EXCLUSIVE_LOCKS_REQUIRED(NetEventsInterface::g_msgproc_mutex);
+};
+
+void HeadersSyncSetup::ResetAndInitialize()
+{
+ m_connections.clear();
+ auto& connman = static_cast<ConnmanTestMsg&>(*m_node.connman);
+ connman.StopNodes();
+
+ NodeId id{0};
+ std::vector<ConnectionType> conn_types = {
+ ConnectionType::OUTBOUND_FULL_RELAY,
+ ConnectionType::BLOCK_RELAY,
+ ConnectionType::INBOUND
+ };
+
+ for (auto conn_type : conn_types) {
+ CAddress addr{};
+ m_connections.push_back(new CNode(id++, nullptr, addr, 0, 0, addr, "", conn_type, false));
+ CNode& p2p_node = *m_connections.back();
+
+ connman.Handshake(
+ /*node=*/p2p_node,
+ /*successfully_connected=*/true,
+ /*remote_services=*/ServiceFlags(NODE_NETWORK | NODE_WITNESS),
+ /*local_services=*/ServiceFlags(NODE_NETWORK | NODE_WITNESS),
+ /*version=*/PROTOCOL_VERSION,
+ /*relay_txs=*/true);
+
+ connman.AddTestNode(p2p_node);
+ }
+}
+
+void HeadersSyncSetup::SendMessage(FuzzedDataProvider& fuzzed_data_provider, CSerializedNetMsg&& msg)
+{
+ auto& connman = static_cast<ConnmanTestMsg&>(*m_node.connman);
+ CNode& connection = *PickValue(fuzzed_data_provider, m_connections);
+
+ connman.FlushSendBuffer(connection);
+ (void)connman.ReceiveMsgFrom(connection, std::move(msg));
+ connection.fPauseSend = false;
+ try {
+ connman.ProcessMessagesOnce(connection);
+ } catch (const std::ios_base::failure&) {
+ }
+ m_node.peerman->SendMessages(&connection);
+}
+
+CBlockHeader ConsumeHeader(FuzzedDataProvider& fuzzed_data_provider, const uint256& prev_hash, uint32_t prev_nbits)
+{
+ CBlockHeader header;
+ header.nNonce = 0;
+ // Either use the previous difficulty or let the fuzzer choose
+ header.nBits = fuzzed_data_provider.ConsumeBool() ?
+ prev_nbits :
+ fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0x17058EBE, 0x1D00FFFF);
+ header.nTime = ConsumeTime(fuzzed_data_provider);
+ header.hashPrevBlock = prev_hash;
+ header.nVersion = fuzzed_data_provider.ConsumeIntegral<int32_t>();
+ return header;
+}
+
+CBlock ConsumeBlock(FuzzedDataProvider& fuzzed_data_provider, const uint256& prev_hash, uint32_t prev_nbits)
+{
+ auto header = ConsumeHeader(fuzzed_data_provider, prev_hash, prev_nbits);
+ // In order to reach the headers acceptance logic, the block is
+ // constructed in a way that will pass the mutation checks.
+ CBlock block{header};
+ CMutableTransaction tx;
+ tx.vin.resize(1);
+ tx.vout.resize(1);
+ tx.vout[0].nValue = 0;
+ tx.vin[0].scriptSig.resize(2);
+ block.vtx.push_back(MakeTransactionRef(tx));
+ block.hashMerkleRoot = block.vtx[0]->GetHash();
+ return block;
+}
+
+void FinalizeHeader(CBlockHeader& header)
+{
+ while (!CheckProofOfWork(header.GetHash(), header.nBits, Params().GetConsensus())) {
+ ++(header.nNonce);
+ }
+}
+
+// Global setup works for this test as state modification (specifically in the
+// block index) would indicate a bug.
+HeadersSyncSetup* g_testing_setup;
+
+void initialize()
+{
+ static auto setup = MakeNoLogFileContext<HeadersSyncSetup>(ChainType::MAIN, {.extra_args = {"-checkpoints=0"}});
+ g_testing_setup = setup.get();
+}
+} // namespace
+
+FUZZ_TARGET(p2p_headers_presync, .init = initialize)
+{
+ ChainstateManager& chainman = *g_testing_setup->m_node.chainman;
+
+ LOCK(NetEventsInterface::g_msgproc_mutex);
+
+ g_testing_setup->ResetAndInitialize();
+
+ FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
+
+ CBlockHeader base{Params().GenesisBlock()};
+ SetMockTime(base.nTime);
+
+ // The chain is just a single block, so this is equal to 1
+ size_t original_index_size{WITH_LOCK(cs_main, return chainman.m_blockman.m_block_index.size())};
+
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100)
+ {
+ auto finalized_block = [&]() {
+ CBlock block = ConsumeBlock(fuzzed_data_provider, base.GetHash(), base.nBits);
+ FinalizeHeader(block);
+ return block;
+ };
+
+ // Send low-work headers, compact blocks, and blocks
+ CallOneOf(
+ fuzzed_data_provider,
+ [&]() NO_THREAD_SAFETY_ANALYSIS {
+ // Send FUZZ_MAX_HEADERS_RESULTS headers
+ std::vector<CBlock> headers;
+ headers.resize(FUZZ_MAX_HEADERS_RESULTS);
+ for (CBlock& header : headers) {
+ header = ConsumeHeader(fuzzed_data_provider, base.GetHash(), base.nBits);
+ FinalizeHeader(header);
+ base = header;
+ }
+
+ auto headers_msg = NetMsg::Make(NetMsgType::HEADERS, TX_WITH_WITNESS(headers));
+ g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
+ },
+ [&]() NO_THREAD_SAFETY_ANALYSIS {
+ // Send a compact block
+ auto block = finalized_block();
+ CBlockHeaderAndShortTxIDs cmpct_block{block, fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
+
+ auto headers_msg = NetMsg::Make(NetMsgType::CMPCTBLOCK, TX_WITH_WITNESS(cmpct_block));
+ g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
+ },
+ [&]() NO_THREAD_SAFETY_ANALYSIS {
+ // Send a block
+ auto block = finalized_block();
+
+ auto headers_msg = NetMsg::Make(NetMsgType::BLOCK, TX_WITH_WITNESS(block));
+ g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
+ });
+ }
+
+ // The headers/blocks sent in this test should never be stored, as the chains don't have the work required
+ // to meet the anti-DoS work threshold. So, if at any point the block index grew in size, then there's a bug
+ // in the headers pre-sync logic.
+ assert(WITH_LOCK(cs_main, return chainman.m_blockman.m_block_index.size()) == original_index_size);
+
+ g_testing_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
+}
diff --git a/src/test/fuzz/p2p_transport_serialization.cpp b/src/test/fuzz/p2p_transport_serialization.cpp
index 93f77b6e5b..cf3ef45c0a 100644
--- a/src/test/fuzz/p2p_transport_serialization.cpp
+++ b/src/test/fuzz/p2p_transport_serialization.cpp
@@ -12,6 +12,7 @@
#include <test/fuzz/util.h>
#include <util/chaintype.h>
+#include <algorithm>
#include <cassert>
#include <cstdint>
#include <limits>
@@ -185,12 +186,12 @@ void SimulationTest(Transport& initiator, Transport& responder, R& rng, FuzzedDa
// Compare with expected more.
if (expect_more[side].has_value()) assert(!bytes.empty() == *expect_more[side]);
// Verify consistency between the two results.
- assert(bytes == bytes_next);
+ assert(std::ranges::equal(bytes, bytes_next));
assert(msg_type == msg_type_next);
if (more_nonext) assert(more_next);
// Compare with previously reported output.
assert(to_send[side].size() <= bytes.size());
- assert(to_send[side] == Span{bytes}.first(to_send[side].size()));
+ assert(std::ranges::equal(to_send[side], Span{bytes}.first(to_send[side].size())));
to_send[side].resize(bytes.size());
std::copy(bytes.begin(), bytes.end(), to_send[side].begin());
// Remember 'more' results.
@@ -278,7 +279,7 @@ void SimulationTest(Transport& initiator, Transport& responder, R& rng, FuzzedDa
// The m_type must match what is expected.
assert(received.m_type == expected[side].front().m_type);
// The data must match what is expected.
- assert(MakeByteSpan(received.m_recv) == MakeByteSpan(expected[side].front().data));
+ assert(std::ranges::equal(received.m_recv, MakeByteSpan(expected[side].front().data)));
expected[side].pop_front();
progress = true;
}
diff --git a/src/test/fuzz/policy_estimator.cpp b/src/test/fuzz/policy_estimator.cpp
index a4e1947b9f..2942740395 100644
--- a/src/test/fuzz/policy_estimator.cpp
+++ b/src/test/fuzz/policy_estimator.cpp
@@ -85,9 +85,18 @@ FUZZ_TARGET(policy_estimator, .init = initialize_policy_estimator)
});
(void)block_policy_estimator.estimateFee(fuzzed_data_provider.ConsumeIntegral<int>());
EstimationResult result;
- (void)block_policy_estimator.estimateRawFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeFloatingPoint<double>(), fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS), fuzzed_data_provider.ConsumeBool() ? &result : nullptr);
+ auto conf_target = fuzzed_data_provider.ConsumeIntegral<int>();
+ auto success_threshold = fuzzed_data_provider.ConsumeFloatingPoint<double>();
+ auto horizon = fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS);
+ auto* result_ptr = fuzzed_data_provider.ConsumeBool() ? &result : nullptr;
+ (void)block_policy_estimator.estimateRawFee(conf_target, success_threshold, horizon, result_ptr);
+
FeeCalculation fee_calculation;
- (void)block_policy_estimator.estimateSmartFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeBool() ? &fee_calculation : nullptr, fuzzed_data_provider.ConsumeBool());
+ conf_target = fuzzed_data_provider.ConsumeIntegral<int>();
+ auto* fee_calc_ptr = fuzzed_data_provider.ConsumeBool() ? &fee_calculation : nullptr;
+ auto conservative = fuzzed_data_provider.ConsumeBool();
+ (void)block_policy_estimator.estimateSmartFee(conf_target, fee_calc_ptr, conservative);
+
(void)block_policy_estimator.HighestTargetTracked(fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS));
}
{
diff --git a/src/test/fuzz/poolresource.cpp b/src/test/fuzz/poolresource.cpp
index 28bf7175c0..dd8d5b07e5 100644
--- a/src/test/fuzz/poolresource.cpp
+++ b/src/test/fuzz/poolresource.cpp
@@ -78,7 +78,7 @@ public:
{
std::vector<std::byte> expect(entry.span.size());
InsecureRandomContext(entry.seed).fillrand(expect);
- assert(entry.span == expect);
+ assert(std::ranges::equal(entry.span, expect));
}
void Deallocate(const Entry& entry)
diff --git a/src/test/fuzz/pow.cpp b/src/test/fuzz/pow.cpp
index 05cdb740e4..dba999ce4f 100644
--- a/src/test/fuzz/pow.cpp
+++ b/src/test/fuzz/pow.cpp
@@ -80,7 +80,7 @@ FUZZ_TARGET(pow, .init = initialize_pow)
{
const std::optional<uint256> hash = ConsumeDeserializable<uint256>(fuzzed_data_provider);
if (hash) {
- (void)CheckProofOfWork(*hash, fuzzed_data_provider.ConsumeIntegral<unsigned int>(), consensus_params);
+ (void)CheckProofOfWorkImpl(*hash, fuzzed_data_provider.ConsumeIntegral<unsigned int>(), consensus_params);
}
}
}
diff --git a/src/test/fuzz/prevector.cpp b/src/test/fuzz/prevector.cpp
index aeceb38a58..fffa099391 100644
--- a/src/test/fuzz/prevector.cpp
+++ b/src/test/fuzz/prevector.cpp
@@ -210,15 +210,20 @@ FUZZ_TARGET(prevector)
LIMITED_WHILE(prov.remaining_bytes(), 3000)
{
switch (prov.ConsumeIntegralInRange<int>(0, 13 + 3 * (test.size() > 0))) {
- case 0:
- test.insert(prov.ConsumeIntegralInRange<size_t>(0, test.size()), prov.ConsumeIntegral<int>());
- break;
+ case 0: {
+ auto position = prov.ConsumeIntegralInRange<size_t>(0, test.size());
+ auto value = prov.ConsumeIntegral<int>();
+ test.insert(position, value);
+ } break;
case 1:
test.resize(std::max(0, std::min(30, (int)test.size() + prov.ConsumeIntegralInRange<int>(0, 4) - 2)));
break;
- case 2:
- test.insert(prov.ConsumeIntegralInRange<size_t>(0, test.size()), 1 + prov.ConsumeBool(), prov.ConsumeIntegral<int>());
- break;
+ case 2: {
+ auto position = prov.ConsumeIntegralInRange<size_t>(0, test.size());
+ auto count = 1 + prov.ConsumeBool();
+ auto value = prov.ConsumeIntegral<int>();
+ test.insert(position, count, value);
+ } break;
case 3: {
int del = prov.ConsumeIntegralInRange<int>(0, test.size());
int beg = prov.ConsumeIntegralInRange<int>(0, test.size() - del);
@@ -255,9 +260,11 @@ FUZZ_TARGET(prevector)
case 9:
test.clear();
break;
- case 10:
- test.assign(prov.ConsumeIntegralInRange<size_t>(0, 32767), prov.ConsumeIntegral<int>());
- break;
+ case 10: {
+ auto n = prov.ConsumeIntegralInRange<size_t>(0, 32767);
+ auto value = prov.ConsumeIntegral<int>();
+ test.assign(n, value);
+ } break;
case 11:
test.swap();
break;
@@ -267,9 +274,11 @@ FUZZ_TARGET(prevector)
case 13:
test.move();
break;
- case 14:
- test.update(prov.ConsumeIntegralInRange<size_t>(0, test.size() - 1), prov.ConsumeIntegral<int>());
- break;
+ case 14: {
+ auto pos = prov.ConsumeIntegralInRange<size_t>(0, test.size() - 1);
+ auto value = prov.ConsumeIntegral<int>();
+ test.update(pos, value);
+ } break;
case 15:
test.erase(prov.ConsumeIntegralInRange<size_t>(0, test.size() - 1));
break;
diff --git a/src/test/fuzz/script_format.cpp b/src/test/fuzz/script_format.cpp
index 10150dcd7f..e26c42ae38 100644
--- a/src/test/fuzz/script_format.cpp
+++ b/src/test/fuzz/script_format.cpp
@@ -30,5 +30,7 @@ FUZZ_TARGET(script_format, .init = initialize_script_format)
(void)ScriptToAsmStr(script, /*fAttemptSighashDecode=*/fuzzed_data_provider.ConsumeBool());
UniValue o1(UniValue::VOBJ);
- ScriptToUniv(script, /*out=*/o1, /*include_hex=*/fuzzed_data_provider.ConsumeBool(), /*include_address=*/fuzzed_data_provider.ConsumeBool());
+ auto include_hex = fuzzed_data_provider.ConsumeBool();
+ auto include_address = fuzzed_data_provider.ConsumeBool();
+ ScriptToUniv(script, /*out=*/o1, include_hex, include_address);
}
diff --git a/src/test/fuzz/script_interpreter.cpp b/src/test/fuzz/script_interpreter.cpp
index 5e76443abe..9e3ad02b2e 100644
--- a/src/test/fuzz/script_interpreter.cpp
+++ b/src/test/fuzz/script_interpreter.cpp
@@ -25,12 +25,18 @@ FUZZ_TARGET(script_interpreter)
const CTransaction tx_to{*mtx};
const unsigned int in = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
if (in < tx_to.vin.size()) {
- (void)SignatureHash(script_code, tx_to, in, fuzzed_data_provider.ConsumeIntegral<int>(), ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}), nullptr);
+ auto n_hash_type = fuzzed_data_provider.ConsumeIntegral<int>();
+ auto amount = ConsumeMoney(fuzzed_data_provider);
+ auto sigversion = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0});
+ (void)SignatureHash(script_code, tx_to, in, n_hash_type, amount, sigversion, nullptr);
const std::optional<CMutableTransaction> mtx_precomputed = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
if (mtx_precomputed) {
const CTransaction tx_precomputed{*mtx_precomputed};
const PrecomputedTransactionData precomputed_transaction_data{tx_precomputed};
- (void)SignatureHash(script_code, tx_to, in, fuzzed_data_provider.ConsumeIntegral<int>(), ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}), &precomputed_transaction_data);
+ n_hash_type = fuzzed_data_provider.ConsumeIntegral<int>();
+ amount = ConsumeMoney(fuzzed_data_provider);
+ sigversion = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0});
+ (void)SignatureHash(script_code, tx_to, in, n_hash_type, amount, sigversion, &precomputed_transaction_data);
}
}
}
diff --git a/src/test/fuzz/script_sign.cpp b/src/test/fuzz/script_sign.cpp
index 4695bc611b..7725ee699c 100644
--- a/src/test/fuzz/script_sign.cpp
+++ b/src/test/fuzz/script_sign.cpp
@@ -111,7 +111,10 @@ FUZZ_TARGET(script_sign, .init = initialize_script_sign)
}
if (n_in < script_tx_to.vin.size()) {
SignatureData empty;
- (void)SignSignature(provider, ConsumeScript(fuzzed_data_provider), script_tx_to, n_in, ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int>(), empty);
+ auto from_pub_key = ConsumeScript(fuzzed_data_provider);
+ auto amount = ConsumeMoney(fuzzed_data_provider);
+ auto n_hash_type = fuzzed_data_provider.ConsumeIntegral<int>();
+ (void)SignSignature(provider, from_pub_key, script_tx_to, n_in, amount, n_hash_type, empty);
MutableTransactionSignatureCreator signature_creator{tx_to, n_in, ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int>()};
std::vector<unsigned char> vch_sig;
CKeyID address;
@@ -122,7 +125,9 @@ FUZZ_TARGET(script_sign, .init = initialize_script_sign)
} else {
address = CKeyID{ConsumeUInt160(fuzzed_data_provider)};
}
- (void)signature_creator.CreateSig(provider, vch_sig, address, ConsumeScript(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}));
+ auto script_code = ConsumeScript(fuzzed_data_provider);
+ auto sigversion = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0});
+ (void)signature_creator.CreateSig(provider, vch_sig, address, script_code, sigversion);
}
std::map<COutPoint, Coin> coins{ConsumeCoins(fuzzed_data_provider)};
std::map<int, bilingual_str> input_errors;
diff --git a/src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp b/src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp
index 0435626356..9f84ac9713 100644
--- a/src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp
+++ b/src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp
@@ -17,7 +17,7 @@ int ec_seckey_export_der(const secp256k1_context* ctx, unsigned char* seckey, si
FUZZ_TARGET(secp256k1_ec_seckey_import_export_der)
{
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
- secp256k1_context* secp256k1_context_sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
+ secp256k1_context* secp256k1_context_sign = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
{
std::vector<uint8_t> out32(32);
(void)ec_seckey_import_der(secp256k1_context_sign, out32.data(), ConsumeFixedLengthByteVector(fuzzed_data_provider, CKey::SIZE).data(), CKey::SIZE);
diff --git a/src/test/fuzz/socks5.cpp b/src/test/fuzz/socks5.cpp
index af81fcb593..17d1787586 100644
--- a/src/test/fuzz/socks5.cpp
+++ b/src/test/fuzz/socks5.cpp
@@ -41,8 +41,8 @@ FUZZ_TARGET(socks5, .init = initialize_socks5)
FuzzedSock fuzzed_sock = ConsumeSock(fuzzed_data_provider);
// This Socks5(...) fuzzing harness would have caught CVE-2017-18350 within
// a few seconds of fuzzing.
- (void)Socks5(fuzzed_data_provider.ConsumeRandomLengthString(512),
- fuzzed_data_provider.ConsumeIntegral<uint16_t>(),
- fuzzed_data_provider.ConsumeBool() ? &proxy_credentials : nullptr,
- fuzzed_sock);
+ auto str_dest = fuzzed_data_provider.ConsumeRandomLengthString(512);
+ auto port = fuzzed_data_provider.ConsumeIntegral<uint16_t>();
+ auto* auth = fuzzed_data_provider.ConsumeBool() ? &proxy_credentials : nullptr;
+ (void)Socks5(str_dest, port, auth, fuzzed_sock);
}
diff --git a/src/test/fuzz/span.cpp b/src/test/fuzz/span.cpp
index 8f753948df..cd436d582f 100644
--- a/src/test/fuzz/span.cpp
+++ b/src/test/fuzz/span.cpp
@@ -30,10 +30,4 @@ FUZZ_TARGET(span)
(void)span.subspan(idx, span.size() - idx);
(void)span[idx];
}
-
- std::string another_str = fuzzed_data_provider.ConsumeBytesAsString(32);
- const Span<const char> another_span{another_str};
- assert((span <= another_span) != (span > another_span));
- assert((span == another_span) != (span != another_span));
- assert((span >= another_span) != (span < another_span));
}
diff --git a/src/test/fuzz/system.cpp b/src/test/fuzz/system.cpp
index 73ae89b52a..2ab5b7ed39 100644
--- a/src/test/fuzz/system.cpp
+++ b/src/test/fuzz/system.cpp
@@ -44,23 +44,31 @@ FUZZ_TARGET(system, .init = initialize_system)
args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16));
},
[&] {
- args_manager.SoftSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16));
+ auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ args_manager.SoftSetArg(str_arg, str_value);
},
[&] {
- args_manager.ForceSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16));
+ auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ args_manager.ForceSetArg(str_arg, str_value);
},
[&] {
- args_manager.SoftSetBoolArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeBool());
+ auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ auto f_value = fuzzed_data_provider.ConsumeBool();
+ args_manager.SoftSetBoolArg(str_arg, f_value);
},
[&] {
- const OptionsCategory options_category = fuzzed_data_provider.PickValueInArray<OptionsCategory>({OptionsCategory::OPTIONS, OptionsCategory::CONNECTION, OptionsCategory::WALLET, OptionsCategory::WALLET_DEBUG_TEST, OptionsCategory::ZMQ, OptionsCategory::DEBUG_TEST, OptionsCategory::CHAINPARAMS, OptionsCategory::NODE_RELAY, OptionsCategory::BLOCK_CREATION, OptionsCategory::RPC, OptionsCategory::GUI, OptionsCategory::COMMANDS, OptionsCategory::REGISTER_COMMANDS, OptionsCategory::HIDDEN});
+ const OptionsCategory options_category = fuzzed_data_provider.PickValueInArray<OptionsCategory>({OptionsCategory::OPTIONS, OptionsCategory::CONNECTION, OptionsCategory::WALLET, OptionsCategory::WALLET_DEBUG_TEST, OptionsCategory::ZMQ, OptionsCategory::DEBUG_TEST, OptionsCategory::CHAINPARAMS, OptionsCategory::NODE_RELAY, OptionsCategory::BLOCK_CREATION, OptionsCategory::RPC, OptionsCategory::GUI, OptionsCategory::COMMANDS, OptionsCategory::REGISTER_COMMANDS, OptionsCategory::CLI_COMMANDS, OptionsCategory::IPC, OptionsCategory::HIDDEN});
// Avoid hitting:
// common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.
const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16));
if (args_manager.GetArgFlags(argument_name) != std::nullopt) {
return;
}
- args_manager.AddArg(argument_name, fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND, options_category);
+ auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND;
+ args_manager.AddArg(argument_name, help, flags, options_category);
},
[&] {
// Avoid hitting:
diff --git a/src/test/fuzz/util/CMakeLists.txt b/src/test/fuzz/util/CMakeLists.txt
new file mode 100644
index 0000000000..f73a1a83c2
--- /dev/null
+++ b/src/test/fuzz/util/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(test_fuzz STATIC EXCLUDE_FROM_ALL
+ descriptor.cpp
+ mempool.cpp
+ net.cpp
+ ../fuzz.cpp
+ ../util.cpp
+)
+
+target_link_libraries(test_fuzz
+ PRIVATE
+ core_interface
+ test_util
+ bitcoin_node
+ Boost::headers
+)
+
+if(NOT FUZZ_BINARY_LINKS_WITHOUT_MAIN_FUNCTION)
+ target_compile_definitions(test_fuzz PRIVATE PROVIDE_FUZZ_MAIN_FUNCTION)
+endif()
diff --git a/src/test/fuzz/util/net.cpp b/src/test/fuzz/util/net.cpp
index ca0fd65cae..b02c4edbad 100644
--- a/src/test/fuzz/util/net.cpp
+++ b/src/test/fuzz/util/net.cpp
@@ -414,10 +414,10 @@ bool FuzzedSock::IsConnected(std::string& errmsg) const
void FillNode(FuzzedDataProvider& fuzzed_data_provider, ConnmanTestMsg& connman, CNode& node) noexcept
{
- connman.Handshake(node,
- /*successfully_connected=*/fuzzed_data_provider.ConsumeBool(),
- /*remote_services=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS),
- /*local_services=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS),
- /*version=*/fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(MIN_PEER_PROTO_VERSION, std::numeric_limits<int32_t>::max()),
- /*relay_txs=*/fuzzed_data_provider.ConsumeBool());
+ auto successfully_connected = fuzzed_data_provider.ConsumeBool();
+ auto remote_services = ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS);
+ auto local_services = ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS);
+ auto version = fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(MIN_PEER_PROTO_VERSION, std::numeric_limits<int32_t>::max());
+ auto relay_txs = fuzzed_data_provider.ConsumeBool();
+ connman.Handshake(node, successfully_connected, remote_services, local_services, version, relay_txs);
}
diff --git a/src/test/fuzz/utxo_snapshot.cpp b/src/test/fuzz/utxo_snapshot.cpp
index 21c305e222..1241bba8be 100644
--- a/src/test/fuzz/utxo_snapshot.cpp
+++ b/src/test/fuzz/utxo_snapshot.cpp
@@ -58,7 +58,7 @@ void initialize_chain()
auto& chainman{*setup->m_node.chainman};
for (const auto& block : chain) {
BlockValidationState dummy;
- bool processed{chainman.ProcessNewBlockHeaders({*block}, true, dummy)};
+ bool processed{chainman.ProcessNewBlockHeaders({{block->GetBlockHeader()}}, true, dummy)};
Assert(processed);
const auto* index{WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(block->GetHash()))};
Assert(index);
@@ -137,7 +137,7 @@ void utxo_snapshot_fuzz(FuzzBufferType buffer)
if constexpr (!INVALID) {
for (const auto& block : *g_chain) {
BlockValidationState dummy;
- bool processed{chainman.ProcessNewBlockHeaders({*block}, true, dummy)};
+ bool processed{chainman.ProcessNewBlockHeaders({{block->GetBlockHeader()}}, true, dummy)};
Assert(processed);
const auto* index{WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(block->GetHash()))};
Assert(index);
diff --git a/src/test/hash_tests.cpp b/src/test/hash_tests.cpp
index 150e386c2d..f56f7232c3 100644
--- a/src/test/hash_tests.cpp
+++ b/src/test/hash_tests.cpp
@@ -11,7 +11,7 @@
#include <boost/test/unit_test.hpp>
-BOOST_AUTO_TEST_SUITE(hash_tests)
+BOOST_FIXTURE_TEST_SUITE(hash_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(murmurhash3)
{
@@ -135,7 +135,7 @@ BOOST_AUTO_TEST_CASE(siphash)
for (int i = 0; i < 16; ++i) {
uint64_t k1 = ctx.rand64();
uint64_t k2 = ctx.rand64();
- uint256 x = InsecureRand256();
+ uint256 x = m_rng.rand256();
uint32_t n = ctx.rand32();
uint8_t nb[4];
WriteLE32(nb, n);
diff --git a/src/test/ipc_test.cpp b/src/test/ipc_test.cpp
index ce4edaceb0..e6de6e3e47 100644
--- a/src/test/ipc_test.cpp
+++ b/src/test/ipc_test.cpp
@@ -2,19 +2,46 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <interfaces/init.h>
+#include <ipc/capnp/protocol.h>
+#include <ipc/process.h>
+#include <ipc/protocol.h>
#include <logging.h>
#include <mp/proxy-types.h>
#include <test/ipc_test.capnp.h>
#include <test/ipc_test.capnp.proxy.h>
#include <test/ipc_test.h>
+#include <tinyformat.h>
#include <future>
+#include <thread>
#include <kj/common.h>
#include <kj/memory.h>
#include <kj/test.h>
+#include <stdexcept>
#include <boost/test/unit_test.hpp>
+//! Remote init class.
+class TestInit : public interfaces::Init
+{
+public:
+ std::unique_ptr<interfaces::Echo> makeEcho() override { return interfaces::MakeEcho(); }
+};
+
+//! Generate a temporary path with temp_directory_path and mkstemp
+static std::string TempPath(std::string_view pattern)
+{
+ std::string temp{fs::PathToString(fs::path{fs::temp_directory_path()} / fs::PathFromString(std::string{pattern}))};
+ temp.push_back('\0');
+ int fd{mkstemp(temp.data())};
+ BOOST_CHECK_GE(fd, 0);
+ BOOST_CHECK_EQUAL(close(fd), 0);
+ temp.resize(temp.size() - 1);
+ fs::remove(fs::PathFromString(temp));
+ return temp;
+}
+
//! Unit test that tests execution of IPC calls without actually creating a
//! separate process. This test is primarily intended to verify behavior of type
//! conversion code that converts C++ objects to Cap'n Proto messages and vice
@@ -23,13 +50,13 @@
//! The test creates a thread which creates a FooImplementation object (defined
//! in ipc_test.h) and a two-way pipe accepting IPC requests which call methods
//! on the object through FooInterface (defined in ipc_test.capnp).
-void IpcTest()
+void IpcPipeTest()
{
// Setup: create FooImplemention object and listen for FooInterface requests
std::promise<std::unique_ptr<mp::ProxyClient<gen::FooInterface>>> foo_promise;
std::function<void()> disconnect_client;
std::thread thread([&]() {
- mp::EventLoop loop("IpcTest", [](bool raise, const std::string& log) { LogPrintf("LOG%i: %s\n", raise, log); });
+ mp::EventLoop loop("IpcPipeTest", [](bool raise, const std::string& log) { LogPrintf("LOG%i: %s\n", raise, log); });
auto pipe = loop.m_io_context.provider->newTwoWayPipe();
auto connection_client = std::make_unique<mp::Connection>(loop, kj::mv(pipe.ends[0]));
@@ -65,3 +92,71 @@ void IpcTest()
disconnect_client();
thread.join();
}
+
+//! Test ipc::Protocol connect() and serve() methods connecting over a socketpair.
+void IpcSocketPairTest()
+{
+ int fds[2];
+ BOOST_CHECK_EQUAL(socketpair(AF_UNIX, SOCK_STREAM, 0, fds), 0);
+ std::unique_ptr<interfaces::Init> init{std::make_unique<TestInit>()};
+ std::unique_ptr<ipc::Protocol> protocol{ipc::capnp::MakeCapnpProtocol()};
+ std::promise<void> promise;
+ std::thread thread([&]() {
+ protocol->serve(fds[0], "test-serve", *init, [&] { promise.set_value(); });
+ });
+ promise.get_future().wait();
+ std::unique_ptr<interfaces::Init> remote_init{protocol->connect(fds[1], "test-connect")};
+ std::unique_ptr<interfaces::Echo> remote_echo{remote_init->makeEcho()};
+ BOOST_CHECK_EQUAL(remote_echo->echo("echo test"), "echo test");
+ remote_echo.reset();
+ remote_init.reset();
+ thread.join();
+}
+
+//! Test ipc::Process bind() and connect() methods connecting over a unix socket.
+void IpcSocketTest(const fs::path& datadir)
+{
+ std::unique_ptr<interfaces::Init> init{std::make_unique<TestInit>()};
+ std::unique_ptr<ipc::Protocol> protocol{ipc::capnp::MakeCapnpProtocol()};
+ std::unique_ptr<ipc::Process> process{ipc::MakeProcess()};
+
+ std::string invalid_bind{"invalid:"};
+ BOOST_CHECK_THROW(process->bind(datadir, "test_bitcoin", invalid_bind), std::invalid_argument);
+ BOOST_CHECK_THROW(process->connect(datadir, "test_bitcoin", invalid_bind), std::invalid_argument);
+
+ auto bind_and_listen{[&](const std::string& bind_address) {
+ std::string address{bind_address};
+ int serve_fd = process->bind(datadir, "test_bitcoin", address);
+ BOOST_CHECK_GE(serve_fd, 0);
+ BOOST_CHECK_EQUAL(address, bind_address);
+ protocol->listen(serve_fd, "test-serve", *init);
+ }};
+
+ auto connect_and_test{[&](const std::string& connect_address) {
+ std::string address{connect_address};
+ int connect_fd{process->connect(datadir, "test_bitcoin", address)};
+ BOOST_CHECK_EQUAL(address, connect_address);
+ std::unique_ptr<interfaces::Init> remote_init{protocol->connect(connect_fd, "test-connect")};
+ std::unique_ptr<interfaces::Echo> remote_echo{remote_init->makeEcho()};
+ BOOST_CHECK_EQUAL(remote_echo->echo("echo test"), "echo test");
+ }};
+
+ // Need to specify explicit socket addresses outside the data directory, because the data
+ // directory path is so long that the default socket address and any other
+ // addresses in the data directory would fail with errors like:
+ // Address 'unix' path '"/tmp/test_common_Bitcoin Core/ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff/test_bitcoin.sock"' exceeded maximum socket path length
+ std::vector<std::string> addresses{
+ strprintf("unix:%s", TempPath("bitcoin_sock0_XXXXXX")),
+ strprintf("unix:%s", TempPath("bitcoin_sock1_XXXXXX")),
+ };
+
+ // Bind and listen on multiple addresses
+ for (const auto& address : addresses) {
+ bind_and_listen(address);
+ }
+
+ // Connect and test each address multiple times.
+ for (int i : {0, 1, 0, 0, 1}) {
+ connect_and_test(addresses[i]);
+ }
+}
diff --git a/src/test/ipc_test.h b/src/test/ipc_test.h
index bcfcc2125c..2453bfa23c 100644
--- a/src/test/ipc_test.h
+++ b/src/test/ipc_test.h
@@ -7,6 +7,7 @@
#include <primitives/transaction.h>
#include <univalue.h>
+#include <util/fs.h>
class FooImplementation
{
@@ -16,6 +17,8 @@ public:
UniValue passUniValue(UniValue v) { return v; }
};
-void IpcTest();
+void IpcPipeTest();
+void IpcSocketPairTest();
+void IpcSocketTest(const fs::path& datadir);
#endif // BITCOIN_TEST_IPC_TEST_H
diff --git a/src/test/ipc_tests.cpp b/src/test/ipc_tests.cpp
index 6e144b0f41..35a4f61117 100644
--- a/src/test/ipc_tests.cpp
+++ b/src/test/ipc_tests.cpp
@@ -2,12 +2,41 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <ipc/process.h>
#include <test/ipc_test.h>
+
+#include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp>
-BOOST_AUTO_TEST_SUITE(ipc_tests)
+BOOST_FIXTURE_TEST_SUITE(ipc_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(ipc_tests)
{
- IpcTest();
+ IpcPipeTest();
+ IpcSocketPairTest();
+ IpcSocketTest(m_args.GetDataDirNet());
}
+
+// Test address parsing.
+BOOST_AUTO_TEST_CASE(parse_address_test)
+{
+ std::unique_ptr<ipc::Process> process{ipc::MakeProcess()};
+ fs::path datadir{"/var/empty/notexist"};
+ auto check_notexist{[](const std::system_error& e) { return e.code() == std::errc::no_such_file_or_directory; }};
+ auto check_address{[&](std::string address, std::string expect_address, std::string expect_error) {
+ if (expect_error.empty()) {
+ BOOST_CHECK_EXCEPTION(process->connect(datadir, "test_bitcoin", address), std::system_error, check_notexist);
+ } else {
+ BOOST_CHECK_EXCEPTION(process->connect(datadir, "test_bitcoin", address), std::invalid_argument, HasReason(expect_error));
+ }
+ BOOST_CHECK_EQUAL(address, expect_address);
+ }};
+ check_address("unix", "unix:/var/empty/notexist/test_bitcoin.sock", "");
+ check_address("unix:", "unix:/var/empty/notexist/test_bitcoin.sock", "");
+ check_address("unix:path.sock", "unix:/var/empty/notexist/path.sock", "");
+ check_address("unix:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.sock",
+ "unix:/var/empty/notexist/0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.sock",
+ "Unix address path \"/var/empty/notexist/0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.sock\" exceeded maximum socket path length");
+ check_address("invalid", "invalid", "Unrecognized address 'invalid'");
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/key_io_tests.cpp b/src/test/key_io_tests.cpp
index 66b4e09ebf..4dd77edc16 100644
--- a/src/test/key_io_tests.cpp
+++ b/src/test/key_io_tests.cpp
@@ -10,12 +10,13 @@
#include <script/script.h>
#include <test/util/json.h>
#include <test/util/setup_common.h>
+#include <univalue.h>
#include <util/chaintype.h>
#include <util/strencodings.h>
#include <boost/test/unit_test.hpp>
-#include <univalue.h>
+#include <algorithm>
BOOST_FIXTURE_TEST_SUITE(key_io_tests, BasicTestingSetup)
@@ -46,7 +47,7 @@ BOOST_AUTO_TEST_CASE(key_io_valid_parse)
privkey = DecodeSecret(exp_base58string);
BOOST_CHECK_MESSAGE(privkey.IsValid(), "!IsValid:" + strTest);
BOOST_CHECK_MESSAGE(privkey.IsCompressed() == isCompressed, "compressed mismatch:" + strTest);
- BOOST_CHECK_MESSAGE(Span{privkey} == Span{exp_payload}, "key mismatch:" + strTest);
+ BOOST_CHECK_MESSAGE(std::ranges::equal(privkey, exp_payload), "key mismatch:" + strTest);
// Private key must be invalid public key
destination = DecodeDestination(exp_base58string);
diff --git a/src/test/key_tests.cpp b/src/test/key_tests.cpp
index 112d6db193..90e04bed87 100644
--- a/src/test/key_tests.cpp
+++ b/src/test/key_tests.cpp
@@ -20,6 +20,7 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
using util::ToString;
static const std::string strSecret1 = "5HxWvvfubhXpYYpS3tJkw6fq9jE9j18THftkZjHHfmFiWtmAbrj";
@@ -143,19 +144,22 @@ BOOST_AUTO_TEST_CASE(key_test1)
BOOST_CHECK(key1.Sign(hashMsg, detsig));
BOOST_CHECK(key1C.Sign(hashMsg, detsigc));
BOOST_CHECK(detsig == detsigc);
- BOOST_CHECK(detsig == ParseHex("304402205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d022014ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
+ BOOST_CHECK_EQUAL(HexStr(detsig), "304402205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d022014ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6");
+
BOOST_CHECK(key2.Sign(hashMsg, detsig));
BOOST_CHECK(key2C.Sign(hashMsg, detsigc));
BOOST_CHECK(detsig == detsigc);
- BOOST_CHECK(detsig == ParseHex("3044022052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd5022061d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
+ BOOST_CHECK_EQUAL(HexStr(detsig), "3044022052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd5022061d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d");
+
BOOST_CHECK(key1.SignCompact(hashMsg, detsig));
BOOST_CHECK(key1C.SignCompact(hashMsg, detsigc));
- BOOST_CHECK(detsig == ParseHex("1c5dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
- BOOST_CHECK(detsigc == ParseHex("205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
+ BOOST_CHECK_EQUAL(HexStr(detsig), "1c5dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6");
+ BOOST_CHECK_EQUAL(HexStr(detsigc), "205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6");
+
BOOST_CHECK(key2.SignCompact(hashMsg, detsig));
BOOST_CHECK(key2C.SignCompact(hashMsg, detsigc));
- BOOST_CHECK(detsig == ParseHex("1c52d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
- BOOST_CHECK(detsigc == ParseHex("2052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
+ BOOST_CHECK_EQUAL(HexStr(detsig), "1c52d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d");
+ BOOST_CHECK_EQUAL(HexStr(detsigc), "2052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d");
}
BOOST_AUTO_TEST_CASE(key_signature_tests)
@@ -312,11 +316,11 @@ BOOST_AUTO_TEST_CASE(bip340_test_vectors)
// In iteration i=0 we tweak with empty Merkle tree.
for (int i = 0; i < 10; ++i) {
uint256 merkle_root;
- if (i) merkle_root = InsecureRand256();
+ if (i) merkle_root = m_rng.rand256();
auto tweaked = pubkey.CreateTapTweak(i ? &merkle_root : nullptr);
BOOST_CHECK(tweaked);
XOnlyPubKey tweaked_key = tweaked->first;
- aux256 = InsecureRand256();
+ aux256 = m_rng.rand256();
bool ok = key.SignSchnorr(msg256, sig64, &merkle_root, aux256);
BOOST_CHECK(ok);
BOOST_CHECK(tweaked_key.VerifySchnorr(msg256, sig64));
@@ -336,7 +340,7 @@ BOOST_AUTO_TEST_CASE(key_ellswift)
CKey key = DecodeSecret(secret);
BOOST_CHECK(key.IsValid());
- uint256 ent32 = InsecureRand256();
+ uint256 ent32 = m_rng.rand256();
auto ellswift = key.EllSwiftCreate(AsBytes(Span{ent32}));
CPubKey decoded_pubkey = ellswift.Decode();
@@ -352,9 +356,9 @@ BOOST_AUTO_TEST_CASE(key_ellswift)
BOOST_AUTO_TEST_CASE(bip341_test_h)
{
- std::vector<unsigned char> G_uncompressed = ParseHex("0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8");
+ constexpr auto G_uncompressed{"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"_hex};
HashWriter hw;
- hw.write(MakeByteSpan(G_uncompressed));
+ hw.write(G_uncompressed);
XOnlyPubKey H{hw.GetSHA256()};
BOOST_CHECK(XOnlyPubKey::NUMS_H == H);
}
@@ -362,11 +366,11 @@ BOOST_AUTO_TEST_CASE(bip341_test_h)
BOOST_AUTO_TEST_CASE(key_schnorr_tweak_smoke_test)
{
// Sanity check to ensure we get the same tweak using CPubKey vs secp256k1 functions
- secp256k1_context* secp256k1_context_sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
+ secp256k1_context* secp256k1_context_sign = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
CKey key;
key.MakeNewKey(true);
- uint256 merkle_root = InsecureRand256();
+ uint256 merkle_root = m_rng.rand256();
// secp256k1 functions
secp256k1_keypair keypair;
diff --git a/src/test/logging_tests.cpp b/src/test/logging_tests.cpp
index cebd000df8..a6fd44e395 100644
--- a/src/test/logging_tests.cpp
+++ b/src/test/logging_tests.cpp
@@ -111,13 +111,11 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintf_, LogSetup)
BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacrosDeprecated, LogSetup)
{
LogPrintf("foo5: %s\n", "bar5");
- LogPrint(BCLog::NET, "foo6: %s\n", "bar6");
LogPrintLevel(BCLog::NET, BCLog::Level::Trace, "foo4: %s\n", "bar4"); // not logged
LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "foo7: %s\n", "bar7");
LogPrintLevel(BCLog::NET, BCLog::Level::Info, "foo8: %s\n", "bar8");
LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "foo9: %s\n", "bar9");
LogPrintLevel(BCLog::NET, BCLog::Level::Error, "foo10: %s\n", "bar10");
- LogPrintfCategory(BCLog::VALIDATION, "foo11: %s\n", "bar11");
std::ifstream file{tmp_log_path};
std::vector<std::string> log_lines;
for (std::string log; std::getline(file, log);) {
@@ -125,12 +123,10 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacrosDeprecated, LogSetup)
}
std::vector<std::string> expected = {
"foo5: bar5",
- "[net] foo6: bar6",
"[net] foo7: bar7",
"[net:info] foo8: bar8",
"[net:warning] foo9: bar9",
"[net:error] foo10: bar10",
- "[validation:info] foo11: bar11",
};
BOOST_CHECK_EQUAL_COLLECTIONS(log_lines.begin(), log_lines.end(), expected.begin(), expected.end());
}
@@ -171,7 +167,7 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacros_CategoryName, LogSetup)
std::vector<std::string> expected;
for (const auto& [category, name] : expected_category_names) {
- LogPrint(category, "foo: %s\n", "bar");
+ LogDebug(category, "foo: %s\n", "bar");
std::string expected_log = "[";
expected_log += name;
expected_log += "] foo: bar";
diff --git a/src/test/merkle_tests.cpp b/src/test/merkle_tests.cpp
index 66f7be3c4e..70308cb29a 100644
--- a/src/test/merkle_tests.cpp
+++ b/src/test/merkle_tests.cpp
@@ -184,7 +184,7 @@ BOOST_AUTO_TEST_CASE(merkle_test)
{
for (int i = 0; i < 32; i++) {
// Try 32 block sizes: all sizes from 0 to 16 inclusive, and then 15 random sizes.
- int ntx = (i <= 16) ? i : 17 + (InsecureRandRange(4000));
+ int ntx = (i <= 16) ? i : 17 + (m_rng.randrange(4000));
// Try up to 3 mutations.
for (int mutate = 0; mutate <= 3; mutate++) {
int duplicate1 = mutate >= 1 ? 1 << ctz(ntx) : 0; // The last how many transactions to duplicate first.
@@ -237,7 +237,7 @@ BOOST_AUTO_TEST_CASE(merkle_test)
// If ntx <= 16, try all branches. Otherwise, try 16 random ones.
int mtx = loop;
if (ntx > 16) {
- mtx = InsecureRandRange(ntx);
+ mtx = m_rng.randrange(ntx);
}
std::vector<uint256> newBranch = BlockMerkleBranch(block, mtx);
std::vector<uint256> oldBranch = BlockGetMerkleBranch(block, merkleTree, mtx);
diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp
index c4cf6f8a40..9f35690460 100644
--- a/src/test/miner_tests.cpp
+++ b/src/test/miner_tests.cpp
@@ -27,6 +27,7 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
using node::BlockAssembler;
using node::CBlockTemplate;
@@ -367,7 +368,7 @@ void MinerTestingSetup::TestBasicMining(const CScript& scriptPubKey, const std::
while (m_node.chainman->ActiveChain().Tip()->nHeight < 209999) {
CBlockIndex* prev = m_node.chainman->ActiveChain().Tip();
CBlockIndex* next = new CBlockIndex();
- next->phashBlock = new uint256(InsecureRand256());
+ next->phashBlock = new uint256(m_rng.rand256());
m_node.chainman->ActiveChainstate().CoinsTip().SetBestBlock(next->GetBlockHash());
next->pprev = prev;
next->nHeight = prev->nHeight + 1;
@@ -379,7 +380,7 @@ void MinerTestingSetup::TestBasicMining(const CScript& scriptPubKey, const std::
while (m_node.chainman->ActiveChain().Tip()->nHeight < 210000) {
CBlockIndex* prev = m_node.chainman->ActiveChain().Tip();
CBlockIndex* next = new CBlockIndex();
- next->phashBlock = new uint256(InsecureRand256());
+ next->phashBlock = new uint256(m_rng.rand256());
m_node.chainman->ActiveChainstate().CoinsTip().SetBestBlock(next->GetBlockHash());
next->pprev = prev;
next->nHeight = prev->nHeight + 1;
@@ -607,7 +608,7 @@ void MinerTestingSetup::TestPrioritisedMining(const CScript& scriptPubKey, const
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
{
// Note that by default, these tests run with size accounting enabled.
- CScript scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
+ CScript scriptPubKey = CScript() << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex_v_u8 << OP_CHECKSIG;
std::unique_ptr<CBlockTemplate> pblocktemplate;
CTxMemPool& tx_mempool{*m_node.mempool};
diff --git a/src/test/miniscript_tests.cpp b/src/test/miniscript_tests.cpp
index 815c278b8c..ba3507d49d 100644
--- a/src/test/miniscript_tests.cpp
+++ b/src/test/miniscript_tests.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <stdint.h>
-#include <string>
-#include <vector>
-
#include <test/util/random.h>
#include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp>
@@ -22,6 +18,13 @@
#include <script/script_error.h>
#include <script/signingprovider.h>
+#include <algorithm>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+using namespace util::hex_literals;
+
namespace {
/** TestData groups various kinds of precomputed data necessary in this test. */
@@ -274,7 +277,7 @@ public:
XOnlyPubKey pk{pubkey};
auto it = g_testdata->schnorr_signatures.find(pk);
if (it == g_testdata->schnorr_signatures.end()) return false;
- return sig == it->second;
+ return std::ranges::equal(sig, it->second);
}
bool CheckLockTime(const CScriptNum& locktime) const override {
@@ -340,13 +343,14 @@ void SatisfactionToWitness(miniscript::MiniscriptContext ctx, CScriptWitness& wi
witness.stack.push_back(*builder.GetSpendData().scripts.begin()->second.begin());
}
+struct MiniScriptTest : BasicTestingSetup {
/** Run random satisfaction tests. */
void TestSatisfy(const KeyConverter& converter, const std::string& testcase, const NodeRef& node) {
auto script = node->ToScript(converter);
auto challenges = FindChallenges(node); // Find all challenges in the generated miniscript.
std::vector<Challenge> challist(challenges.begin(), challenges.end());
for (int iter = 0; iter < 3; ++iter) {
- std::shuffle(challist.begin(), challist.end(), g_insecure_rand_ctx);
+ std::shuffle(challist.begin(), challist.end(), m_rng);
Satisfier satisfier(converter.MsContext());
TestSignatureChecker checker(satisfier);
bool prev_mal_success = false, prev_nonmal_success = false;
@@ -488,10 +492,11 @@ void Test(const std::string& ms, const std::string& hexscript, const std::string
/*opslimit=*/-1, /*stacklimit=*/-1,
/*max_wit_size=*/std::nullopt, /*max_tap_wit_size=*/std::nullopt, /*stack_exec=*/std::nullopt);
}
+}; // struct MiniScriptTest
} // namespace
-BOOST_FIXTURE_TEST_SUITE(miniscript_tests, BasicTestingSetup)
+BOOST_FIXTURE_TEST_SUITE(miniscript_tests, MiniScriptTest)
BOOST_AUTO_TEST_CASE(fixed_tests)
{
@@ -593,11 +598,11 @@ BOOST_AUTO_TEST_CASE(fixed_tests)
// - no pubkey before the CHECKSIG
constexpr KeyConverter tap_converter{miniscript::MiniscriptContext::TAPSCRIPT};
constexpr KeyConverter wsh_converter{miniscript::MiniscriptContext::P2WSH};
- const auto no_pubkey{ParseHex("ac519c")};
+ const auto no_pubkey{"ac519c"_hex_u8};
BOOST_CHECK(miniscript::FromScript({no_pubkey.begin(), no_pubkey.end()}, tap_converter) == nullptr);
- const auto incomplete_multi_a{ParseHex("ba20c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5ba519c")};
+ const auto incomplete_multi_a{"ba20c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5ba519c"_hex_u8};
BOOST_CHECK(miniscript::FromScript({incomplete_multi_a.begin(), incomplete_multi_a.end()}, tap_converter) == nullptr);
- const auto incomplete_multi_a_2{ParseHex("ac2079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac20c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5ba519c")};
+ const auto incomplete_multi_a_2{"ac2079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac20c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5ba519c"_hex_u8};
BOOST_CHECK(miniscript::FromScript({incomplete_multi_a_2.begin(), incomplete_multi_a_2.end()}, tap_converter) == nullptr);
// Can use multi_a under Tapscript but not P2WSH.
Test("and_v(v:multi_a(2,03d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85a,025601570cb47f238d2b0286db4a990fa0f3ba28d1a319f5e7cf55c2a2444da7cc),after(1231488000))", "?", "20d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85aac205601570cb47f238d2b0286db4a990fa0f3ba28d1a319f5e7cf55c2a2444da7ccba529d0400046749b1", TESTMODE_VALID | TESTMODE_NONMAL | TESTMODE_NEEDSIG | TESTMODE_P2WSH_INVALID, 4, 2, {}, {}, 3);
@@ -642,12 +647,12 @@ BOOST_AUTO_TEST_CASE(fixed_tests)
// Misc unit tests
// A Script with a non minimal push is invalid
- std::vector<unsigned char> nonminpush = ParseHex("0000210232780000feff00ffffffffffff21ff005f00ae21ae00000000060602060406564c2102320000060900fe00005f00ae21ae00100000060606060606000000000000000000000000000000000000000000000000000000000000000000");
+ constexpr auto nonminpush{"0000210232780000feff00ffffffffffff21ff005f00ae21ae00000000060602060406564c2102320000060900fe00005f00ae21ae00100000060606060606000000000000000000000000000000000000000000000000000000000000000000"_hex_u8};
const CScript nonminpush_script(nonminpush.begin(), nonminpush.end());
BOOST_CHECK(miniscript::FromScript(nonminpush_script, wsh_converter) == nullptr);
BOOST_CHECK(miniscript::FromScript(nonminpush_script, tap_converter) == nullptr);
// A non-minimal VERIFY (<key> CHECKSIG VERIFY 1)
- std::vector<unsigned char> nonminverify = ParseHex("2103a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7ac6951");
+ constexpr auto nonminverify{"2103a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7ac6951"_hex_u8};
const CScript nonminverify_script(nonminverify.begin(), nonminverify.end());
BOOST_CHECK(miniscript::FromScript(nonminverify_script, wsh_converter) == nullptr);
BOOST_CHECK(miniscript::FromScript(nonminverify_script, tap_converter) == nullptr);
diff --git a/src/test/minisketch_tests.cpp b/src/test/minisketch_tests.cpp
index 10506da783..3d2a835113 100644
--- a/src/test/minisketch_tests.cpp
+++ b/src/test/minisketch_tests.cpp
@@ -14,16 +14,16 @@
using node::MakeMinisketch32;
-BOOST_AUTO_TEST_SUITE(minisketch_tests)
+BOOST_FIXTURE_TEST_SUITE(minisketch_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(minisketch_test)
{
for (int i = 0; i < 100; ++i) {
- uint32_t errors = 0 + InsecureRandRange(11);
- uint32_t start_a = 1 + InsecureRandRange(1000000000);
- uint32_t a_not_b = InsecureRandRange(errors + 1);
+ uint32_t errors = 0 + m_rng.randrange(11);
+ uint32_t start_a = 1 + m_rng.randrange(1000000000);
+ uint32_t a_not_b = m_rng.randrange(errors + 1);
uint32_t b_not_a = errors - a_not_b;
- uint32_t both = InsecureRandRange(10000);
+ uint32_t both = m_rng.randrange(10000);
uint32_t end_a = start_a + a_not_b + both;
uint32_t start_b = start_a + a_not_b;
uint32_t end_b = start_b + both + b_not_a;
diff --git a/src/test/net_peer_connection_tests.cpp b/src/test/net_peer_connection_tests.cpp
index 2dde6daee5..e60ce8b99d 100644
--- a/src/test/net_peer_connection_tests.cpp
+++ b/src/test/net_peer_connection_tests.cpp
@@ -43,20 +43,21 @@ static CService ip(uint32_t i)
return CService{CNetAddr{s}, Params().GetDefaultPort()};
}
+struct PeerTest : LogIPsTestingSetup {
/** Create a peer and connect to it. If the optional `address` (IP/CJDNS only) isn't passed, a random address is created. */
-static void AddPeer(NodeId& id, std::vector<CNode*>& nodes, PeerManager& peerman, ConnmanTestMsg& connman, ConnectionType conn_type, bool onion_peer = false, std::optional<std::string> address = std::nullopt)
+void AddPeer(NodeId& id, std::vector<CNode*>& nodes, PeerManager& peerman, ConnmanTestMsg& connman, ConnectionType conn_type, bool onion_peer = false, std::optional<std::string> address = std::nullopt)
{
CAddress addr{};
if (address.has_value()) {
addr = CAddress{MaybeFlipIPv6toCJDNS(LookupNumeric(address.value(), Params().GetDefaultPort())), NODE_NONE};
} else if (onion_peer) {
- auto tor_addr{g_insecure_rand_ctx.randbytes(ADDR_TORV3_SIZE)};
+ auto tor_addr{m_rng.randbytes(ADDR_TORV3_SIZE)};
BOOST_REQUIRE(addr.SetSpecial(OnionToString(tor_addr)));
}
while (!addr.IsLocal() && !addr.IsRoutable()) {
- addr = CAddress{ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE};
+ addr = CAddress{ip(m_rng.randbits(32)), NODE_NONE};
}
BOOST_REQUIRE(addr.IsValid());
@@ -80,8 +81,9 @@ static void AddPeer(NodeId& id, std::vector<CNode*>& nodes, PeerManager& peerman
connman.AddTestNode(node);
}
+}; // struct PeerTest
-BOOST_AUTO_TEST_CASE(test_addnode_getaddednodeinfo_and_connection_detection)
+BOOST_FIXTURE_TEST_CASE(test_addnode_getaddednodeinfo_and_connection_detection, PeerTest)
{
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman, Params());
auto peerman = PeerManager::make(*connman, *m_node.addrman, nullptr, *m_node.chainman, *m_node.mempool, *m_node.warnings, {});
diff --git a/src/test/net_tests.cpp b/src/test/net_tests.cpp
index 46a6a33b34..4c72d03ab1 100644
--- a/src/test/net_tests.cpp
+++ b/src/test/net_tests.cpp
@@ -32,6 +32,7 @@
#include <string>
using namespace std::literals;
+using namespace util::hex_literals;
using util::ToString;
BOOST_FIXTURE_TEST_SUITE(net_tests, RegTestingSetup)
@@ -400,9 +401,9 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
const auto ser_params{CAddress::V2_NETWORK};
// Valid IPv4.
- s << Span{ParseHex("01" // network type (IPv4)
- "04" // address length
- "01020304")}; // address
+ s << "01" // network type (IPv4)
+ "04" // address length
+ "01020304"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsIPv4());
@@ -411,35 +412,35 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid IPv4, valid length but address itself is shorter.
- s << Span{ParseHex("01" // network type (IPv4)
- "04" // address length
- "0102")}; // address
+ s << "01" // network type (IPv4)
+ "04" // address length
+ "0102"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure, HasReason("end of data"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Invalid IPv4, with bogus length.
- s << Span{ParseHex("01" // network type (IPv4)
- "05" // address length
- "01020304")}; // address
+ s << "01" // network type (IPv4)
+ "05" // address length
+ "01020304"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 IPv4 address with length 5 (should be 4)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Invalid IPv4, with extreme length.
- s << Span{ParseHex("01" // network type (IPv4)
- "fd0102" // address length (513 as CompactSize)
- "01020304")}; // address
+ s << "01" // network type (IPv4)
+ "fd0102" // address length (513 as CompactSize)
+ "01020304"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("Address too long: 513 > 512"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Valid IPv6.
- s << Span{ParseHex("02" // network type (IPv6)
- "10" // address length
- "0102030405060708090a0b0c0d0e0f10")}; // address
+ s << "02" // network type (IPv6)
+ "10" // address length
+ "0102030405060708090a0b0c0d0e0f10"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsIPv6());
@@ -448,11 +449,10 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Valid IPv6, contains embedded "internal".
- s << Span{ParseHex(
- "02" // network type (IPv6)
- "10" // address length
- "fd6b88c08724ca978112ca1bbdcafac2")}; // address: 0xfd + sha256("bitcoin")[0:5] +
- // sha256(name)[0:10]
+ s << "02" // network type (IPv6)
+ "10" // address length
+ "fd6b88c08724ca978112ca1bbdcafac2"_hex; // address: 0xfd + sha256("bitcoin")[0:5] +
+ // sha256(name)[0:10]
s >> ser_params(addr);
BOOST_CHECK(addr.IsInternal());
BOOST_CHECK(addr.IsAddrV1Compatible());
@@ -460,44 +460,43 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid IPv6, with bogus length.
- s << Span{ParseHex("02" // network type (IPv6)
- "04" // address length
- "00")}; // address
+ s << "02" // network type (IPv6)
+ "04" // address length
+ "00"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 IPv6 address with length 4 (should be 16)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Invalid IPv6, contains embedded IPv4.
- s << Span{ParseHex("02" // network type (IPv6)
- "10" // address length
- "00000000000000000000ffff01020304")}; // address
+ s << "02" // network type (IPv6)
+ "10" // address length
+ "00000000000000000000ffff01020304"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// Invalid IPv6, contains embedded TORv2.
- s << Span{ParseHex("02" // network type (IPv6)
- "10" // address length
- "fd87d87eeb430102030405060708090a")}; // address
+ s << "02" // network type (IPv6)
+ "10" // address length
+ "fd87d87eeb430102030405060708090a"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// TORv2, no longer supported.
- s << Span{ParseHex("03" // network type (TORv2)
- "0a" // address length
- "f1f2f3f4f5f6f7f8f9fa")}; // address
+ s << "03" // network type (TORv2)
+ "0a" // address length
+ "f1f2f3f4f5f6f7f8f9fa"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// Valid TORv3.
- s << Span{ParseHex("04" // network type (TORv3)
- "20" // address length
- "79bcc625184b05194975c28b66b66b04" // address
- "69f7f6556fb1ac3189a79b40dda32f1f"
- )};
+ s << "04" // network type (TORv3)
+ "20" // address length
+ "79bcc625184b05194975c28b66b66b04" // address
+ "69f7f6556fb1ac3189a79b40dda32f1f"_hex;
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsTor());
@@ -507,20 +506,19 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid TORv3, with bogus length.
- s << Span{ParseHex("04" // network type (TORv3)
- "00" // address length
- "00" // address
- )};
+ s << "04" // network type (TORv3)
+ "00" // address length
+ "00"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 TORv3 address with length 0 (should be 32)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Valid I2P.
- s << Span{ParseHex("05" // network type (I2P)
- "20" // address length
- "a2894dabaec08c0051a481a6dac88b64" // address
- "f98232ae42d4b6fd2fa81952dfe36a87")};
+ s << "05" // network type (I2P)
+ "20" // address length
+ "a2894dabaec08c0051a481a6dac88b64" // address
+ "f98232ae42d4b6fd2fa81952dfe36a87"_hex;
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsI2P());
@@ -530,20 +528,18 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid I2P, with bogus length.
- s << Span{ParseHex("05" // network type (I2P)
- "03" // address length
- "00" // address
- )};
+ s << "05" // network type (I2P)
+ "03" // address length
+ "00"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 I2P address with length 3 (should be 32)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Valid CJDNS.
- s << Span{ParseHex("06" // network type (CJDNS)
- "10" // address length
- "fc000001000200030004000500060007" // address
- )};
+ s << "06" // network type (CJDNS)
+ "10" // address length
+ "fc000001000200030004000500060007"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsCJDNS());
@@ -552,49 +548,44 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid CJDNS, wrong prefix.
- s << Span{ParseHex("06" // network type (CJDNS)
- "10" // address length
- "aa000001000200030004000500060007" // address
- )};
+ s << "06" // network type (CJDNS)
+ "10" // address length
+ "aa000001000200030004000500060007"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(addr.IsCJDNS());
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// Invalid CJDNS, with bogus length.
- s << Span{ParseHex("06" // network type (CJDNS)
- "01" // address length
- "00" // address
- )};
+ s << "06" // network type (CJDNS)
+ "01" // address length
+ "00"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 CJDNS address with length 1 (should be 16)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Unknown, with extreme length.
- s << Span{ParseHex("aa" // network type (unknown)
- "fe00000002" // address length (CompactSize's MAX_SIZE)
- "01020304050607" // address
- )};
+ s << "aa" // network type (unknown)
+ "fe00000002" // address length (CompactSize's MAX_SIZE)
+ "01020304050607"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("Address too long: 33554432 > 512"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Unknown, with reasonable length.
- s << Span{ParseHex("aa" // network type (unknown)
- "04" // address length
- "01020304" // address
- )};
+ s << "aa" // network type (unknown)
+ "04" // address length
+ "01020304"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// Unknown, with zero length.
- s << Span{ParseHex("aa" // network type (unknown)
- "00" // address length
- "" // address
- )};
+ s << "aa" // network type (unknown)
+ "00" // address length
+ ""_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
@@ -1011,10 +1002,10 @@ BOOST_AUTO_TEST_CASE(advertise_local_address)
namespace {
-CKey GenerateRandomTestKey() noexcept
+CKey GenerateRandomTestKey(FastRandomContext& rng) noexcept
{
CKey key;
- uint256 key_data = InsecureRand256();
+ uint256 key_data = rng.rand256();
key.Set(key_data.begin(), key_data.end(), true);
return key;
}
@@ -1029,6 +1020,7 @@ CKey GenerateRandomTestKey() noexcept
*/
class V2TransportTester
{
+ FastRandomContext& m_rng;
V2Transport m_transport; //!< V2Transport being tested
BIP324Cipher m_cipher; //!< Cipher to help with the other side
bool m_test_initiator; //!< Whether m_transport is the initiator (true) or responder (false)
@@ -1042,9 +1034,10 @@ class V2TransportTester
public:
/** Construct a tester object. test_initiator: whether the tested transport is initiator. */
- explicit V2TransportTester(bool test_initiator)
- : m_transport{0, test_initiator},
- m_cipher{GenerateRandomTestKey(), MakeByteSpan(InsecureRand256())},
+ explicit V2TransportTester(FastRandomContext& rng, bool test_initiator)
+ : m_rng{rng},
+ m_transport{0, test_initiator},
+ m_cipher{GenerateRandomTestKey(m_rng), MakeByteSpan(m_rng.rand256())},
m_test_initiator(test_initiator) {}
/** Data type returned by Interact:
@@ -1068,7 +1061,7 @@ public:
bool progress{false};
// Send bytes from m_to_send to the transport.
if (!m_to_send.empty()) {
- Span<const uint8_t> to_send = Span{m_to_send}.first(1 + InsecureRandRange(m_to_send.size()));
+ Span<const uint8_t> to_send = Span{m_to_send}.first(1 + m_rng.randrange(m_to_send.size()));
size_t old_len = to_send.size();
if (!m_transport.ReceivedBytes(to_send)) {
return std::nullopt; // transport error occurred
@@ -1079,7 +1072,7 @@ public:
}
}
// Retrieve messages received by the transport.
- if (m_transport.ReceivedMessageComplete() && (!progress || InsecureRandBool())) {
+ if (m_transport.ReceivedMessageComplete() && (!progress || m_rng.randbool())) {
bool reject{false};
auto msg = m_transport.GetReceivedMessage({}, reject);
if (reject) {
@@ -1090,7 +1083,7 @@ public:
progress = true;
}
// Enqueue a message to be sent by the transport to us.
- if (!m_msg_to_send.empty() && (!progress || InsecureRandBool())) {
+ if (!m_msg_to_send.empty() && (!progress || m_rng.randbool())) {
if (m_transport.SetMessageToSend(m_msg_to_send.front())) {
m_msg_to_send.pop_front();
progress = true;
@@ -1098,8 +1091,8 @@ public:
}
// Receive bytes from the transport.
const auto& [recv_bytes, _more, _msg_type] = m_transport.GetBytesToSend(!m_msg_to_send.empty());
- if (!recv_bytes.empty() && (!progress || InsecureRandBool())) {
- size_t to_receive = 1 + InsecureRandRange(recv_bytes.size());
+ if (!recv_bytes.empty() && (!progress || m_rng.randbool())) {
+ size_t to_receive = 1 + m_rng.randrange(recv_bytes.size());
m_received.insert(m_received.end(), recv_bytes.begin(), recv_bytes.begin() + to_receive);
progress = true;
m_transport.MarkBytesSent(to_receive);
@@ -1121,7 +1114,7 @@ public:
/** Send V1 version message header to the transport. */
void SendV1Version(const MessageStartChars& magic)
{
- CMessageHeader hdr(magic, "version", 126 + InsecureRandRange(11));
+ CMessageHeader hdr(magic, "version", 126 + m_rng.randrange(11));
DataStream ser{};
ser << hdr;
m_to_send.insert(m_to_send.end(), UCharCast(ser.data()), UCharCast(ser.data() + ser.size()));
@@ -1146,13 +1139,13 @@ public:
void SendGarbage(size_t garbage_len)
{
// Generate random garbage and send it.
- SendGarbage(g_insecure_rand_ctx.randbytes<uint8_t>(garbage_len));
+ SendGarbage(m_rng.randbytes<uint8_t>(garbage_len));
}
/** Schedule garbage (with valid random length) to be sent to the transport. */
void SendGarbage()
{
- SendGarbage(InsecureRandRange(V2Transport::MAX_GARBAGE_LEN + 1));
+ SendGarbage(m_rng.randrange(V2Transport::MAX_GARBAGE_LEN + 1));
}
/** Schedule a message to be sent to us by the transport. */
@@ -1255,7 +1248,7 @@ public:
for (garblen = 0; garblen <= V2Transport::MAX_GARBAGE_LEN; ++garblen) {
BOOST_REQUIRE(m_received.size() >= garblen + BIP324Cipher::GARBAGE_TERMINATOR_LEN);
auto term_span = MakeByteSpan(Span{m_received}.subspan(garblen, BIP324Cipher::GARBAGE_TERMINATOR_LEN));
- if (term_span == m_cipher.GetReceiveGarbageTerminator()) break;
+ if (std::ranges::equal(term_span, m_cipher.GetReceiveGarbageTerminator())) break;
}
// Copy the garbage to a buffer.
m_recv_garbage.assign(m_received.begin(), m_received.begin() + garblen);
@@ -1280,7 +1273,7 @@ public:
auto ret = ReceivePacket();
BOOST_CHECK(ret.size() == payload.size() + 1);
BOOST_CHECK(ret[0] == short_id);
- BOOST_CHECK(Span{ret}.subspan(1) == payload);
+ BOOST_CHECK(std::ranges::equal(Span{ret}.subspan(1), payload));
}
/** Expect application packet to have been received, with specified 12-char message type and
@@ -1297,7 +1290,7 @@ public:
BOOST_CHECK(ret[1 + i] == 0);
}
}
- BOOST_CHECK(Span{ret}.subspan(1 + CMessageHeader::COMMAND_SIZE) == payload);
+ BOOST_CHECK(std::ranges::equal(Span{ret}.subspan(1 + CMessageHeader::COMMAND_SIZE), payload));
}
/** Schedule an encrypted packet with specified message type and payload to be sent to
@@ -1335,7 +1328,7 @@ public:
/** Introduce a bit error in the data scheduled to be sent. */
void Damage()
{
- m_to_send[InsecureRandRange(m_to_send.size())] ^= (uint8_t{1} << InsecureRandRange(8));
+ m_to_send[m_rng.randrange(m_to_send.size())] ^= (uint8_t{1} << m_rng.randrange(8));
}
};
@@ -1345,7 +1338,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
{
// A mostly normal scenario, testing a transport in initiator mode.
for (int i = 0; i < 10; ++i) {
- V2TransportTester tester(true);
+ V2TransportTester tester(m_rng, true);
auto ret = tester.Interact();
BOOST_REQUIRE(ret && ret->empty());
tester.SendKey();
@@ -1358,16 +1351,16 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveGarbage();
tester.ReceiveVersion();
tester.CompareSessionIDs();
- auto msg_data_1 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(100000));
- auto msg_data_2 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto msg_data_1 = m_rng.randbytes<uint8_t>(m_rng.randrange(100000));
+ auto msg_data_2 = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendMessage(uint8_t(4), msg_data_1); // cmpctblock short id
tester.SendMessage(0, {}); // Invalidly encoded message
tester.SendMessage("tx", msg_data_2); // 12-character encoded message type
ret = tester.Interact();
BOOST_REQUIRE(ret && ret->size() == 3);
- BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "cmpctblock" && Span{(*ret)[0]->m_recv} == MakeByteSpan(msg_data_1));
+ BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "cmpctblock" && std::ranges::equal((*ret)[0]->m_recv, MakeByteSpan(msg_data_1)));
BOOST_CHECK(!(*ret)[1]);
- BOOST_CHECK((*ret)[2] && (*ret)[2]->m_type == "tx" && Span{(*ret)[2]->m_recv} == MakeByteSpan(msg_data_2));
+ BOOST_CHECK((*ret)[2] && (*ret)[2]->m_type == "tx" && std::ranges::equal((*ret)[2]->m_recv, MakeByteSpan(msg_data_2)));
// Then send a message with a bit error, expecting failure. It's possible this failure does
// not occur immediately (when the length descriptor was modified), but it should come
@@ -1379,14 +1372,14 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
if (!ret) break; // failure
BOOST_CHECK(ret->size() == 0); // no message can be delivered
// Send another message.
- auto msg_data_3 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(10000));
+ auto msg_data_3 = m_rng.randbytes<uint8_t>(m_rng.randrange(10000));
tester.SendMessage(uint8_t(12), msg_data_3); // getheaders short id
}
}
// Normal scenario, with a transport in responder node.
for (int i = 0; i < 10; ++i) {
- V2TransportTester tester(false);
+ V2TransportTester tester(m_rng, false);
tester.SendKey();
tester.SendGarbage();
auto ret = tester.Interact();
@@ -1399,17 +1392,17 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveGarbage();
tester.ReceiveVersion();
tester.CompareSessionIDs();
- auto msg_data_1 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(100000));
- auto msg_data_2 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto msg_data_1 = m_rng.randbytes<uint8_t>(m_rng.randrange(100000));
+ auto msg_data_2 = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendMessage(uint8_t(14), msg_data_1); // inv short id
tester.SendMessage(uint8_t(19), msg_data_2); // pong short id
ret = tester.Interact();
BOOST_REQUIRE(ret && ret->size() == 2);
- BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "inv" && Span{(*ret)[0]->m_recv} == MakeByteSpan(msg_data_1));
- BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "pong" && Span{(*ret)[1]->m_recv} == MakeByteSpan(msg_data_2));
+ BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "inv" && std::ranges::equal((*ret)[0]->m_recv, MakeByteSpan(msg_data_1)));
+ BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "pong" && std::ranges::equal((*ret)[1]->m_recv, MakeByteSpan(msg_data_2)));
// Then send a too-large message.
- auto msg_data_3 = g_insecure_rand_ctx.randbytes<uint8_t>(4005000);
+ auto msg_data_3 = m_rng.randbytes<uint8_t>(4005000);
tester.SendMessage(uint8_t(11), msg_data_3); // getdata short id
ret = tester.Interact();
BOOST_CHECK(!ret);
@@ -1418,18 +1411,18 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Various valid but unusual scenarios.
for (int i = 0; i < 50; ++i) {
/** Whether an initiator or responder is being tested. */
- bool initiator = InsecureRandBool();
+ bool initiator = m_rng.randbool();
/** Use either 0 bytes or the maximum possible (4095 bytes) garbage length. */
- size_t garb_len = InsecureRandBool() ? 0 : V2Transport::MAX_GARBAGE_LEN;
+ size_t garb_len = m_rng.randbool() ? 0 : V2Transport::MAX_GARBAGE_LEN;
/** How many decoy packets to send before the version packet. */
- unsigned num_ignore_version = InsecureRandRange(10);
+ unsigned num_ignore_version = m_rng.randrange(10);
/** What data to send in the version packet (ignored by BIP324 peers, but reserved for future extensions). */
- auto ver_data = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandBool() ? 0 : InsecureRandRange(1000));
+ auto ver_data = m_rng.randbytes<uint8_t>(m_rng.randbool() ? 0 : m_rng.randrange(1000));
/** Whether to immediately send key and garbage out (required for responders, optional otherwise). */
- bool send_immediately = !initiator || InsecureRandBool();
+ bool send_immediately = !initiator || m_rng.randbool();
/** How many decoy packets to send before the first and second real message. */
- unsigned num_decoys_1 = InsecureRandRange(1000), num_decoys_2 = InsecureRandRange(1000);
- V2TransportTester tester(initiator);
+ unsigned num_decoys_1 = m_rng.randrange(1000), num_decoys_2 = m_rng.randrange(1000);
+ V2TransportTester tester(m_rng, initiator);
if (send_immediately) {
tester.SendKey();
tester.SendGarbage(garb_len);
@@ -1443,8 +1436,8 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveKey();
tester.SendGarbageTerm();
for (unsigned v = 0; v < num_ignore_version; ++v) {
- size_t ver_ign_data_len = InsecureRandBool() ? 0 : InsecureRandRange(1000);
- auto ver_ign_data = g_insecure_rand_ctx.randbytes<uint8_t>(ver_ign_data_len);
+ size_t ver_ign_data_len = m_rng.randbool() ? 0 : m_rng.randrange(1000);
+ auto ver_ign_data = m_rng.randbytes<uint8_t>(ver_ign_data_len);
tester.SendVersion(ver_ign_data, true);
}
tester.SendVersion(ver_data, false);
@@ -1454,16 +1447,16 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveVersion();
tester.CompareSessionIDs();
for (unsigned d = 0; d < num_decoys_1; ++d) {
- auto decoy_data = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto decoy_data = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendPacket(/*content=*/decoy_data, /*aad=*/{}, /*ignore=*/true);
}
- auto msg_data_1 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(4000000));
+ auto msg_data_1 = m_rng.randbytes<uint8_t>(m_rng.randrange(4000000));
tester.SendMessage(uint8_t(28), msg_data_1);
for (unsigned d = 0; d < num_decoys_2; ++d) {
- auto decoy_data = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto decoy_data = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendPacket(/*content=*/decoy_data, /*aad=*/{}, /*ignore=*/true);
}
- auto msg_data_2 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto msg_data_2 = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendMessage(uint8_t(13), msg_data_2); // headers short id
// Send invalidly-encoded message
tester.SendMessage(std::string("blocktxn\x00\x00\x00a", CMessageHeader::COMMAND_SIZE), {});
@@ -1471,8 +1464,8 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.AddMessage("barfoo", {}); // test sending unknown message type
ret = tester.Interact();
BOOST_REQUIRE(ret && ret->size() == 4);
- BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "addrv2" && Span{(*ret)[0]->m_recv} == MakeByteSpan(msg_data_1));
- BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "headers" && Span{(*ret)[1]->m_recv} == MakeByteSpan(msg_data_2));
+ BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "addrv2" && std::ranges::equal((*ret)[0]->m_recv, MakeByteSpan(msg_data_1)));
+ BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "headers" && std::ranges::equal((*ret)[1]->m_recv, MakeByteSpan(msg_data_2)));
BOOST_CHECK(!(*ret)[2]);
BOOST_CHECK((*ret)[3] && (*ret)[3]->m_type == "foobar" && (*ret)[3]->m_recv.empty());
tester.ReceiveMessage("barfoo", {});
@@ -1480,7 +1473,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Too long garbage (initiator).
{
- V2TransportTester tester(true);
+ V2TransportTester tester(m_rng, true);
auto ret = tester.Interact();
BOOST_REQUIRE(ret && ret->empty());
tester.SendKey();
@@ -1493,7 +1486,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Too long garbage (responder).
{
- V2TransportTester tester(false);
+ V2TransportTester tester(m_rng, false);
tester.SendKey();
tester.SendGarbage(V2Transport::MAX_GARBAGE_LEN + 1);
auto ret = tester.Interact();
@@ -1506,23 +1499,23 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Send garbage that includes the first 15 garbage terminator bytes somewhere.
{
- V2TransportTester tester(true);
+ V2TransportTester tester(m_rng, true);
auto ret = tester.Interact();
BOOST_REQUIRE(ret && ret->empty());
tester.SendKey();
tester.ReceiveKey();
/** The number of random garbage bytes before the included first 15 bytes of terminator. */
- size_t len_before = InsecureRandRange(V2Transport::MAX_GARBAGE_LEN - 16 + 1);
+ size_t len_before = m_rng.randrange(V2Transport::MAX_GARBAGE_LEN - 16 + 1);
/** The number of random garbage bytes after it. */
- size_t len_after = InsecureRandRange(V2Transport::MAX_GARBAGE_LEN - 16 - len_before + 1);
+ size_t len_after = m_rng.randrange(V2Transport::MAX_GARBAGE_LEN - 16 - len_before + 1);
// Construct len_before + 16 + len_after random bytes.
- auto garbage = g_insecure_rand_ctx.randbytes<uint8_t>(len_before + 16 + len_after);
+ auto garbage = m_rng.randbytes<uint8_t>(len_before + 16 + len_after);
// Replace the designed 16 bytes in the middle with the to-be-sent garbage terminator.
auto garb_term = MakeUCharSpan(tester.GetCipher().GetSendGarbageTerminator());
std::copy(garb_term.begin(), garb_term.begin() + 16, garbage.begin() + len_before);
// Introduce a bit error in the last byte of that copied garbage terminator, making only
// the first 15 of them match.
- garbage[len_before + 15] ^= (uint8_t(1) << InsecureRandRange(8));
+ garbage[len_before + 15] ^= (uint8_t(1) << m_rng.randrange(8));
tester.SendGarbage(garbage);
tester.SendGarbageTerm();
tester.SendVersion();
@@ -1531,21 +1524,21 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveGarbage();
tester.ReceiveVersion();
tester.CompareSessionIDs();
- auto msg_data_1 = g_insecure_rand_ctx.randbytes<uint8_t>(4000000); // test that receiving 4M payload works
- auto msg_data_2 = g_insecure_rand_ctx.randbytes<uint8_t>(4000000); // test that sending 4M payload works
- tester.SendMessage(uint8_t(InsecureRandRange(223) + 33), {}); // unknown short id
+ auto msg_data_1 = m_rng.randbytes<uint8_t>(4000000); // test that receiving 4M payload works
+ auto msg_data_2 = m_rng.randbytes<uint8_t>(4000000); // test that sending 4M payload works
+ tester.SendMessage(uint8_t(m_rng.randrange(223) + 33), {}); // unknown short id
tester.SendMessage(uint8_t(2), msg_data_1); // "block" short id
tester.AddMessage("blocktxn", msg_data_2); // schedule blocktxn to be sent to us
ret = tester.Interact();
BOOST_REQUIRE(ret && ret->size() == 2);
BOOST_CHECK(!(*ret)[0]);
- BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "block" && Span{(*ret)[1]->m_recv} == MakeByteSpan(msg_data_1));
+ BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "block" && std::ranges::equal((*ret)[1]->m_recv, MakeByteSpan(msg_data_1)));
tester.ReceiveMessage(uint8_t(3), msg_data_2); // "blocktxn" short id
}
// Send correct network's V1 header
{
- V2TransportTester tester(false);
+ V2TransportTester tester(m_rng, false);
tester.SendV1Version(Params().MessageStart());
auto ret = tester.Interact();
BOOST_CHECK(ret);
@@ -1553,7 +1546,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Send wrong network's V1 header
{
- V2TransportTester tester(false);
+ V2TransportTester tester(m_rng, false);
tester.SendV1Version(CChainParams::Main()->MessageStart());
auto ret = tester.Interact();
BOOST_CHECK(!ret);
diff --git a/src/test/orphanage_tests.cpp b/src/test/orphanage_tests.cpp
index d2dab94526..799f2c0fec 100644
--- a/src/test/orphanage_tests.cpp
+++ b/src/test/orphanage_tests.cpp
@@ -3,12 +3,15 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <arith_uint256.h>
+#include <consensus/validation.h>
+#include <policy/policy.h>
#include <primitives/transaction.h>
#include <pubkey.h>
#include <script/sign.h>
#include <script/signingprovider.h>
#include <test/util/random.h>
#include <test/util/setup_common.h>
+#include <test/util/transaction_utils.h>
#include <txorphanage.h>
#include <array>
@@ -21,6 +24,8 @@ BOOST_FIXTURE_TEST_SUITE(orphanage_tests, TestingSetup)
class TxOrphanageTest : public TxOrphanage
{
public:
+ TxOrphanageTest(FastRandomContext& rng) : m_rng{rng} {}
+
inline size_t CountOrphans() const
{
return m_orphans.size();
@@ -29,14 +34,16 @@ public:
CTransactionRef RandomOrphan()
{
std::map<Wtxid, OrphanTx>::iterator it;
- it = m_orphans.lower_bound(Wtxid::FromUint256(InsecureRand256()));
+ it = m_orphans.lower_bound(Wtxid::FromUint256(m_rng.rand256()));
if (it == m_orphans.end())
it = m_orphans.begin();
return it->second.tx;
}
+
+ FastRandomContext& m_rng;
};
-static void MakeNewKeyWithFastRandomContext(CKey& key, FastRandomContext& rand_ctx = g_insecure_rand_ctx)
+static void MakeNewKeyWithFastRandomContext(CKey& key, FastRandomContext& rand_ctx)
{
std::vector<unsigned char> keydata;
keydata = rand_ctx.randbytes(32);
@@ -104,11 +111,11 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
// ecdsa_signature_parse_der_lax are executed during this test.
// Specifically branches that run only when an ECDSA
// signature's R and S values have leading zeros.
- g_insecure_rand_ctx.Reseed(uint256{33});
+ m_rng.Reseed(uint256{33});
- TxOrphanageTest orphanage;
+ TxOrphanageTest orphanage{m_rng};
CKey key;
- MakeNewKeyWithFastRandomContext(key);
+ MakeNewKeyWithFastRandomContext(key, m_rng);
FillableSigningProvider keystore;
BOOST_CHECK(keystore.AddKey(key));
@@ -122,7 +129,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
CMutableTransaction tx;
tx.vin.resize(1);
tx.vin[0].prevout.n = 0;
- tx.vin[0].prevout.hash = Txid::FromUint256(InsecureRand256());
+ tx.vin[0].prevout.hash = Txid::FromUint256(m_rng.rand256());
tx.vin[0].scriptSig << OP_1;
tx.vout.resize(1);
tx.vout[0].nValue = 1*CENT;
@@ -366,4 +373,21 @@ BOOST_AUTO_TEST_CASE(get_children)
}
}
+BOOST_AUTO_TEST_CASE(too_large_orphan_tx)
+{
+ TxOrphanage orphanage;
+ CMutableTransaction tx;
+ tx.vin.resize(1);
+
+ // check that txs larger than MAX_STANDARD_TX_WEIGHT are not added to the orphanage
+ BulkTransaction(tx, MAX_STANDARD_TX_WEIGHT + 4);
+ BOOST_CHECK_EQUAL(GetTransactionWeight(CTransaction(tx)), MAX_STANDARD_TX_WEIGHT + 4);
+ BOOST_CHECK(!orphanage.AddTx(MakeTransactionRef(tx), 0));
+
+ tx.vout.clear();
+ BulkTransaction(tx, MAX_STANDARD_TX_WEIGHT);
+ BOOST_CHECK_EQUAL(GetTransactionWeight(CTransaction(tx)), MAX_STANDARD_TX_WEIGHT);
+ BOOST_CHECK(orphanage.AddTx(MakeTransactionRef(tx), 0));
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/pmt_tests.cpp b/src/test/pmt_tests.cpp
index 5b7ccc8e7a..2ba48d717a 100644
--- a/src/test/pmt_tests.cpp
+++ b/src/test/pmt_tests.cpp
@@ -17,12 +17,16 @@
class CPartialMerkleTreeTester : public CPartialMerkleTree
{
public:
+ CPartialMerkleTreeTester(FastRandomContext& rng) : m_rng{rng} {}
+
// flip one bit in one of the hashes - this should break the authentication
void Damage() {
- unsigned int n = InsecureRandRange(vHash.size());
- int bit = InsecureRandBits(8);
+ unsigned int n = m_rng.randrange(vHash.size());
+ int bit = m_rng.randbits(8);
*(vHash[n].begin() + (bit>>3)) ^= 1<<(bit&7);
}
+
+ FastRandomContext& m_rng;
};
BOOST_FIXTURE_TEST_SUITE(pmt_tests, BasicTestingSetup)
@@ -59,7 +63,7 @@ BOOST_AUTO_TEST_CASE(pmt_test1)
std::vector<bool> vMatch(nTx, false);
std::vector<uint256> vMatchTxid1;
for (unsigned int j=0; j<nTx; j++) {
- bool fInclude = InsecureRandBits(att / 2) == 0;
+ bool fInclude = m_rng.randbits(att / 2) == 0;
vMatch[j] = fInclude;
if (fInclude)
vMatchTxid1.push_back(vTxid[j]);
@@ -77,7 +81,7 @@ BOOST_AUTO_TEST_CASE(pmt_test1)
BOOST_CHECK(ss.size() <= 10 + (258*n+7)/8);
// deserialize into a tester copy
- CPartialMerkleTreeTester pmt2;
+ CPartialMerkleTreeTester pmt2{m_rng};
ss >> pmt2;
// extract merkle root and matched txids from copy
diff --git a/src/test/pool_tests.cpp b/src/test/pool_tests.cpp
index 5ad4afa3a1..9d15660126 100644
--- a/src/test/pool_tests.cpp
+++ b/src/test/pool_tests.cpp
@@ -129,17 +129,17 @@ BOOST_AUTO_TEST_CASE(random_allocations)
std::vector<PtrSizeAlignment> ptr_size_alignment{};
for (size_t i = 0; i < 1000; ++i) {
// make it a bit more likely to allocate than deallocate
- if (ptr_size_alignment.empty() || 0 != InsecureRandRange(4)) {
+ if (ptr_size_alignment.empty() || 0 != m_rng.randrange(4)) {
// allocate a random item
- std::size_t alignment = std::size_t{1} << InsecureRandRange(8); // 1, 2, ..., 128
- std::size_t size = (InsecureRandRange(200) / alignment + 1) * alignment; // multiple of alignment
+ std::size_t alignment = std::size_t{1} << m_rng.randrange(8); // 1, 2, ..., 128
+ std::size_t size = (m_rng.randrange(200) / alignment + 1) * alignment; // multiple of alignment
void* ptr = resource.Allocate(size, alignment);
BOOST_TEST(ptr != nullptr);
BOOST_TEST((reinterpret_cast<uintptr_t>(ptr) & (alignment - 1)) == 0);
ptr_size_alignment.push_back({ptr, size, alignment});
} else {
// deallocate a random item
- auto& x = ptr_size_alignment[InsecureRandRange(ptr_size_alignment.size())];
+ auto& x = ptr_size_alignment[m_rng.randrange(ptr_size_alignment.size())];
resource.Deallocate(x.ptr, x.bytes, x.alignment);
x = ptr_size_alignment.back();
ptr_size_alignment.pop_back();
diff --git a/src/test/pow_tests.cpp b/src/test/pow_tests.cpp
index 4af66af283..76e4600441 100644
--- a/src/test/pow_tests.cpp
+++ b/src/test/pow_tests.cpp
@@ -147,9 +147,9 @@ BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test)
}
for (int j = 0; j < 1000; j++) {
- CBlockIndex *p1 = &blocks[InsecureRandRange(10000)];
- CBlockIndex *p2 = &blocks[InsecureRandRange(10000)];
- CBlockIndex *p3 = &blocks[InsecureRandRange(10000)];
+ CBlockIndex *p1 = &blocks[m_rng.randrange(10000)];
+ CBlockIndex *p2 = &blocks[m_rng.randrange(10000)];
+ CBlockIndex *p3 = &blocks[m_rng.randrange(10000)];
int64_t tdiff = GetBlockProofEquivalentTime(*p1, *p2, *p3, chainParams->GetConsensus());
BOOST_CHECK_EQUAL(tdiff, p1->GetBlockTime() - p2->GetBlockTime());
@@ -177,7 +177,7 @@ void sanity_check_chainparams(const ArgsManager& args, ChainType chain_type)
// check max target * 4*nPowTargetTimespan doesn't overflow -- see pow.cpp:CalculateNextWorkRequired()
if (!consensus.fPowNoRetargeting) {
- arith_uint256 targ_max{UintToArith256(uint256{"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"})};
+ arith_uint256 targ_max{UintToArith256(uint256{"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"})};
targ_max /= consensus.nPowTargetTimespan*4;
BOOST_CHECK(UintToArith256(consensus.powLimit) < targ_max);
}
diff --git a/src/test/prevector_tests.cpp b/src/test/prevector_tests.cpp
index f5f0cbee58..0588bf9b4a 100644
--- a/src/test/prevector_tests.cpp
+++ b/src/test/prevector_tests.cpp
@@ -27,7 +27,6 @@ class prevector_tester {
typedef typename pretype::size_type Size;
bool passed = true;
- FastRandomContext rand_cache;
uint256 rand_seed;
@@ -208,84 +207,83 @@ public:
BOOST_CHECK_MESSAGE(passed, "insecure_rand: " + rand_seed.ToString());
}
- prevector_tester() {
- SeedRandomForTest();
- rand_seed = InsecureRand256();
- rand_cache.Reseed(rand_seed);
+ prevector_tester(FastRandomContext& rng) {
+ rand_seed = rng.rand256();
+ rng.Reseed(rand_seed);
}
};
BOOST_AUTO_TEST_CASE(PrevectorTestInt)
{
for (int j = 0; j < 64; j++) {
- prevector_tester<8, int> test;
+ prevector_tester<8, int> test{m_rng};
for (int i = 0; i < 2048; i++) {
- if (InsecureRandBits(2) == 0) {
- test.insert(InsecureRandRange(test.size() + 1), int(InsecureRand32()));
+ if (m_rng.randbits(2) == 0) {
+ test.insert(m_rng.randrange(test.size() + 1), int(m_rng.rand32()));
}
- if (test.size() > 0 && InsecureRandBits(2) == 1) {
- test.erase(InsecureRandRange(test.size()));
+ if (test.size() > 0 && m_rng.randbits(2) == 1) {
+ test.erase(m_rng.randrange(test.size()));
}
- if (InsecureRandBits(3) == 2) {
- int new_size = std::max(0, std::min(30, (int)test.size() + (int)InsecureRandRange(5) - 2));
+ if (m_rng.randbits(3) == 2) {
+ int new_size = std::max(0, std::min(30, (int)test.size() + (int)m_rng.randrange(5) - 2));
test.resize(new_size);
}
- if (InsecureRandBits(3) == 3) {
- test.insert(InsecureRandRange(test.size() + 1), 1 + InsecureRandBool(), int(InsecureRand32()));
+ if (m_rng.randbits(3) == 3) {
+ test.insert(m_rng.randrange(test.size() + 1), 1 + m_rng.randbool(), int(m_rng.rand32()));
}
- if (InsecureRandBits(3) == 4) {
- int del = std::min<int>(test.size(), 1 + (InsecureRandBool()));
- int beg = InsecureRandRange(test.size() + 1 - del);
+ if (m_rng.randbits(3) == 4) {
+ int del = std::min<int>(test.size(), 1 + (m_rng.randbool()));
+ int beg = m_rng.randrange(test.size() + 1 - del);
test.erase(beg, beg + del);
}
- if (InsecureRandBits(4) == 5) {
- test.push_back(int(InsecureRand32()));
+ if (m_rng.randbits(4) == 5) {
+ test.push_back(int(m_rng.rand32()));
}
- if (test.size() > 0 && InsecureRandBits(4) == 6) {
+ if (test.size() > 0 && m_rng.randbits(4) == 6) {
test.pop_back();
}
- if (InsecureRandBits(5) == 7) {
+ if (m_rng.randbits(5) == 7) {
int values[4];
- int num = 1 + (InsecureRandBits(2));
+ int num = 1 + (m_rng.randbits(2));
for (int k = 0; k < num; k++) {
- values[k] = int(InsecureRand32());
+ values[k] = int(m_rng.rand32());
}
- test.insert_range(InsecureRandRange(test.size() + 1), values, values + num);
+ test.insert_range(m_rng.randrange(test.size() + 1), values, values + num);
}
- if (InsecureRandBits(5) == 8) {
- int del = std::min<int>(test.size(), 1 + (InsecureRandBits(2)));
- int beg = InsecureRandRange(test.size() + 1 - del);
+ if (m_rng.randbits(5) == 8) {
+ int del = std::min<int>(test.size(), 1 + (m_rng.randbits(2)));
+ int beg = m_rng.randrange(test.size() + 1 - del);
test.erase(beg, beg + del);
}
- if (InsecureRandBits(5) == 9) {
- test.reserve(InsecureRandBits(5));
+ if (m_rng.randbits(5) == 9) {
+ test.reserve(m_rng.randbits(5));
}
- if (InsecureRandBits(6) == 10) {
+ if (m_rng.randbits(6) == 10) {
test.shrink_to_fit();
}
if (test.size() > 0) {
- test.update(InsecureRandRange(test.size()), int(InsecureRand32()));
+ test.update(m_rng.randrange(test.size()), int(m_rng.rand32()));
}
- if (InsecureRandBits(10) == 11) {
+ if (m_rng.randbits(10) == 11) {
test.clear();
}
- if (InsecureRandBits(9) == 12) {
- test.assign(InsecureRandBits(5), int(InsecureRand32()));
+ if (m_rng.randbits(9) == 12) {
+ test.assign(m_rng.randbits(5), int(m_rng.rand32()));
}
- if (InsecureRandBits(3) == 3) {
+ if (m_rng.randbits(3) == 3) {
test.swap();
}
- if (InsecureRandBits(4) == 8) {
+ if (m_rng.randbits(4) == 8) {
test.copy();
}
- if (InsecureRandBits(5) == 18) {
+ if (m_rng.randbits(5) == 18) {
test.move();
}
- if (InsecureRandBits(5) == 19) {
- unsigned int num = 1 + (InsecureRandBits(4));
+ if (m_rng.randbits(5) == 19) {
+ unsigned int num = 1 + (m_rng.randbits(4));
std::vector<int> values(num);
for (int& v : values) {
- v = int(InsecureRand32());
+ v = int(m_rng.rand32());
}
test.resize_uninitialized(values);
}
diff --git a/src/test/raii_event_tests.cpp b/src/test/raii_event_tests.cpp
index ada61029ee..7d1079fbbe 100644
--- a/src/test/raii_event_tests.cpp
+++ b/src/test/raii_event_tests.cpp
@@ -86,14 +86,6 @@ BOOST_AUTO_TEST_CASE(raii_event_order)
event_set_mem_functions(malloc, realloc, free);
}
-#else
-
-BOOST_AUTO_TEST_CASE(raii_event_tests_SKIPPED)
-{
- // It would probably be ideal to report skipped, but boost::test doesn't seem to make that practical (at least not in versions available with common distros)
- BOOST_TEST_MESSAGE("Skipping raii_event_tess: libevent doesn't support event_set_mem_functions");
-}
-
#endif // EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/script_standard_tests.cpp b/src/test/script_standard_tests.cpp
index 6befd9ba85..e9ce82ca8a 100644
--- a/src/test/script_standard_tests.cpp
+++ b/src/test/script_standard_tests.cpp
@@ -16,6 +16,7 @@
#include <univalue.h>
+using namespace util::hex_literals;
BOOST_FIXTURE_TEST_SUITE(script_standard_tests, BasicTestingSetup)
@@ -388,9 +389,9 @@ BOOST_AUTO_TEST_CASE(script_standard_taproot_builder)
BOOST_CHECK_EQUAL(TaprootBuilder::ValidDepths({128,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}), true);
BOOST_CHECK_EQUAL(TaprootBuilder::ValidDepths({129,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}), false);
- XOnlyPubKey key_inner{ParseHex("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798")};
- XOnlyPubKey key_1{ParseHex("c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5")};
- XOnlyPubKey key_2{ParseHex("f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9")};
+ XOnlyPubKey key_inner{"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"_hex_u8};
+ XOnlyPubKey key_1{"c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5"_hex_u8};
+ XOnlyPubKey key_2{"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9"_hex_u8};
CScript script_1 = CScript() << ToByteVector(key_1) << OP_CHECKSIG;
CScript script_2 = CScript() << ToByteVector(key_2) << OP_CHECKSIG;
constexpr uint256 hash_3{"31fe7061656bea2a36aa60a2f7ef940578049273746935d296426dc0afd86b68"};
diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp
index c5a8f2dfbc..0e2a1631ce 100644
--- a/src/test/script_tests.cpp
+++ b/src/test/script_tests.cpp
@@ -35,6 +35,8 @@
// Uncomment if you want to output updated JSON tests.
// #define UPDATE_JSON_TESTS
+using namespace util::hex_literals;
+
static const unsigned int gFlags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC;
unsigned int ParseScriptFlags(std::string strFlags);
@@ -110,8 +112,7 @@ static ScriptError_t ParseScriptError(const std::string& name)
return SCRIPT_ERR_UNKNOWN_ERROR;
}
-BOOST_FIXTURE_TEST_SUITE(script_tests, BasicTestingSetup)
-
+struct ScriptTest : BasicTestingSetup {
void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScriptWitness& scriptWitness, uint32_t flags, const std::string& message, int scriptError, CAmount nValue = 0)
{
bool expect = (scriptError == SCRIPT_ERR_OK);
@@ -128,7 +129,7 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScript
// Verify that removing flags from a passing test or adding flags to a failing test does not change the result.
for (int i = 0; i < 16; ++i) {
- uint32_t extra_flags(InsecureRandBits(16));
+ uint32_t extra_flags(m_rng.randbits(16));
uint32_t combined_flags{expect ? (flags & ~extra_flags) : (flags | extra_flags)};
// Weed out some invalid flag combinations.
if (combined_flags & SCRIPT_VERIFY_CLEANSTACK && ~combined_flags & (SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS)) continue;
@@ -136,6 +137,7 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScript
BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, &scriptWitness, combined_flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue, MissingDataBehavior::ASSERT_FAIL), &err) == expect, message + strprintf(" (with flags %x)", combined_flags));
}
}
+}; // struct ScriptTest
void static NegateSignatureS(std::vector<unsigned char>& vchSig) {
// Parse the signature.
@@ -369,11 +371,11 @@ public:
return *this;
}
- TestBuilder& Test()
+ TestBuilder& Test(ScriptTest& test)
{
TestBuilder copy = *this; // Make a copy so we can rollback the push.
DoPush();
- DoTest(creditTx->vout[0].scriptPubKey, spendTx.vin[0].scriptSig, scriptWitness, flags, comment, scriptError, nValue);
+ test.DoTest(creditTx->vout[0].scriptPubKey, spendTx.vin[0].scriptSig, scriptWitness, flags, comment, scriptError, nValue);
*this = copy;
return *this;
}
@@ -425,6 +427,8 @@ std::string JSONPrettyPrint(const UniValue& univalue)
}
} // namespace
+BOOST_FIXTURE_TEST_SUITE(script_tests, ScriptTest)
+
BOOST_AUTO_TEST_CASE(script_build)
{
const KeyData keys;
@@ -884,7 +888,7 @@ BOOST_AUTO_TEST_CASE(script_build)
std::string strGen;
#endif
for (TestBuilder& test : tests) {
- test.Test();
+ test.Test(*this);
std::string str = JSONPrettyPrint(test.GetJSON());
#ifdef UPDATE_JSON_TESTS
strGen += str + ",\n";
@@ -1265,7 +1269,7 @@ BOOST_AUTO_TEST_CASE(sign_invalid_miniscript)
// Create a Taproot output which contains a leaf in which a non-32 bytes push is used where a public key is expected
// by the Miniscript parser. This offending Script was found by the RPC fuzzer.
- const auto invalid_pubkey{ParseHex("173d36c8c9c9c9ffffffffffff0200000000021e1e37373721361818181818181e1e1e1e19000000000000000000b19292929292926b006c9b9b9292")};
+ const auto invalid_pubkey{"173d36c8c9c9c9ffffffffffff0200000000021e1e37373721361818181818181e1e1e1e19000000000000000000b19292929292926b006c9b9b9292"_hex_u8};
TaprootBuilder builder;
builder.Add(0, {invalid_pubkey}, 0xc0);
builder.Finalize(XOnlyPubKey::NUMS_H);
@@ -1352,10 +1356,16 @@ BOOST_AUTO_TEST_CASE(script_GetScriptAsm)
BOOST_CHECK_EQUAL(derSig + "83 " + pubKey, ScriptToAsmStr(CScript() << ToByteVector(ParseHex(derSig + "83")) << vchPubKey));
}
+template <typename T>
+CScript ToScript(const T& byte_container)
+{
+ auto span{MakeUCharSpan(byte_container)};
+ return {span.begin(), span.end()};
+}
+
static CScript ScriptFromHex(const std::string& str)
{
- std::vector<unsigned char> data = ParseHex(str);
- return CScript(data.begin(), data.end());
+ return ToScript(*Assert(TryParseHex(str)));
}
BOOST_AUTO_TEST_CASE(script_FindAndDelete)
@@ -1383,60 +1393,60 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 4);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0302ff03"); // PUSH 0x02ff03 onto stack
- d = ScriptFromHex("0302ff03");
+ s = ToScript("0302ff03"_hex); // PUSH 0x02ff03 onto stack
+ d = ToScript("0302ff03"_hex);
expect = CScript();
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0302ff030302ff03"); // PUSH 0x2ff03 PUSH 0x2ff03
- d = ScriptFromHex("0302ff03");
+ s = ToScript("0302ff030302ff03"_hex); // PUSH 0x02ff03 PUSH 0x02ff03
+ d = ToScript("0302ff03"_hex);
expect = CScript();
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0302ff030302ff03");
- d = ScriptFromHex("02");
+ s = ToScript("0302ff030302ff03"_hex);
+ d = ToScript("02"_hex);
expect = s; // FindAndDelete matches entire opcodes
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0302ff030302ff03");
- d = ScriptFromHex("ff");
+ s = ToScript("0302ff030302ff03"_hex);
+ d = ToScript("ff"_hex);
expect = s;
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
BOOST_CHECK(s == expect);
// This is an odd edge case: strip of the push-three-bytes
// prefix, leaving 02ff03 which is push-two-bytes:
- s = ScriptFromHex("0302ff030302ff03");
- d = ScriptFromHex("03");
- expect = CScript() << ParseHex("ff03") << ParseHex("ff03");
+ s = ToScript("0302ff030302ff03"_hex);
+ d = ToScript("03"_hex);
+ expect = CScript() << "ff03"_hex_v_u8 << "ff03"_hex_v_u8;
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
BOOST_CHECK(s == expect);
// Byte sequence that spans multiple opcodes:
- s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
- d = ScriptFromHex("feed51");
+ s = ToScript("02feed5169"_hex); // PUSH(0xfeed) OP_1 OP_VERIFY
+ d = ToScript("feed51"_hex);
expect = s;
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0); // doesn't match 'inside' opcodes
BOOST_CHECK(s == expect);
- s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
- d = ScriptFromHex("02feed51");
- expect = ScriptFromHex("69");
+ s = ToScript("02feed5169"_hex); // PUSH(0xfeed) OP_1 OP_VERIFY
+ d = ToScript("02feed51"_hex);
+ expect = ToScript("69"_hex);
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("516902feed5169");
- d = ScriptFromHex("feed51");
+ s = ToScript("516902feed5169"_hex);
+ d = ToScript("feed51"_hex);
expect = s;
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("516902feed5169");
- d = ScriptFromHex("02feed51");
- expect = ScriptFromHex("516969");
+ s = ToScript("516902feed5169"_hex);
+ d = ToScript("02feed51"_hex);
+ expect = ToScript("516969"_hex);
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
@@ -1454,15 +1464,15 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
// Another weird edge case:
// End with invalid push (not enough data)...
- s = ScriptFromHex("0003feed");
- d = ScriptFromHex("03feed"); // ... can remove the invalid push
- expect = ScriptFromHex("00");
+ s = ToScript("0003feed"_hex);
+ d = ToScript("03feed"_hex); // ... can remove the invalid push
+ expect = ToScript("00"_hex);
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0003feed");
- d = ScriptFromHex("00");
- expect = ScriptFromHex("03feed");
+ s = ToScript("0003feed"_hex);
+ d = ToScript("00"_hex);
+ expect = ToScript("03feed"_hex);
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
}
@@ -1471,13 +1481,13 @@ BOOST_AUTO_TEST_CASE(script_HasValidOps)
{
// Exercise the HasValidOps functionality
CScript script;
- script = ScriptFromHex("76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"); // Normal script
+ script = ToScript("76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"_hex); // Normal script
BOOST_CHECK(script.HasValidOps());
- script = ScriptFromHex("76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac");
+ script = ToScript("76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"_hex);
BOOST_CHECK(script.HasValidOps());
- script = ScriptFromHex("ff88ac"); // Script with OP_INVALIDOPCODE explicit
+ script = ToScript("ff88ac"_hex); // Script with OP_INVALIDOPCODE explicit
BOOST_CHECK(!script.HasValidOps());
- script = ScriptFromHex("88acc0"); // Script with undefined opcode
+ script = ToScript("88acc0"_hex); // Script with undefined opcode
BOOST_CHECK(!script.HasValidOps());
}
diff --git a/src/test/serfloat_tests.cpp b/src/test/serfloat_tests.cpp
index 51c026e2ed..4464b0a089 100644
--- a/src/test/serfloat_tests.cpp
+++ b/src/test/serfloat_tests.cpp
@@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE(double_serfloat_tests) {
// These specific bits are the sign bit, and the 2 top and bottom bits of
// exponent and mantissa in the IEEE754 binary64 format.
for (int x = 0; x < 512; ++x) {
- uint64_t v = InsecureRandBits(64);
+ uint64_t v = m_rng.randbits(64);
int x_pos = 0;
for (int v_pos : {0, 1, 50, 51, 52, 53, 61, 62, 63}) {
v &= ~(uint64_t{1} << v_pos);
diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp
index 70a18835d2..d3320878ec 100644
--- a/src/test/sighash_tests.cpp
+++ b/src/test/sighash_tests.cpp
@@ -82,39 +82,41 @@ uint256 static SignatureHashOld(CScript scriptCode, const CTransaction& txTo, un
return ss.GetHash();
}
-void static RandomScript(CScript &script) {
+struct SigHashTest : BasicTestingSetup {
+void RandomScript(CScript &script) {
static const opcodetype oplist[] = {OP_FALSE, OP_1, OP_2, OP_3, OP_CHECKSIG, OP_IF, OP_VERIF, OP_RETURN, OP_CODESEPARATOR};
script = CScript();
- int ops = (InsecureRandRange(10));
+ int ops = (m_rng.randrange(10));
for (int i=0; i<ops; i++)
- script << oplist[InsecureRandRange(std::size(oplist))];
+ script << oplist[m_rng.randrange(std::size(oplist))];
}
-void static RandomTransaction(CMutableTransaction& tx, bool fSingle)
+void RandomTransaction(CMutableTransaction& tx, bool fSingle)
{
- tx.version = InsecureRand32();
+ tx.version = m_rng.rand32();
tx.vin.clear();
tx.vout.clear();
- tx.nLockTime = (InsecureRandBool()) ? InsecureRand32() : 0;
- int ins = (InsecureRandBits(2)) + 1;
- int outs = fSingle ? ins : (InsecureRandBits(2)) + 1;
+ tx.nLockTime = (m_rng.randbool()) ? m_rng.rand32() : 0;
+ int ins = (m_rng.randbits(2)) + 1;
+ int outs = fSingle ? ins : (m_rng.randbits(2)) + 1;
for (int in = 0; in < ins; in++) {
tx.vin.emplace_back();
CTxIn &txin = tx.vin.back();
- txin.prevout.hash = Txid::FromUint256(InsecureRand256());
- txin.prevout.n = InsecureRandBits(2);
+ txin.prevout.hash = Txid::FromUint256(m_rng.rand256());
+ txin.prevout.n = m_rng.randbits(2);
RandomScript(txin.scriptSig);
- txin.nSequence = (InsecureRandBool()) ? InsecureRand32() : std::numeric_limits<uint32_t>::max();
+ txin.nSequence = (m_rng.randbool()) ? m_rng.rand32() : std::numeric_limits<uint32_t>::max();
}
for (int out = 0; out < outs; out++) {
tx.vout.emplace_back();
CTxOut &txout = tx.vout.back();
- txout.nValue = InsecureRandMoneyAmount();
+ txout.nValue = RandMoney(m_rng);
RandomScript(txout.scriptPubKey);
}
}
+}; // struct SigHashTest
-BOOST_FIXTURE_TEST_SUITE(sighash_tests, BasicTestingSetup)
+BOOST_FIXTURE_TEST_SUITE(sighash_tests, SigHashTest)
BOOST_AUTO_TEST_CASE(sighash_test)
{
@@ -126,12 +128,12 @@ BOOST_AUTO_TEST_CASE(sighash_test)
int nRandomTests = 50000;
#endif
for (int i=0; i<nRandomTests; i++) {
- int nHashType{int(InsecureRand32())};
+ int nHashType{int(m_rng.rand32())};
CMutableTransaction txTo;
RandomTransaction(txTo, (nHashType & 0x1f) == SIGHASH_SINGLE);
CScript scriptCode;
RandomScript(scriptCode);
- int nIn = InsecureRandRange(txTo.vin.size());
+ int nIn = m_rng.randrange(txTo.vin.size());
uint256 sh, sho;
sho = SignatureHashOld(scriptCode, CTransaction(txTo), nIn, nHashType);
diff --git a/src/test/skiplist_tests.cpp b/src/test/skiplist_tests.cpp
index 050033e43a..7ffa6f641e 100644
--- a/src/test/skiplist_tests.cpp
+++ b/src/test/skiplist_tests.cpp
@@ -34,8 +34,8 @@ BOOST_AUTO_TEST_CASE(skiplist_test)
}
for (int i=0; i < 1000; i++) {
- int from = InsecureRandRange(SKIPLIST_LENGTH - 1);
- int to = InsecureRandRange(from + 1);
+ int from = m_rng.randrange(SKIPLIST_LENGTH - 1);
+ int to = m_rng.randrange(from + 1);
BOOST_CHECK(vIndex[SKIPLIST_LENGTH - 1].GetAncestor(from) == &vIndex[from]);
BOOST_CHECK(vIndex[from].GetAncestor(to) == &vIndex[to]);
@@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE(getlocator_test)
// Test 100 random starting points for locators.
for (int n=0; n<100; n++) {
- int r = InsecureRandRange(150000);
+ int r = m_rng.randrange(150000);
CBlockIndex* tip = (r < 100000) ? &vBlocksMain[r] : &vBlocksSide[r - 100000];
CBlockLocator locator = GetLocator(tip);
@@ -115,7 +115,7 @@ BOOST_AUTO_TEST_CASE(findearliestatleast_test)
} else {
// randomly choose something in the range [MTP, MTP*2]
int64_t medianTimePast = vBlocksMain[i].GetMedianTimePast();
- int r{int(InsecureRandRange(medianTimePast))};
+ int r{int(m_rng.randrange(medianTimePast))};
vBlocksMain[i].nTime = uint32_t(r + medianTimePast);
vBlocksMain[i].nTimeMax = std::max(vBlocksMain[i].nTime, vBlocksMain[i-1].nTimeMax);
}
@@ -134,7 +134,7 @@ BOOST_AUTO_TEST_CASE(findearliestatleast_test)
// Verify that FindEarliestAtLeast is correct.
for (unsigned int i=0; i<10000; ++i) {
// Pick a random element in vBlocksMain.
- int r = InsecureRandRange(vBlocksMain.size());
+ int r = m_rng.randrange(vBlocksMain.size());
int64_t test_time = vBlocksMain[r].nTime;
CBlockIndex* ret = chain.FindEarliestAtLeast(test_time, 0);
BOOST_CHECK(ret->nTimeMax >= test_time);
diff --git a/src/test/streams_tests.cpp b/src/test/streams_tests.cpp
index 9296cbb41c..9217f05945 100644
--- a/src/test/streams_tests.cpp
+++ b/src/test/streams_tests.cpp
@@ -440,14 +440,14 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
fs::path streams_test_filename = m_args.GetDataDirBase() / "streams_test_tmp";
for (int rep = 0; rep < 50; ++rep) {
AutoFile file{fsbridge::fopen(streams_test_filename, "w+b")};
- size_t fileSize = InsecureRandRange(256);
+ size_t fileSize = m_rng.randrange(256);
for (uint8_t i = 0; i < fileSize; ++i) {
file << i;
}
std::rewind(file.Get());
- size_t bufSize = InsecureRandRange(300) + 1;
- size_t rewindSize = InsecureRandRange(bufSize);
+ size_t bufSize = m_rng.randrange(300) + 1;
+ size_t rewindSize = m_rng.randrange(bufSize);
BufferedFile bf{file, bufSize, rewindSize};
size_t currentPos = 0;
size_t maxPos = 0;
@@ -463,7 +463,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
// sizes; the boundaries of the objects can interact arbitrarily
// with the CBufferFile's internal buffer. These first three
// cases simulate objects of various sizes (1, 2, 5 bytes).
- switch (InsecureRandRange(6)) {
+ switch (m_rng.randrange(6)) {
case 0: {
uint8_t a[1];
if (currentPos + 1 > fileSize)
@@ -503,7 +503,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
case 3: {
// SkipTo is similar to the "read" cases above, except
// we don't receive the data.
- size_t skip_length{static_cast<size_t>(InsecureRandRange(5))};
+ size_t skip_length{static_cast<size_t>(m_rng.randrange(5))};
if (currentPos + skip_length > fileSize) continue;
bf.SetLimit(currentPos + skip_length);
bf.SkipTo(currentPos + skip_length);
@@ -512,7 +512,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
}
case 4: {
// Find a byte value (that is at or ahead of the current position).
- size_t find = currentPos + InsecureRandRange(8);
+ size_t find = currentPos + m_rng.randrange(8);
if (find >= fileSize)
find = fileSize - 1;
bf.FindByte(std::byte(find));
@@ -528,7 +528,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
break;
}
case 5: {
- size_t requestPos = InsecureRandRange(maxPos + 4);
+ size_t requestPos = m_rng.randrange(maxPos + 4);
bool okay = bf.SetPos(requestPos);
// The new position may differ from the requested position
// because we may not be able to rewind beyond the rewind
diff --git a/src/test/system_tests.cpp b/src/test/system_tests.cpp
index baa759e42c..bf50a61327 100644
--- a/src/test/system_tests.cpp
+++ b/src/test/system_tests.cpp
@@ -16,13 +16,6 @@
BOOST_FIXTURE_TEST_SUITE(system_tests, BasicTestingSetup)
-// At least one test is required (in case ENABLE_EXTERNAL_SIGNER is not defined).
-// Workaround for https://github.com/bitcoin/bitcoin/issues/19128
-BOOST_AUTO_TEST_CASE(dummy)
-{
- BOOST_CHECK(true);
-}
-
#ifdef ENABLE_EXTERNAL_SIGNER
BOOST_AUTO_TEST_CASE(run_command)
@@ -54,8 +47,8 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// Return non-zero exit code, with error message for stderr
- const std::string command{"ls nosuchfile"};
- const std::string expected{"No such file or directory"};
+ const std::string command{"python3 -c 'import sys; print(\"err\", file=sys.stderr); sys.exit(2)'"};
+ const std::string expected{"err"};
BOOST_CHECK_EXCEPTION(RunCommandParseJSON(command), std::runtime_error, [&](const std::runtime_error& e) {
const std::string what(e.what());
BOOST_CHECK(what.find(strprintf("RunCommandParseJSON error: process(%s) returned", command)) != std::string::npos);
diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp
index 5622632e97..462abd5222 100644
--- a/src/test/transaction_tests.cpp
+++ b/src/test/transaction_tests.cpp
@@ -39,6 +39,7 @@
#include <univalue.h>
+using namespace util::hex_literals;
using util::SplitString;
using util::ToString;
@@ -263,7 +264,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
BOOST_ERROR("Tx unexpectedly failed with flag " << name << " unset: " << strTest);
}
// Removing random combinations of flags
- flags = TrimFlags(~(verify_flags | (unsigned int)InsecureRandBits(mapFlagNames.size())));
+ flags = TrimFlags(~(verify_flags | (unsigned int)m_rng.randbits(mapFlagNames.size())));
if (!CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues, flags, txdata, strTest, /*expect_valid=*/true)) {
BOOST_ERROR("Tx unexpectedly failed with random flags " << ToString(flags) << ": " << strTest);
}
@@ -354,7 +355,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
BOOST_ERROR("Tx unexpectedly passed with flag " << name << " set: " << strTest);
}
// Adding random combinations of flags
- flags = FillFlags(verify_flags | (unsigned int)InsecureRandBits(mapFlagNames.size()));
+ flags = FillFlags(verify_flags | (unsigned int)m_rng.randbits(mapFlagNames.size()));
if (!CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues, flags, txdata, strTest, /*expect_valid=*/false)) {
BOOST_ERROR("Tx unexpectedly passed with random flags " << name << ": " << strTest);
}
@@ -851,24 +852,24 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
CheckIsNotStandard(t, "scriptpubkey");
// MAX_OP_RETURN_RELAY-byte TxoutType::NULL_DATA (standard)
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"_hex_v_u8;
BOOST_CHECK_EQUAL(MAX_OP_RETURN_RELAY, t.vout[0].scriptPubKey.size());
CheckIsStandard(t);
// MAX_OP_RETURN_RELAY+1-byte TxoutType::NULL_DATA (non-standard)
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3800");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3800"_hex_v_u8;
BOOST_CHECK_EQUAL(MAX_OP_RETURN_RELAY + 1, t.vout[0].scriptPubKey.size());
CheckIsNotStandard(t, "scriptpubkey");
// Data payload can be encoded in any way...
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << ""_hex_v_u8;
CheckIsStandard(t);
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("00") << ParseHex("01");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "00"_hex_v_u8 << "01"_hex_v_u8;
CheckIsStandard(t);
// OP_RESERVED *is* considered to be a PUSHDATA type opcode by IsPushOnly()!
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << OP_RESERVED << -1 << 0 << ParseHex("01") << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16;
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << OP_RESERVED << -1 << 0 << "01"_hex_v_u8 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16;
CheckIsStandard(t);
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << 0 << ParseHex("01") << 2 << ParseHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << 0 << "01"_hex_v_u8 << 2 << "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"_hex_v_u8;
CheckIsStandard(t);
// ...so long as it only contains PUSHDATA's
@@ -882,13 +883,13 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
// Only one TxoutType::NULL_DATA permitted in all cases
t.vout.resize(2);
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"_hex_v_u8;
t.vout[0].nValue = 0;
- t.vout[1].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
+ t.vout[1].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"_hex_v_u8;
t.vout[1].nValue = 0;
CheckIsNotStandard(t, "multi-op-return");
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"_hex_v_u8;
t.vout[1].scriptPubKey = CScript() << OP_RETURN;
CheckIsNotStandard(t, "multi-op-return");
diff --git a/src/test/txpackage_tests.cpp b/src/test/txpackage_tests.cpp
index ca9dc5527d..ea211aedf3 100644
--- a/src/test/txpackage_tests.cpp
+++ b/src/test/txpackage_tests.cpp
@@ -20,20 +20,22 @@
#include <boost/test/unit_test.hpp>
-BOOST_AUTO_TEST_SUITE(txpackage_tests)
+using namespace util::hex_literals;
+
// A fee amount that is above 1sat/vB but below 5sat/vB for most transactions created within these
// unit tests.
static const CAmount low_fee_amt{200};
+struct TxPackageTest : TestChain100Setup {
// Create placeholder transactions that have no meaning.
inline CTransactionRef create_placeholder_tx(size_t num_inputs, size_t num_outputs)
{
CMutableTransaction mtx = CMutableTransaction();
mtx.vin.resize(num_inputs);
mtx.vout.resize(num_outputs);
- auto random_script = CScript() << ToByteVector(InsecureRand256()) << ToByteVector(InsecureRand256());
+ auto random_script = CScript() << ToByteVector(m_rng.rand256()) << ToByteVector(m_rng.rand256());
for (size_t i{0}; i < num_inputs; ++i) {
- mtx.vin[i].prevout.hash = Txid::FromUint256(InsecureRand256());
+ mtx.vin[i].prevout.hash = Txid::FromUint256(m_rng.rand256());
mtx.vin[i].prevout.n = 0;
mtx.vin[i].scriptSig = random_script;
}
@@ -43,25 +45,29 @@ inline CTransactionRef create_placeholder_tx(size_t num_inputs, size_t num_outpu
}
return MakeTransactionRef(mtx);
}
-BOOST_FIXTURE_TEST_CASE(package_hash_tests, TestChain100Setup)
+}; // struct TxPackageTest
+
+BOOST_FIXTURE_TEST_SUITE(txpackage_tests, TxPackageTest)
+
+BOOST_AUTO_TEST_CASE(package_hash_tests)
{
// Random real segwit transaction
DataStream stream_1{
- ParseHex("02000000000101964b8aa63509579ca6086e6012eeaa4c2f4dd1e283da29b67c8eea38b3c6fd220000000000fdffffff0294c618000000000017a9145afbbb42f4e83312666d0697f9e66259912ecde38768fa2c0000000000160014897388a0889390fd0e153a22bb2cf9d8f019faf50247304402200547406380719f84d68cf4e96cc3e4a1688309ef475b150be2b471c70ea562aa02206d255f5acc40fd95981874d77201d2eb07883657ce1c796513f32b6079545cdf0121023ae77335cefcb5ab4c1dc1fb0d2acfece184e593727d7d5906c78e564c7c11d125cf0c00"),
+ "02000000000101964b8aa63509579ca6086e6012eeaa4c2f4dd1e283da29b67c8eea38b3c6fd220000000000fdffffff0294c618000000000017a9145afbbb42f4e83312666d0697f9e66259912ecde38768fa2c0000000000160014897388a0889390fd0e153a22bb2cf9d8f019faf50247304402200547406380719f84d68cf4e96cc3e4a1688309ef475b150be2b471c70ea562aa02206d255f5acc40fd95981874d77201d2eb07883657ce1c796513f32b6079545cdf0121023ae77335cefcb5ab4c1dc1fb0d2acfece184e593727d7d5906c78e564c7c11d125cf0c00"_hex,
};
CTransaction tx_1(deserialize, TX_WITH_WITNESS, stream_1);
CTransactionRef ptx_1{MakeTransactionRef(tx_1)};
// Random real nonsegwit transaction
DataStream stream_2{
- ParseHex("01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"),
+ "01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"_hex,
};
CTransaction tx_2(deserialize, TX_WITH_WITNESS, stream_2);
CTransactionRef ptx_2{MakeTransactionRef(tx_2)};
// Random real segwit transaction
DataStream stream_3{
- ParseHex("0200000000010177862801f77c2c068a70372b4c435ef8dd621291c36a64eb4dd491f02218f5324600000000fdffffff014a0100000000000022512035ea312034cfac01e956a269f3bf147f569c2fbb00180677421262da042290d803402be713325ff285e66b0380f53f2fae0d0fb4e16f378a440fed51ce835061437566729d4883bc917632f3cff474d6384bc8b989961a1d730d4a87ed38ad28bd337b20f1d658c6c138b1c312e072b4446f50f01ae0da03a42e6274f8788aae53416a7fac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800357b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a224342414c222c22616d74223a2236393639227d6821c1f1d658c6c138b1c312e072b4446f50f01ae0da03a42e6274f8788aae53416a7f00000000"),
+ "0200000000010177862801f77c2c068a70372b4c435ef8dd621291c36a64eb4dd491f02218f5324600000000fdffffff014a0100000000000022512035ea312034cfac01e956a269f3bf147f569c2fbb00180677421262da042290d803402be713325ff285e66b0380f53f2fae0d0fb4e16f378a440fed51ce835061437566729d4883bc917632f3cff474d6384bc8b989961a1d730d4a87ed38ad28bd337b20f1d658c6c138b1c312e072b4446f50f01ae0da03a42e6274f8788aae53416a7fac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800357b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a224342414c222c22616d74223a2236393639227d6821c1f1d658c6c138b1c312e072b4446f50f01ae0da03a42e6274f8788aae53416a7f00000000"_hex,
};
CTransaction tx_3(deserialize, TX_WITH_WITNESS, stream_3);
CTransactionRef ptx_3{MakeTransactionRef(tx_3)};
@@ -124,7 +130,7 @@ BOOST_FIXTURE_TEST_CASE(package_hash_tests, TestChain100Setup)
BOOST_CHECK_EQUAL(calculated_hash_123, GetPackageHash(package_321));
}
-BOOST_FIXTURE_TEST_CASE(package_sanitization_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_sanitization_tests)
{
// Packages can't have more than 25 transactions.
Package package_too_many;
@@ -167,7 +173,7 @@ BOOST_FIXTURE_TEST_CASE(package_sanitization_tests, TestChain100Setup)
// Packages can't have transactions spending the same prevout
CMutableTransaction tx_zero_1;
CMutableTransaction tx_zero_2;
- COutPoint same_prevout{Txid::FromUint256(InsecureRand256()), 0};
+ COutPoint same_prevout{Txid::FromUint256(m_rng.rand256()), 0};
tx_zero_1.vin.emplace_back(same_prevout);
tx_zero_2.vin.emplace_back(same_prevout);
// Different vouts (not the same tx)
@@ -185,7 +191,7 @@ BOOST_FIXTURE_TEST_CASE(package_sanitization_tests, TestChain100Setup)
// IsConsistentPackage only cares about conflicts between transactions, not about a transaction
// conflicting with itself (i.e. duplicate prevouts in vin).
CMutableTransaction dup_tx;
- const COutPoint rand_prevout{Txid::FromUint256(InsecureRand256()), 0};
+ const COutPoint rand_prevout{Txid::FromUint256(m_rng.rand256()), 0};
dup_tx.vin.emplace_back(rand_prevout);
dup_tx.vin.emplace_back(rand_prevout);
Package package_with_dup_tx{MakeTransactionRef(dup_tx)};
@@ -194,7 +200,7 @@ BOOST_FIXTURE_TEST_CASE(package_sanitization_tests, TestChain100Setup)
BOOST_CHECK(IsConsistentPackage(package_with_dup_tx));
}
-BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_validation_tests)
{
LOCK(cs_main);
unsigned int initialPoolSize = m_node.mempool->size();
@@ -249,7 +255,7 @@ BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
BOOST_CHECK_EQUAL(m_node.mempool->size(), initialPoolSize);
}
-BOOST_FIXTURE_TEST_CASE(noncontextual_package_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(noncontextual_package_tests)
{
// The signatures won't be verified so we can just use a placeholder
CKey placeholder_key = GenerateRandomKey();
@@ -345,7 +351,7 @@ BOOST_FIXTURE_TEST_CASE(noncontextual_package_tests, TestChain100Setup)
}
}
-BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_submission_tests)
{
LOCK(cs_main);
unsigned int expected_pool_size = m_node.mempool->size();
@@ -488,7 +494,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
// Tests for packages containing transactions that have same-txid-different-witness equivalents in
// the mempool.
-BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_witness_swap_tests)
{
// Mine blocks to mature coinbases.
mineBlocks(5);
@@ -722,7 +728,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
}
}
-BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_cpfp_tests)
{
mineBlocks(5);
MockMempoolMinFee(CFeeRate(5000));
@@ -933,7 +939,7 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
}
}
-BOOST_FIXTURE_TEST_CASE(package_rbf_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_rbf_tests)
{
mineBlocks(5);
LOCK(::cs_main);
diff --git a/src/test/txrequest_tests.cpp b/src/test/txrequest_tests.cpp
index 0ca70d2c7a..6bb732ba69 100644
--- a/src/test/txrequest_tests.cpp
+++ b/src/test/txrequest_tests.cpp
@@ -15,10 +15,23 @@
#include <boost/test/unit_test.hpp>
-BOOST_FIXTURE_TEST_SUITE(txrequest_tests, BasicTestingSetup)
-
namespace {
+class Scenario;
+
+struct TxRequestTest : BasicTestingSetup {
+ std::chrono::microseconds RandomTime8s();
+ std::chrono::microseconds RandomTime1y();
+ void BuildSingleTest(Scenario& scenario, int config);
+ void BuildPriorityTest(Scenario& scenario, int config);
+ void BuildBigPriorityTest(Scenario& scenario, int peers);
+ void BuildRequestOrderTest(Scenario& scenario, int config);
+ void BuildWtxidTest(Scenario& scenario, int config);
+ void BuildTimeBackwardsTest(Scenario& scenario);
+ void BuildWeirdRequestsTest(Scenario& scenario);
+ void TestInterleavedScenarios();
+};
+
constexpr std::chrono::microseconds MIN_TIME = std::chrono::microseconds::min();
constexpr std::chrono::microseconds MAX_TIME = std::chrono::microseconds::max();
constexpr std::chrono::microseconds MICROSECOND = std::chrono::microseconds{1};
@@ -51,8 +64,8 @@ struct Runner
std::multiset<std::pair<NodeId, GenTxid>> expired;
};
-std::chrono::microseconds RandomTime8s() { return std::chrono::microseconds{1 + InsecureRandBits(23)}; }
-std::chrono::microseconds RandomTime1y() { return std::chrono::microseconds{1 + InsecureRandBits(45)}; }
+std::chrono::microseconds TxRequestTest::RandomTime8s() { return std::chrono::microseconds{1 + m_rng.randbits(23)}; }
+std::chrono::microseconds TxRequestTest::RandomTime1y() { return std::chrono::microseconds{1 + m_rng.randbits(45)}; }
/** A proxy for a Runner that helps build a sequence of consecutive test actions on a TxRequestTracker.
*
@@ -65,12 +78,13 @@ std::chrono::microseconds RandomTime1y() { return std::chrono::microseconds{1 +
*/
class Scenario
{
+ FastRandomContext& m_rng;
Runner& m_runner;
std::chrono::microseconds m_now;
std::string m_testname;
public:
- Scenario(Runner& runner, std::chrono::microseconds starttime) : m_runner(runner), m_now(starttime) {}
+ Scenario(FastRandomContext& rng, Runner& runner, std::chrono::microseconds starttime) : m_rng(rng), m_runner(runner), m_now(starttime) {}
/** Set a name for the current test, to give more clear error messages. */
void SetTestName(std::string testname)
@@ -199,7 +213,7 @@ public:
uint256 ret;
bool ok;
do {
- ret = InsecureRand256();
+ ret = m_rng.rand256();
ok = true;
for (const auto& order : orders) {
for (size_t pos = 1; pos < order.size(); ++pos) {
@@ -222,7 +236,7 @@ public:
/** Generate a random GenTxid; the txhash follows NewTxHash; the is_wtxid flag is random. */
GenTxid NewGTxid(const std::vector<std::vector<NodeId>>& orders = {})
{
- return InsecureRandBool() ? GenTxid::Wtxid(NewTxHash(orders)) : GenTxid::Txid(NewTxHash(orders));
+ return m_rng.randbool() ? GenTxid::Wtxid(NewTxHash(orders)) : GenTxid::Txid(NewTxHash(orders));
}
/** Generate a new random NodeId to use as peer. The same NodeId is never returned twice
@@ -232,7 +246,7 @@ public:
bool ok;
NodeId ret;
do {
- ret = InsecureRandBits(63);
+ ret = m_rng.randbits(63);
ok = m_runner.peerset.insert(ret).second;
} while(!ok);
return ret;
@@ -245,7 +259,7 @@ public:
*
* config is an integer in [0, 32), which controls which variant of the test is used.
*/
-void BuildSingleTest(Scenario& scenario, int config)
+void TxRequestTest::BuildSingleTest(Scenario& scenario, int config)
{
auto peer = scenario.NewPeer();
auto gtxid = scenario.NewGTxid();
@@ -282,7 +296,7 @@ void BuildSingleTest(Scenario& scenario, int config)
scenario.CheckExpired(peer, gtxid);
return;
} else {
- scenario.AdvanceTime(std::chrono::microseconds{InsecureRandRange(expiry.count())});
+ scenario.AdvanceTime(std::chrono::microseconds{m_rng.randrange(expiry.count())});
scenario.Check(peer, {}, 0, 1, 0, "s9");
if ((config >> 3) == 3) { // A response will arrive for the transaction
scenario.ReceivedResponse(peer, gtxid.GetHash());
@@ -305,7 +319,7 @@ void BuildSingleTest(Scenario& scenario, int config)
*
* config is an integer in [0, 32), which controls which variant of the test is used.
*/
-void BuildPriorityTest(Scenario& scenario, int config)
+void TxRequestTest::BuildPriorityTest(Scenario& scenario, int config)
{
scenario.SetTestName(strprintf("Priority(config=%i)", config));
@@ -319,7 +333,7 @@ void BuildPriorityTest(Scenario& scenario, int config)
scenario.ReceivedInv(peer1, gtxid, pref1, MIN_TIME);
scenario.Check(peer1, {gtxid}, 1, 0, 0, "p1");
- if (InsecureRandBool()) {
+ if (m_rng.randbool()) {
scenario.AdvanceTime(RandomTime8s());
scenario.Check(peer1, {gtxid}, 1, 0, 0, "p2");
}
@@ -335,7 +349,7 @@ void BuildPriorityTest(Scenario& scenario, int config)
NodeId priopeer = stage2_prio ? peer2 : peer1, otherpeer = stage2_prio ? peer1 : peer2;
scenario.Check(otherpeer, {}, 1, 0, 0, "p3");
scenario.Check(priopeer, {gtxid}, 1, 0, 0, "p4");
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.Check(otherpeer, {}, 1, 0, 0, "p5");
scenario.Check(priopeer, {gtxid}, 1, 0, 0, "p6");
@@ -344,7 +358,7 @@ void BuildPriorityTest(Scenario& scenario, int config)
scenario.RequestedTx(priopeer, gtxid.GetHash(), MAX_TIME);
scenario.Check(priopeer, {}, 0, 1, 0, "p7");
scenario.Check(otherpeer, {}, 1, 0, 0, "p8");
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
}
// The peer which was selected (or requested from) now goes offline, or a NOTFOUND is received from them.
@@ -353,28 +367,28 @@ void BuildPriorityTest(Scenario& scenario, int config)
} else {
scenario.ReceivedResponse(priopeer, gtxid.GetHash());
}
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.Check(priopeer, {}, 0, 0, !(config & 16), "p8");
scenario.Check(otherpeer, {gtxid}, 1, 0, 0, "p9");
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
// Now the other peer goes offline.
scenario.DisconnectedPeer(otherpeer);
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.Check(peer1, {}, 0, 0, 0, "p10");
scenario.Check(peer2, {}, 0, 0, 0, "p11");
}
/** Add to scenario a randomized test in which N peers announce the same transaction, to verify
* the order in which they are requested. */
-void BuildBigPriorityTest(Scenario& scenario, int peers)
+void TxRequestTest::BuildBigPriorityTest(Scenario& scenario, int peers)
{
scenario.SetTestName(strprintf("BigPriority(peers=%i)", peers));
// We will have N peers announce the same transaction.
std::map<NodeId, bool> preferred;
std::vector<NodeId> pref_peers, npref_peers;
- int num_pref = InsecureRandRange(peers + 1) ; // Some preferred, ...
+ int num_pref = m_rng.randrange(peers + 1) ; // Some preferred, ...
int num_npref = peers - num_pref; // some not preferred.
for (int i = 0; i < num_pref; ++i) {
pref_peers.push_back(scenario.NewPeer());
@@ -392,7 +406,7 @@ void BuildBigPriorityTest(Scenario& scenario, int peers)
// Determine the announcement order randomly.
std::vector<NodeId> announce_order = request_order;
- std::shuffle(announce_order.begin(), announce_order.end(), g_insecure_rand_ctx);
+ std::shuffle(announce_order.begin(), announce_order.end(), m_rng);
// Find a gtxid whose txhash prioritization is consistent with the required ordering within pref_peers and
// within npref_peers.
@@ -427,11 +441,11 @@ void BuildBigPriorityTest(Scenario& scenario, int peers)
// Peers now in random order go offline, or send NOTFOUNDs. At every point in time the new to-be-requested-from
// peer should be the best remaining one, so verify this after every response.
for (int i = 0; i < peers; ++i) {
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
- const int pos = InsecureRandRange(request_order.size());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
+ const int pos = m_rng.randrange(request_order.size());
const auto peer = request_order[pos];
request_order.erase(request_order.begin() + pos);
- if (InsecureRandBool()) {
+ if (m_rng.randbool()) {
scenario.DisconnectedPeer(peer);
scenario.Check(peer, {}, 0, 0, 0, "b4");
} else {
@@ -454,7 +468,7 @@ void BuildBigPriorityTest(Scenario& scenario, int peers)
*
* config is an integer in [0, 4) inclusive, and selects the variant of the test.
*/
-void BuildRequestOrderTest(Scenario& scenario, int config)
+void TxRequestTest::BuildRequestOrderTest(Scenario& scenario, int config)
{
scenario.SetTestName(strprintf("RequestOrder(config=%i)", config));
@@ -489,7 +503,7 @@ void BuildRequestOrderTest(Scenario& scenario, int config)
*
* config is an integer in [0, 4) inclusive, and selects the variant of the test used.
*/
-void BuildWtxidTest(Scenario& scenario, int config)
+void TxRequestTest::BuildWtxidTest(Scenario& scenario, int config)
{
scenario.SetTestName(strprintf("Wtxid(config=%i)", config));
@@ -499,17 +513,17 @@ void BuildWtxidTest(Scenario& scenario, int config)
auto txid{GenTxid::Txid(txhash)};
auto wtxid{GenTxid::Wtxid(txhash)};
- auto reqtimeT = InsecureRandBool() ? MIN_TIME : scenario.Now() + RandomTime8s();
- auto reqtimeW = InsecureRandBool() ? MIN_TIME : scenario.Now() + RandomTime8s();
+ auto reqtimeT = m_rng.randbool() ? MIN_TIME : scenario.Now() + RandomTime8s();
+ auto reqtimeW = m_rng.randbool() ? MIN_TIME : scenario.Now() + RandomTime8s();
// Announce txid first or wtxid first.
if (config & 1) {
scenario.ReceivedInv(peerT, txid, config & 2, reqtimeT);
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peerW, wtxid, !(config & 2), reqtimeW);
} else {
scenario.ReceivedInv(peerW, wtxid, !(config & 2), reqtimeW);
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peerT, txid, config & 2, reqtimeT);
}
@@ -552,14 +566,14 @@ void BuildWtxidTest(Scenario& scenario, int config)
// If a good transaction with either that hash as wtxid or txid arrives, both
// announcements are gone.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ForgetTxHash(txhash);
scenario.Check(peerT, {}, 0, 0, 0, "w13");
scenario.Check(peerW, {}, 0, 0, 0, "w14");
}
/** Add to scenario a test that exercises clocks that go backwards. */
-void BuildTimeBackwardsTest(Scenario& scenario)
+void TxRequestTest::BuildTimeBackwardsTest(Scenario& scenario)
{
auto peer1 = scenario.NewPeer();
auto peer2 = scenario.NewPeer();
@@ -577,13 +591,13 @@ void BuildTimeBackwardsTest(Scenario& scenario)
scenario.Check(peer2, {gtxid}, 1, 0, 0, "r4");
// Announce from peer1.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peer1, gtxid, true, MAX_TIME);
scenario.Check(peer2, {gtxid}, 1, 0, 0, "r5");
scenario.Check(peer1, {}, 1, 0, 0, "r6");
// Request from peer1.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
auto expiry = scenario.Now() + RandomTime8s();
scenario.RequestedTx(peer1, gtxid.GetHash(), expiry);
scenario.Check(peer1, {}, 0, 1, 0, "r7");
@@ -598,14 +612,14 @@ void BuildTimeBackwardsTest(Scenario& scenario)
scenario.Check(peer2, {gtxid}, 1, 0, 0, "r12", -MICROSECOND);
// Peer2 goes offline, meaning no viable announcements remain.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.DisconnectedPeer(peer2);
scenario.Check(peer1, {}, 0, 0, 0, "r13");
scenario.Check(peer2, {}, 0, 0, 0, "r14");
}
/** Add to scenario a test that involves RequestedTx() calls for txhashes not returned by GetRequestable. */
-void BuildWeirdRequestsTest(Scenario& scenario)
+void TxRequestTest::BuildWeirdRequestsTest(Scenario& scenario)
{
auto peer1 = scenario.NewPeer();
auto peer2 = scenario.NewPeer();
@@ -617,19 +631,19 @@ void BuildWeirdRequestsTest(Scenario& scenario)
scenario.Check(peer1, {gtxid1}, 1, 0, 0, "q1");
// Announce gtxid2 by peer2.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peer2, gtxid2, true, MIN_TIME);
scenario.Check(peer1, {gtxid1}, 1, 0, 0, "q2");
scenario.Check(peer2, {gtxid2}, 1, 0, 0, "q3");
// We request gtxid2 from *peer1* - no effect.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.RequestedTx(peer1, gtxid2.GetHash(), MAX_TIME);
scenario.Check(peer1, {gtxid1}, 1, 0, 0, "q4");
scenario.Check(peer2, {gtxid2}, 1, 0, 0, "q5");
// Now request gtxid1 from peer1 - marks it as REQUESTED.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
auto expiryA = scenario.Now() + RandomTime8s();
scenario.RequestedTx(peer1, gtxid1.GetHash(), expiryA);
scenario.Check(peer1, {}, 0, 1, 0, "q6");
@@ -653,25 +667,25 @@ void BuildWeirdRequestsTest(Scenario& scenario)
scenario.CheckExpired(peer1, gtxid1);
// Requesting it yet again from peer1 doesn't do anything, as it's already COMPLETED.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.RequestedTx(peer1, gtxid1.GetHash(), MAX_TIME);
scenario.Check(peer1, {}, 0, 0, 1, "q14");
scenario.Check(peer2, {gtxid2, gtxid1}, 2, 0, 0, "q15");
// Now announce gtxid2 from peer1.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peer1, gtxid2, true, MIN_TIME);
scenario.Check(peer1, {}, 1, 0, 1, "q16");
scenario.Check(peer2, {gtxid2, gtxid1}, 2, 0, 0, "q17");
// And request it from peer1 (weird as peer2 has the preference).
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.RequestedTx(peer1, gtxid2.GetHash(), MAX_TIME);
scenario.Check(peer1, {}, 0, 1, 1, "q18");
scenario.Check(peer2, {gtxid1}, 2, 0, 0, "q19");
// If peer2 now (normally) requests gtxid2, the existing request by peer1 becomes COMPLETED.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.RequestedTx(peer2, gtxid2.GetHash(), MAX_TIME);
scenario.Check(peer1, {}, 0, 0, 2, "q20");
scenario.Check(peer2, {gtxid1}, 1, 1, 0, "q21");
@@ -682,22 +696,22 @@ void BuildWeirdRequestsTest(Scenario& scenario)
scenario.Check(peer2, {}, 0, 0, 0, "q23");
}
-void TestInterleavedScenarios()
+void TxRequestTest::TestInterleavedScenarios()
{
// Create a list of functions which add tests to scenarios.
std::vector<std::function<void(Scenario&)>> builders;
// Add instances of every test, for every configuration.
for (int n = 0; n < 64; ++n) {
- builders.emplace_back([n](Scenario& scenario){ BuildWtxidTest(scenario, n); });
- builders.emplace_back([n](Scenario& scenario){ BuildRequestOrderTest(scenario, n & 3); });
- builders.emplace_back([n](Scenario& scenario){ BuildSingleTest(scenario, n & 31); });
- builders.emplace_back([n](Scenario& scenario){ BuildPriorityTest(scenario, n & 31); });
- builders.emplace_back([n](Scenario& scenario){ BuildBigPriorityTest(scenario, (n & 7) + 1); });
- builders.emplace_back([](Scenario& scenario){ BuildTimeBackwardsTest(scenario); });
- builders.emplace_back([](Scenario& scenario){ BuildWeirdRequestsTest(scenario); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildWtxidTest(scenario, n); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildRequestOrderTest(scenario, n & 3); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildSingleTest(scenario, n & 31); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildPriorityTest(scenario, n & 31); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildBigPriorityTest(scenario, (n & 7) + 1); });
+ builders.emplace_back([this](Scenario& scenario) { BuildTimeBackwardsTest(scenario); });
+ builders.emplace_back([this](Scenario& scenario) { BuildWeirdRequestsTest(scenario); });
}
// Randomly shuffle all those functions.
- std::shuffle(builders.begin(), builders.end(), g_insecure_rand_ctx);
+ std::shuffle(builders.begin(), builders.end(), m_rng);
Runner runner;
auto starttime = RandomTime1y();
@@ -706,7 +720,7 @@ void TestInterleavedScenarios()
// Introduce some variation in the start time of each scenario, so they don't all start off
// concurrently, but get a more random interleaving.
auto scenario_start = starttime + RandomTime8s() + RandomTime8s() + RandomTime8s();
- Scenario scenario(runner, scenario_start);
+ Scenario scenario(m_rng, runner, scenario_start);
for (int j = 0; builders.size() && j < 10; ++j) {
builders.back()(scenario);
builders.pop_back();
@@ -730,6 +744,8 @@ void TestInterleavedScenarios()
} // namespace
+BOOST_FIXTURE_TEST_SUITE(txrequest_tests, TxRequestTest)
+
BOOST_AUTO_TEST_CASE(TxRequestTest)
{
for (int i = 0; i < 5; ++i) {
diff --git a/src/test/uint256_tests.cpp b/src/test/uint256_tests.cpp
index 2ba3227174..142d7a6fde 100644
--- a/src/test/uint256_tests.cpp
+++ b/src/test/uint256_tests.cpp
@@ -2,7 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <arith_uint256.h>
#include <streams.h>
#include <test/util/setup_common.h>
#include <uint256.h>
@@ -61,14 +60,6 @@ static std::string ArrayToString(const unsigned char A[], unsigned int width)
return Stream.str();
}
-// Takes hex string in reverse byte order.
-inline uint160 uint160S(std::string_view str)
-{
- uint160 rv;
- rv.SetHexDeprecated(str);
- return rv;
-}
-
BOOST_AUTO_TEST_CASE( basics ) // constructors, equality, inequality
{
// constructor uint256(vector<char>):
@@ -92,33 +83,22 @@ BOOST_AUTO_TEST_CASE( basics ) // constructors, equality, inequality
BOOST_CHECK_NE(MaxL, ZeroL); BOOST_CHECK_NE(MaxS, ZeroS);
// String Constructor and Copy Constructor
- BOOST_CHECK_EQUAL(uint256S("0x"+R1L.ToString()), R1L);
- BOOST_CHECK_EQUAL(uint256S("0x"+R2L.ToString()), R2L);
- BOOST_CHECK_EQUAL(uint256S("0x"+ZeroL.ToString()), ZeroL);
- BOOST_CHECK_EQUAL(uint256S("0x"+OneL.ToString()), OneL);
- BOOST_CHECK_EQUAL(uint256S("0x"+MaxL.ToString()), MaxL);
- BOOST_CHECK_EQUAL(uint256S(R1L.ToString()), R1L);
- BOOST_CHECK_EQUAL(uint256S(" 0x"+R1L.ToString()+" "), R1L);
- BOOST_CHECK_EQUAL(uint256S(" 0x"+R1L.ToString()+"-trash;%^& "), R1L);
- BOOST_CHECK_EQUAL(uint256S("\t \n \n \f\n\r\t\v\t 0x"+R1L.ToString()+" \t \n \n \f\n\r\t\v\t "), R1L);
- BOOST_CHECK_EQUAL(uint256S(""), ZeroL);
- BOOST_CHECK_EQUAL(uint256S("1"), OneL);
- BOOST_CHECK_EQUAL(R1L, uint256S(R1ArrayHex));
+ BOOST_CHECK_EQUAL(uint256::FromHex(R1L.ToString()).value(), R1L);
+ BOOST_CHECK_EQUAL(uint256::FromHex(R2L.ToString()).value(), R2L);
+ BOOST_CHECK_EQUAL(uint256::FromHex(ZeroL.ToString()).value(), ZeroL);
+ BOOST_CHECK_EQUAL(uint256::FromHex(OneL.ToString()).value(), OneL);
+ BOOST_CHECK_EQUAL(uint256::FromHex(MaxL.ToString()).value(), MaxL);
+ BOOST_CHECK_EQUAL(uint256::FromHex(R1ArrayHex).value(), R1L);
BOOST_CHECK_EQUAL(uint256(R1L), R1L);
BOOST_CHECK_EQUAL(uint256(ZeroL), ZeroL);
BOOST_CHECK_EQUAL(uint256(OneL), OneL);
- BOOST_CHECK_EQUAL(uint160S("0x"+R1S.ToString()), R1S);
- BOOST_CHECK_EQUAL(uint160S("0x"+R2S.ToString()), R2S);
- BOOST_CHECK_EQUAL(uint160S("0x"+ZeroS.ToString()), ZeroS);
- BOOST_CHECK_EQUAL(uint160S("0x"+OneS.ToString()), OneS);
- BOOST_CHECK_EQUAL(uint160S("0x"+MaxS.ToString()), MaxS);
- BOOST_CHECK_EQUAL(uint160S(R1S.ToString()), R1S);
- BOOST_CHECK_EQUAL(uint160S(" 0x"+R1S.ToString()+" "), R1S);
- BOOST_CHECK_EQUAL(uint160S(" 0x"+R1S.ToString()+"-trash;%^& "), R1S);
- BOOST_CHECK_EQUAL(uint160S(" \t \n \n \f\n\r\t\v\t 0x"+R1S.ToString()+" \t \n \n \f\n\r\t\v\t"), R1S);
- BOOST_CHECK_EQUAL(uint160S(""), ZeroS);
- BOOST_CHECK_EQUAL(R1S, uint160S(R1ArrayHex));
+ BOOST_CHECK_EQUAL(uint160::FromHex(R1S.ToString()).value(), R1S);
+ BOOST_CHECK_EQUAL(uint160::FromHex(R2S.ToString()).value(), R2S);
+ BOOST_CHECK_EQUAL(uint160::FromHex(ZeroS.ToString()).value(), ZeroS);
+ BOOST_CHECK_EQUAL(uint160::FromHex(OneS.ToString()).value(), OneS);
+ BOOST_CHECK_EQUAL(uint160::FromHex(MaxS.ToString()).value(), MaxS);
+ BOOST_CHECK_EQUAL(uint160::FromHex(std::string_view{R1ArrayHex + 24, 40}).value(), R1S);
BOOST_CHECK_EQUAL(uint160(R1S), R1S);
BOOST_CHECK_EQUAL(uint160(ZeroS), ZeroS);
@@ -264,82 +244,6 @@ BOOST_AUTO_TEST_CASE(methods) // GetHex SetHexDeprecated FromHex begin() end() s
ss.clear();
}
-BOOST_AUTO_TEST_CASE( conversion )
-{
- BOOST_CHECK_EQUAL(ArithToUint256(UintToArith256(ZeroL)), ZeroL);
- BOOST_CHECK_EQUAL(ArithToUint256(UintToArith256(OneL)), OneL);
- BOOST_CHECK_EQUAL(ArithToUint256(UintToArith256(R1L)), R1L);
- BOOST_CHECK_EQUAL(ArithToUint256(UintToArith256(R2L)), R2L);
- BOOST_CHECK_EQUAL(UintToArith256(ZeroL), 0);
- BOOST_CHECK_EQUAL(UintToArith256(OneL), 1);
- BOOST_CHECK_EQUAL(ArithToUint256(0), ZeroL);
- BOOST_CHECK_EQUAL(ArithToUint256(1), OneL);
- BOOST_CHECK_EQUAL(arith_uint256(UintToArith256(uint256S(R1L.GetHex()))), UintToArith256(R1L));
- BOOST_CHECK_EQUAL(arith_uint256(UintToArith256(uint256S(R2L.GetHex()))), UintToArith256(R2L));
- BOOST_CHECK_EQUAL(R1L.GetHex(), UintToArith256(R1L).GetHex());
- BOOST_CHECK_EQUAL(R2L.GetHex(), UintToArith256(R2L).GetHex());
-}
-
-BOOST_AUTO_TEST_CASE( operator_with_self )
-{
-
-/* Clang 16 and earlier detects v -= v and v /= v as self-assignments
- to 0 and 1 respectively.
- See: https://github.com/llvm/llvm-project/issues/42469
- and the fix in commit c5302325b2a62d77cf13dd16cd5c19141862fed0 .
-
- This makes some sense for arithmetic classes, but could be considered a bug
- elsewhere. Disable the warning here so that the code can be tested, but the
- warning should remain on as there will likely always be a better way to
- express this.
-*/
-
-#if defined(__clang__)
-# pragma clang diagnostic push
-# pragma clang diagnostic ignored "-Wself-assign-overloaded"
-#endif
- arith_uint256 v = UintToArith256(uint256S("02"));
- v *= v;
- BOOST_CHECK_EQUAL(v, UintToArith256(uint256S("04")));
- v /= v;
- BOOST_CHECK_EQUAL(v, UintToArith256(uint256S("01")));
- v += v;
- BOOST_CHECK_EQUAL(v, UintToArith256(uint256S("02")));
- v -= v;
- BOOST_CHECK_EQUAL(v, UintToArith256(uint256S("0")));
-#if defined(__clang__)
-# pragma clang diagnostic pop
-#endif
-}
-
-BOOST_AUTO_TEST_CASE(parse)
-{
- {
- std::string s_12{"0000000000000000000000000000000000000000000000000000000000000012"};
- BOOST_CHECK_EQUAL(uint256S("12\0").GetHex(), s_12);
- BOOST_CHECK_EQUAL(uint256S(std::string_view{"12\0", 3}).GetHex(), s_12);
- BOOST_CHECK_EQUAL(uint256S("0x12").GetHex(), s_12);
- BOOST_CHECK_EQUAL(uint256S(" 0x12").GetHex(), s_12);
- BOOST_CHECK_EQUAL(uint256S(" 12").GetHex(), s_12);
- }
- {
- std::string s_1{uint256::ONE.GetHex()};
- BOOST_CHECK_EQUAL(uint256S("1\0").GetHex(), s_1);
- BOOST_CHECK_EQUAL(uint256S(std::string_view{"1\0", 2}).GetHex(), s_1);
- BOOST_CHECK_EQUAL(uint256S("0x1").GetHex(), s_1);
- BOOST_CHECK_EQUAL(uint256S(" 0x1").GetHex(), s_1);
- BOOST_CHECK_EQUAL(uint256S(" 1").GetHex(), s_1);
- }
- {
- std::string s_0{uint256::ZERO.GetHex()};
- BOOST_CHECK_EQUAL(uint256S("\0").GetHex(), s_0);
- BOOST_CHECK_EQUAL(uint256S(std::string_view{"\0", 1}).GetHex(), s_0);
- BOOST_CHECK_EQUAL(uint256S("0x").GetHex(), s_0);
- BOOST_CHECK_EQUAL(uint256S(" 0x").GetHex(), s_0);
- BOOST_CHECK_EQUAL(uint256S(" ").GetHex(), s_0);
- }
-}
-
/**
* Implemented as a templated function so it can be reused by other classes that have a FromHex()
* method that wraps base_blob::FromHex(), such as transaction_identifier::FromHex().
@@ -393,6 +297,35 @@ BOOST_AUTO_TEST_CASE(from_hex)
TestFromHex<Wtxid>();
}
+BOOST_AUTO_TEST_CASE(from_user_hex)
+{
+ BOOST_CHECK_EQUAL(uint256::FromUserHex(""), uint256::ZERO);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("0x"), uint256::ZERO);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("0"), uint256::ZERO);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("00"), uint256::ZERO);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("1"), uint256::ONE);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("0x10"), uint256{0x10});
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("10"), uint256{0x10});
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("0xFf"), uint256{0xff});
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("Ff"), uint256{0xff});
+ const std::string valid_hex_64{"0x0123456789abcdef0123456789abcdef0123456789ABDCEF0123456789ABCDEF"};
+ BOOST_REQUIRE_EQUAL(valid_hex_64.size(), 2 + 64); // 0x prefix and 64 hex digits
+ BOOST_CHECK_EQUAL(uint256::FromUserHex(valid_hex_64.substr(2)).value().ToString(), ToLower(valid_hex_64.substr(2)));
+ BOOST_CHECK_EQUAL(uint256::FromUserHex(valid_hex_64.substr(0)).value().ToString(), ToLower(valid_hex_64.substr(2)));
+
+ BOOST_CHECK(!uint256::FromUserHex("0x0 ")); // no spaces at end,
+ BOOST_CHECK(!uint256::FromUserHex(" 0x0")); // or beginning,
+ BOOST_CHECK(!uint256::FromUserHex("0x 0")); // or middle,
+ BOOST_CHECK(!uint256::FromUserHex(" ")); // etc.
+ BOOST_CHECK(!uint256::FromUserHex("0x0ga")); // invalid character
+ BOOST_CHECK(!uint256::FromUserHex("x0")); // broken prefix
+ BOOST_CHECK(!uint256::FromUserHex("0x0x00")); // two prefixes not allowed
+ BOOST_CHECK(!uint256::FromUserHex(valid_hex_64.substr(2) + "0")); // 1 hex digit too many
+ BOOST_CHECK(!uint256::FromUserHex(valid_hex_64 + "a")); // 1 hex digit too many
+ BOOST_CHECK(!uint256::FromUserHex(valid_hex_64 + " ")); // whitespace after max length
+ BOOST_CHECK(!uint256::FromUserHex(valid_hex_64 + "z")); // invalid character after max length
+}
+
BOOST_AUTO_TEST_CASE( check_ONE )
{
uint256 one = uint256{"0000000000000000000000000000000000000000000000000000000000000001"};
@@ -401,8 +334,8 @@ BOOST_AUTO_TEST_CASE( check_ONE )
BOOST_AUTO_TEST_CASE(FromHex_vs_uint256)
{
- auto runtime_uint{uint256::FromHex("4A5E1E4BAAB89F3A32518A88C31BC87F618f76673e2cc77ab2127b7afdeda33b").value()};
- constexpr uint256 consteval_uint{ "4a5e1e4baab89f3a32518a88c31bc87f618F76673E2CC77AB2127B7AFDEDA33B"};
+ auto runtime_uint{uint256::FromHex("4A5E1E4BAAB89F3A32518A88C31BC87F618f76673e2cc77ab2127b7afdeda33b")};
+ constexpr uint256 consteval_uint{ "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"};
BOOST_CHECK_EQUAL(consteval_uint, runtime_uint);
}
diff --git a/src/test/util/CMakeLists.txt b/src/test/util/CMakeLists.txt
new file mode 100644
index 0000000000..5d88d1da3e
--- /dev/null
+++ b/src/test/util/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(test_util STATIC EXCLUDE_FROM_ALL
+ blockfilter.cpp
+ coins.cpp
+ index.cpp
+ json.cpp
+ logging.cpp
+ mining.cpp
+ net.cpp
+ random.cpp
+ script.cpp
+ setup_common.cpp
+ str.cpp
+ transaction_utils.cpp
+ txmempool.cpp
+ validation.cpp
+ $<$<BOOL:${ENABLE_WALLET}>:${PROJECT_SOURCE_DIR}/src/wallet/test/util.cpp>
+)
+
+target_link_libraries(test_util
+ PRIVATE
+ core_interface
+ Boost::headers
+ PUBLIC
+ univalue
+)
diff --git a/src/test/util/cluster_linearize.h b/src/test/util/cluster_linearize.h
index 508a08133c..b86ebcd78b 100644
--- a/src/test/util/cluster_linearize.h
+++ b/src/test/util/cluster_linearize.h
@@ -102,7 +102,7 @@ bool IsAcyclic(const DepGraph<SetType>& depgraph) noexcept
struct DepGraphFormatter
{
/** Convert x>=0 to 2x (even), x<0 to -2x-1 (odd). */
- static uint64_t SignedToUnsigned(int64_t x) noexcept
+ [[maybe_unused]] static uint64_t SignedToUnsigned(int64_t x) noexcept
{
if (x < 0) {
return 2 * uint64_t(-(x + 1)) + 1;
@@ -112,7 +112,7 @@ struct DepGraphFormatter
}
/** Convert even x to x/2 (>=0), odd x to -(x/2)-1 (<0). */
- static int64_t UnsignedToSigned(uint64_t x) noexcept
+ [[maybe_unused]] static int64_t UnsignedToSigned(uint64_t x) noexcept
{
if (x & 1) {
return -int64_t(x / 2) - 1;
@@ -155,7 +155,7 @@ struct DepGraphFormatter
// Ignore transactions which are already known to be ancestors.
if (depgraph.Descendants(dep_idx).Overlaps(written_parents)) continue;
if (depgraph.Ancestors(idx)[dep_idx]) {
- // When an actual parent is encounted, encode how many non-parents were skipped
+ // When an actual parent is encountered, encode how many non-parents were skipped
// before it.
s << VARINT(diff);
diff = 0;
@@ -186,7 +186,7 @@ struct DepGraphFormatter
/** The dependency graph which we deserialize into first, with transactions in
* topological serialization order, not original cluster order. */
DepGraph<SetType> topo_depgraph;
- /** Mapping from cluster order to serialization order, used later to reconstruct the
+ /** Mapping from serialization order to cluster order, used later to reconstruct the
* cluster order. */
std::vector<ClusterIndex> reordering;
@@ -205,9 +205,9 @@ struct DepGraphFormatter
coded_fee &= 0xFFFFFFFFFFFFF; // Enough for fee between -21M...21M BTC.
static_assert(0xFFFFFFFFFFFFF > uint64_t{2} * 21000000 * 100000000);
auto fee = UnsignedToSigned(coded_fee);
- // Extend topo_depgraph with the new transaction (at the end).
+ // Extend topo_depgraph with the new transaction (preliminarily at the end).
auto topo_idx = topo_depgraph.AddTransaction({fee, size});
- reordering.push_back(topo_idx);
+ reordering.push_back(reordering.size());
// Read dependency information.
uint64_t diff = 0; //!< How many potential parents we have to skip.
s >> VARINT(diff);
@@ -226,31 +226,23 @@ struct DepGraphFormatter
--diff;
}
}
- // If we reach this point, we can interpret the remaining skip value as how far from the
- // end of reordering topo_idx should be placed (wrapping around), so move it to its
- // correct location. The preliminary reordering.push_back(topo_idx) above was to make
- // sure that if a deserialization exception occurs, topo_idx still appears somewhere.
+ // If we reach this point, we can interpret the remaining skip value as how far
+ // from the end of reordering the new transaction should be placed (wrapping
+ // around), so remove the preliminary position it was put in above (which was to
+ // make sure that if a deserialization exception occurs, the new transaction still
+ // has some entry in reordering).
reordering.pop_back();
- reordering.insert(reordering.end() - (diff % (reordering.size() + 1)), topo_idx);
+ ClusterIndex insert_distance = diff % (reordering.size() + 1);
+ // And then update reordering to reflect this new transaction's insertion.
+ for (auto& pos : reordering) {
+ pos += (pos >= reordering.size() - insert_distance);
+ }
+ reordering.push_back(reordering.size() - insert_distance);
}
} catch (const std::ios_base::failure&) {}
// Construct the original cluster order depgraph.
- depgraph = {};
- // Add transactions to depgraph in the original cluster order.
- for (auto topo_idx : reordering) {
- depgraph.AddTransaction(topo_depgraph.FeeRate(topo_idx));
- }
- // Translate dependencies from topological to cluster order.
- for (ClusterIndex idx = 0; idx < reordering.size(); ++idx) {
- ClusterIndex topo_idx = reordering[idx];
- for (ClusterIndex dep_idx = 0; dep_idx < reordering.size(); ++dep_idx) {
- ClusterIndex dep_topo_idx = reordering[dep_idx];
- if (topo_depgraph.Ancestors(topo_idx)[dep_topo_idx]) {
- depgraph.AddDependency(dep_idx, idx);
- }
- }
- }
+ depgraph = DepGraph(topo_depgraph, reordering);
}
};
diff --git a/src/test/util/coins.cpp b/src/test/util/coins.cpp
index 742dbc04d1..7e10c7c58d 100644
--- a/src/test/util/coins.cpp
+++ b/src/test/util/coins.cpp
@@ -13,12 +13,12 @@
#include <stdint.h>
#include <utility>
-COutPoint AddTestCoin(CCoinsViewCache& coins_view)
+COutPoint AddTestCoin(FastRandomContext& rng, CCoinsViewCache& coins_view)
{
Coin new_coin;
- COutPoint outpoint{Txid::FromUint256(InsecureRand256()), /*nIn=*/0};
+ COutPoint outpoint{Txid::FromUint256(rng.rand256()), /*nIn=*/0};
new_coin.nHeight = 1;
- new_coin.out.nValue = InsecureRandMoneyAmount();
+ new_coin.out.nValue = RandMoney(rng);
new_coin.out.scriptPubKey.assign(uint32_t{56}, 1);
coins_view.AddCoin(outpoint, std::move(new_coin), /*possible_overwrite=*/false);
diff --git a/src/test/util/coins.h b/src/test/util/coins.h
index 5e6f4293ae..89a9e7b329 100644
--- a/src/test/util/coins.h
+++ b/src/test/util/coins.h
@@ -8,12 +8,13 @@
#include <primitives/transaction.h>
class CCoinsViewCache;
+class FastRandomContext;
/**
* Create a Coin with DynamicMemoryUsage of 80 bytes and add it to the given view.
* @param[in,out] coins_view The coins view cache to add the new coin to.
* @returns the COutPoint of the created coin.
*/
-COutPoint AddTestCoin(CCoinsViewCache& coins_view);
+COutPoint AddTestCoin(FastRandomContext& rng, CCoinsViewCache& coins_view);
#endif // BITCOIN_TEST_UTIL_COINS_H
diff --git a/src/test/util/json.cpp b/src/test/util/json.cpp
index ad3c346c84..46a4a9f9a1 100644
--- a/src/test/util/json.cpp
+++ b/src/test/util/json.cpp
@@ -1,15 +1,15 @@
-// Copyright (c) 2023 The Bitcoin Core developers
+// Copyright (c) 2023-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <test/util/json.h>
-#include <string>
+#include <univalue.h>
#include <util/check.h>
-#include <univalue.h>
+#include <string_view>
-UniValue read_json(const std::string& jsondata)
+UniValue read_json(std::string_view jsondata)
{
UniValue v;
Assert(v.read(jsondata) && v.isArray());
diff --git a/src/test/util/json.h b/src/test/util/json.h
index 5b1026762e..f6f4e6ab71 100644
--- a/src/test/util/json.h
+++ b/src/test/util/json.h
@@ -1,14 +1,14 @@
-// Copyright (c) 2023 The Bitcoin Core developers
+// Copyright (c) 2023-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_TEST_UTIL_JSON_H
#define BITCOIN_TEST_UTIL_JSON_H
-#include <string>
-
#include <univalue.h>
-UniValue read_json(const std::string& jsondata);
+#include <string_view>
+
+UniValue read_json(std::string_view jsondata);
#endif // BITCOIN_TEST_UTIL_JSON_H
diff --git a/src/test/util/random.cpp b/src/test/util/random.cpp
index 47d03055e2..32d785e45d 100644
--- a/src/test/util/random.cpp
+++ b/src/test/util/random.cpp
@@ -7,17 +7,16 @@
#include <logging.h>
#include <random.h>
#include <uint256.h>
+#include <util/check.h>
#include <cstdlib>
-#include <string>
-
-FastRandomContext g_insecure_rand_ctx;
+#include <iostream>
extern void MakeRandDeterministicDANGEROUS(const uint256& seed) noexcept;
-void SeedRandomForTest(SeedRand seedtype)
+void SeedRandomStateForTest(SeedRand seedtype)
{
- static const std::string RANDOM_CTX_SEED{"RANDOM_CTX_SEED"};
+ constexpr auto RANDOM_CTX_SEED{"RANDOM_CTX_SEED"};
// Do this once, on the first call, regardless of seedtype, because once
// MakeRandDeterministicDANGEROUS is called, the output of GetRandHash is
@@ -25,14 +24,19 @@ void SeedRandomForTest(SeedRand seedtype)
// process.
static const uint256 ctx_seed = []() {
// If RANDOM_CTX_SEED is set, use that as seed.
- const char* num = std::getenv(RANDOM_CTX_SEED.c_str());
- if (num) return uint256S(num);
+ if (const char* num{std::getenv(RANDOM_CTX_SEED)}) {
+ if (auto num_parsed{uint256::FromUserHex(num)}) {
+ return *num_parsed;
+ } else {
+ std::cerr << RANDOM_CTX_SEED << " must consist of up to " << uint256::size() * 2 << " hex digits (\"0x\" prefix allowed), it was set to: '" << num << "'.\n";
+ std::abort();
+ }
+ }
// Otherwise use a (truly) random value.
return GetRandHash();
}();
- const uint256& seed{seedtype == SeedRand::SEED ? ctx_seed : uint256::ZERO};
- LogPrintf("%s: Setting random seed for current tests to %s=%s\n", __func__, RANDOM_CTX_SEED, seed.GetHex());
+ const uint256& seed{seedtype == SeedRand::FIXED_SEED ? ctx_seed : uint256::ZERO};
+ LogInfo("Setting random seed for current tests to %s=%s\n", RANDOM_CTX_SEED, seed.GetHex());
MakeRandDeterministicDANGEROUS(seed);
- g_insecure_rand_ctx.Reseed(GetRandHash());
}
diff --git a/src/test/util/random.h b/src/test/util/random.h
index 09a475f8b3..441150e666 100644
--- a/src/test/util/random.h
+++ b/src/test/util/random.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2023 The Bitcoin Core developers
+// Copyright (c) 2023-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -11,50 +11,26 @@
#include <cstdint>
-/**
- * This global and the helpers that use it are not thread-safe.
- *
- * If thread-safety is needed, a per-thread instance could be
- * used in the multi-threaded test.
- */
-extern FastRandomContext g_insecure_rand_ctx;
-
enum class SeedRand {
- ZEROS, //!< Seed with a compile time constant of zeros
- SEED, //!< Use (and report) random seed from environment, or a (truly) random one.
+ /**
+ * Seed with a compile time constant of zeros.
+ */
+ ZEROS,
+ /**
+ * Seed with a fixed value that never changes over the lifetime of this
+ * process. The seed is read from the RANDOM_CTX_SEED environment variable
+ * if set, otherwise generated randomly once, saved, and reused.
+ */
+ FIXED_SEED,
};
-/** Seed the RNG for testing. This affects all randomness, except GetStrongRandBytes(). */
-void SeedRandomForTest(SeedRand seed = SeedRand::SEED);
-
-static inline uint32_t InsecureRand32()
-{
- return g_insecure_rand_ctx.rand32();
-}
-
-static inline uint256 InsecureRand256()
-{
- return g_insecure_rand_ctx.rand256();
-}
-
-static inline uint64_t InsecureRandBits(int bits)
-{
- return g_insecure_rand_ctx.randbits(bits);
-}
-
-static inline uint64_t InsecureRandRange(uint64_t range)
-{
- return g_insecure_rand_ctx.randrange(range);
-}
-
-static inline bool InsecureRandBool()
-{
- return g_insecure_rand_ctx.randbool();
-}
+/** Seed the global RNG state for testing and log the seed value. This affects all randomness, except GetStrongRandBytes(). */
+void SeedRandomStateForTest(SeedRand seed);
-static inline CAmount InsecureRandMoneyAmount()
+template <RandomNumberGenerator Rng>
+inline CAmount RandMoney(Rng&& rng)
{
- return static_cast<CAmount>(InsecureRandRange(MAX_MONEY + 1));
+ return CAmount{rng.randrange(MAX_MONEY + 1)};
}
#endif // BITCOIN_TEST_UTIL_RANDOM_H
diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp
index 62ff61b227..fa89ceb332 100644
--- a/src/test/util/setup_common.cpp
+++ b/src/test/util/setup_common.cpp
@@ -2,8 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
-
#include <test/util/setup_common.h>
#include <addrman.h>
@@ -63,6 +61,7 @@
#include <functional>
#include <stdexcept>
+using namespace util::hex_literals;
using kernel::BlockTreeDB;
using node::ApplyArgsManOptions;
using node::BlockAssembler;
@@ -75,26 +74,9 @@ using node::VerifyLoadedChainstate;
const std::function<std::string(const char*)> G_TRANSLATION_FUN = nullptr;
-/** Random context to get unique temp data dirs. Separate from g_insecure_rand_ctx, which can be seeded from a const env var */
-static FastRandomContext g_insecure_rand_ctx_temp_path;
-
-std::ostream& operator<<(std::ostream& os, const arith_uint256& num)
-{
- os << num.ToString();
- return os;
-}
-
-std::ostream& operator<<(std::ostream& os, const uint160& num)
-{
- os << num.ToString();
- return os;
-}
-
-std::ostream& operator<<(std::ostream& os, const uint256& num)
-{
- os << num.ToString();
- return os;
-}
+constexpr inline auto TEST_DIR_PATH_ELEMENT{"test_common bitcoin"}; // Includes a space to catch possible path escape issues.
+/** Random context to get unique temp data dirs. Separate from m_rng, which can be seeded from a const env var */
+static FastRandomContext g_rng_temp_path;
struct NetworkSetup
{
@@ -108,7 +90,7 @@ static NetworkSetup g_networksetup_instance;
/** Register test-only arguments */
static void SetupUnitTestArgs(ArgsManager& argsman)
{
- argsman.AddArg("-testdatadir", strprintf("Custom data directory (default: %s<random_string>)", fs::PathToString(fs::temp_directory_path() / "test_common_" PACKAGE_NAME / "")),
+ argsman.AddArg("-testdatadir", strprintf("Custom data directory (default: %s<random_string>)", fs::PathToString(fs::temp_directory_path() / TEST_DIR_PATH_ELEMENT / "")),
ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
}
@@ -154,12 +136,12 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, TestOpts opts)
// Use randomly chosen seed for deterministic PRNG, so that (by default) test
// data directories use a random name that doesn't overlap with other tests.
- SeedRandomForTest(SeedRand::SEED);
+ SeedRandomForTest(SeedRand::FIXED_SEED);
if (!m_node.args->IsArgSet("-testdatadir")) {
// By default, the data directory has a random name
- const auto rand_str{g_insecure_rand_ctx_temp_path.rand256().ToString()};
- m_path_root = fs::temp_directory_path() / "test_common_" PACKAGE_NAME / rand_str;
+ const auto rand_str{g_rng_temp_path.rand256().ToString()};
+ m_path_root = fs::temp_directory_path() / TEST_DIR_PATH_ELEMENT / rand_str;
TryCreateDirectories(m_path_root);
} else {
// Custom data directory
@@ -169,7 +151,7 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, TestOpts opts)
root_dir = fs::absolute(root_dir);
const std::string test_path{G_TEST_GET_FULL_NAME ? G_TEST_GET_FULL_NAME() : ""};
- m_path_lock = root_dir / "test_common_" PACKAGE_NAME / fs::PathFromString(test_path);
+ m_path_lock = root_dir / TEST_DIR_PATH_ELEMENT / fs::PathFromString(test_path);
m_path_root = m_path_lock / "datadir";
// Try to obtain the lock; if unsuccessful don't disturb the existing test.
@@ -580,7 +562,7 @@ void TestChain100Setup::MockMempoolMinFee(const CFeeRate& target_feerate)
// Manually create an invalid transaction. Manually set the fee in the CTxMemPoolEntry to
// achieve the exact target feerate.
CMutableTransaction mtx = CMutableTransaction();
- mtx.vin.emplace_back(COutPoint{Txid::FromUint256(g_insecure_rand_ctx.rand256()), 0});
+ mtx.vin.emplace_back(COutPoint{Txid::FromUint256(m_rng.rand256()), 0});
mtx.vout.emplace_back(1 * COIN, GetScriptForDestination(WitnessV0ScriptHash(CScript() << OP_TRUE)));
const auto tx{MakeTransactionRef(mtx)};
LockPoints lp;
@@ -601,8 +583,23 @@ CBlock getBlock13b8a()
{
CBlock block;
DataStream stream{
- ParseHex("0100000090f0a9f110702f808219ebea1173056042a714bad51b916cb6800000000000005275289558f51c9966699404ae2294730c3c9f9bda53523ce50e9b95e558da2fdb261b4d4c86041b1ab1bf930901000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0146ffffffff0100f2052a01000000434104e18f7afbe4721580e81e8414fc8c24d7cfacf254bb5c7b949450c3e997c2dc1242487a8169507b631eb3771f2b425483fb13102c4eb5d858eef260fe70fbfae0ac00000000010000000196608ccbafa16abada902780da4dc35dafd7af05fa0da08cf833575f8cf9e836000000004a493046022100dab24889213caf43ae6adc41cf1c9396c08240c199f5225acf45416330fd7dbd022100fe37900e0644bf574493a07fc5edba06dbc07c311b947520c2d514bc5725dcb401ffffffff0100f2052a010000001976a914f15d1921f52e4007b146dfa60f369ed2fc393ce288ac000000000100000001fb766c1288458c2bafcfec81e48b24d98ec706de6b8af7c4e3c29419bfacb56d000000008c493046022100f268ba165ce0ad2e6d93f089cfcd3785de5c963bb5ea6b8c1b23f1ce3e517b9f022100da7c0f21adc6c401887f2bfd1922f11d76159cbc597fbd756a23dcbb00f4d7290141042b4e8625a96127826915a5b109852636ad0da753c9e1d5606a50480cd0c40f1f8b8d898235e571fe9357d9ec842bc4bba1827daaf4de06d71844d0057707966affffffff0280969800000000001976a9146963907531db72d0ed1a0cfb471ccb63923446f388ac80d6e34c000000001976a914f0688ba1c0d1ce182c7af6741e02658c7d4dfcd388ac000000000100000002c40297f730dd7b5a99567eb8d27b78758f607507c52292d02d4031895b52f2ff010000008b483045022100f7edfd4b0aac404e5bab4fd3889e0c6c41aa8d0e6fa122316f68eddd0a65013902205b09cc8b2d56e1cd1f7f2fafd60a129ed94504c4ac7bdc67b56fe67512658b3e014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffffca5065ff9617cbcba45eb23726df6498a9b9cafed4f54cbab9d227b0035ddefb000000008a473044022068010362a13c7f9919fa832b2dee4e788f61f6f5d344a7c2a0da6ae740605658022006d1af525b9a14a35c003b78b72bd59738cd676f845d1ff3fc25049e01003614014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffff01001ec4110200000043410469ab4181eceb28985b9b4e895c13fa5e68d85761b7eee311db5addef76fa8621865134a221bd01f28ec9999ee3e021e60766e9d1f3458c115fb28650605f11c9ac000000000100000001cdaf2f758e91c514655e2dc50633d1e4c84989f8aa90a0dbc883f0d23ed5c2fa010000008b48304502207ab51be6f12a1962ba0aaaf24a20e0b69b27a94fac5adf45aa7d2d18ffd9236102210086ae728b370e5329eead9accd880d0cb070aea0c96255fae6c4f1ddcce1fd56e014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff02404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac002d3101000000001976a9141befba0cdc1ad56529371864d9f6cb042faa06b588ac000000000100000001b4a47603e71b61bc3326efd90111bf02d2f549b067f4c4a8fa183b57a0f800cb010000008a4730440220177c37f9a505c3f1a1f0ce2da777c339bd8339ffa02c7cb41f0a5804f473c9230220585b25a2ee80eb59292e52b987dad92acb0c64eced92ed9ee105ad153cdb12d001410443bd44f683467e549dae7d20d1d79cbdb6df985c6e9c029c8d0c6cb46cc1a4d3cf7923c5021b27f7a0b562ada113bc85d5fda5a1b41e87fe6e8802817cf69996ffffffff0280651406000000001976a9145505614859643ab7b547cd7f1f5e7e2a12322d3788ac00aa0271000000001976a914ea4720a7a52fc166c55ff2298e07baf70ae67e1b88ac00000000010000000586c62cd602d219bb60edb14a3e204de0705176f9022fe49a538054fb14abb49e010000008c493046022100f2bc2aba2534becbdf062eb993853a42bbbc282083d0daf9b4b585bd401aa8c9022100b1d7fd7ee0b95600db8535bbf331b19eed8d961f7a8e54159c53675d5f69df8c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff03ad0e58ccdac3df9dc28a218bcf6f1997b0a93306faaa4b3a28ae83447b2179010000008b483045022100be12b2937179da88599e27bb31c3525097a07cdb52422d165b3ca2f2020ffcf702200971b51f853a53d644ebae9ec8f3512e442b1bcb6c315a5b491d119d10624c83014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff2acfcab629bbc8685792603762c921580030ba144af553d271716a95089e107b010000008b483045022100fa579a840ac258871365dd48cd7552f96c8eea69bd00d84f05b283a0dab311e102207e3c0ee9234814cfbb1b659b83671618f45abc1326b9edcc77d552a4f2a805c0014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffdcdc6023bbc9944a658ddc588e61eacb737ddf0a3cd24f113b5a8634c517fcd2000000008b4830450221008d6df731df5d32267954bd7d2dda2302b74c6c2a6aa5c0ca64ecbabc1af03c75022010e55c571d65da7701ae2da1956c442df81bbf076cdbac25133f99d98a9ed34c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffe15557cd5ce258f479dfd6dc6514edf6d7ed5b21fcfa4a038fd69f06b83ac76e010000008b483045022023b3e0ab071eb11de2eb1cc3a67261b866f86bf6867d4558165f7c8c8aca2d86022100dc6e1f53a91de3efe8f63512850811f26284b62f850c70ca73ed5de8771fb451014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff01404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000010000000166d7577163c932b4f9690ca6a80b6e4eb001f0a2fa9023df5595602aae96ed8d000000008a4730440220262b42546302dfb654a229cefc86432b89628ff259dc87edd1154535b16a67e102207b4634c020a97c3e7bbd0d4d19da6aa2269ad9dded4026e896b213d73ca4b63f014104979b82d02226b3a4597523845754d44f13639e3bf2df5e82c6aab2bdc79687368b01b1ab8b19875ae3c90d661a3d0a33161dab29934edeb36aa01976be3baf8affffffff02404b4c00000000001976a9144854e695a02af0aeacb823ccbc272134561e0a1688ac40420f00000000001976a914abee93376d6b37b5c2940655a6fcaf1c8e74237988ac0000000001000000014e3f8ef2e91349a9059cb4f01e54ab2597c1387161d3da89919f7ea6acdbb371010000008c49304602210081f3183471a5ca22307c0800226f3ef9c353069e0773ac76bb580654d56aa523022100d4c56465bdc069060846f4fbf2f6b20520b2a80b08b168b31e66ddb9c694e240014104976c79848e18251612f8940875b2b08d06e6dc73b9840e8860c066b7e87432c477e9a59a453e71e6d76d5fe34058b800a098fc1740ce3012e8fc8a00c96af966ffffffff02c0e1e400000000001976a9144134e75a6fcb6042034aab5e18570cf1f844f54788ac404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000"),
+ "0100000090f0a9f110702f808219ebea1173056042a714bad51b916cb6800000000000005275289558f51c9966699404ae2294730c3c9f9bda53523ce50e9b95e558da2fdb261b4d4c86041b1ab1bf930901000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0146ffffffff0100f2052a01000000434104e18f7afbe4721580e81e8414fc8c24d7cfacf254bb5c7b949450c3e997c2dc1242487a8169507b631eb3771f2b425483fb13102c4eb5d858eef260fe70fbfae0ac00000000010000000196608ccbafa16abada902780da4dc35dafd7af05fa0da08cf833575f8cf9e836000000004a493046022100dab24889213caf43ae6adc41cf1c9396c08240c199f5225acf45416330fd7dbd022100fe37900e0644bf574493a07fc5edba06dbc07c311b947520c2d514bc5725dcb401ffffffff0100f2052a010000001976a914f15d1921f52e4007b146dfa60f369ed2fc393ce288ac000000000100000001fb766c1288458c2bafcfec81e48b24d98ec706de6b8af7c4e3c29419bfacb56d000000008c493046022100f268ba165ce0ad2e6d93f089cfcd3785de5c963bb5ea6b8c1b23f1ce3e517b9f022100da7c0f21adc6c401887f2bfd1922f11d76159cbc597fbd756a23dcbb00f4d7290141042b4e8625a96127826915a5b109852636ad0da753c9e1d5606a50480cd0c40f1f8b8d898235e571fe9357d9ec842bc4bba1827daaf4de06d71844d0057707966affffffff0280969800000000001976a9146963907531db72d0ed1a0cfb471ccb63923446f388ac80d6e34c000000001976a914f0688ba1c0d1ce182c7af6741e02658c7d4dfcd388ac000000000100000002c40297f730dd7b5a99567eb8d27b78758f607507c52292d02d4031895b52f2ff010000008b483045022100f7edfd4b0aac404e5bab4fd3889e0c6c41aa8d0e6fa122316f68eddd0a65013902205b09cc8b2d56e1cd1f7f2fafd60a129ed94504c4ac7bdc67b56fe67512658b3e014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffffca5065ff9617cbcba45eb23726df6498a9b9cafed4f54cbab9d227b0035ddefb000000008a473044022068010362a13c7f9919fa832b2dee4e788f61f6f5d344a7c2a0da6ae740605658022006d1af525b9a14a35c003b78b72bd59738cd676f845d1ff3fc25049e01003614014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffff01001ec4110200000043410469ab4181eceb28985b9b4e895c13fa5e68d85761b7eee311db5addef76fa8621865134a221bd01f28ec9999ee3e021e60766e9d1f3458c115fb28650605f11c9ac000000000100000001cdaf2f758e91c514655e2dc50633d1e4c84989f8aa90a0dbc883f0d23ed5c2fa010000008b48304502207ab51be6f12a1962ba0aaaf24a20e0b69b27a94fac5adf45aa7d2d18ffd9236102210086ae728b370e5329eead9accd880d0cb070aea0c96255fae6c4f1ddcce1fd56e014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff02404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac002d3101000000001976a9141befba0cdc1ad56529371864d9f6cb042faa06b588ac000000000100000001b4a47603e71b61bc3326efd90111bf02d2f549b067f4c4a8fa183b57a0f800cb010000008a4730440220177c37f9a505c3f1a1f0ce2da777c339bd8339ffa02c7cb41f0a5804f473c9230220585b25a2ee80eb59292e52b987dad92acb0c64eced92ed9ee105ad153cdb12d001410443bd44f683467e549dae7d20d1d79cbdb6df985c6e9c029c8d0c6cb46cc1a4d3cf7923c5021b27f7a0b562ada113bc85d5fda5a1b41e87fe6e8802817cf69996ffffffff0280651406000000001976a9145505614859643ab7b547cd7f1f5e7e2a12322d3788ac00aa0271000000001976a914ea4720a7a52fc166c55ff2298e07baf70ae67e1b88ac00000000010000000586c62cd602d219bb60edb14a3e204de0705176f9022fe49a538054fb14abb49e010000008c493046022100f2bc2aba2534becbdf062eb993853a42bbbc282083d0daf9b4b585bd401aa8c9022100b1d7fd7ee0b95600db8535bbf331b19eed8d961f7a8e54159c53675d5f69df8c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff03ad0e58ccdac3df9dc28a218bcf6f1997b0a93306faaa4b3a28ae83447b2179010000008b483045022100be12b2937179da88599e27bb31c3525097a07cdb52422d165b3ca2f2020ffcf702200971b51f853a53d644ebae9ec8f3512e442b1bcb6c315a5b491d119d10624c83014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff2acfcab629bbc8685792603762c921580030ba144af553d271716a95089e107b010000008b483045022100fa579a840ac258871365dd48cd7552f96c8eea69bd00d84f05b283a0dab311e102207e3c0ee9234814cfbb1b659b83671618f45abc1326b9edcc77d552a4f2a805c0014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffdcdc6023bbc9944a658ddc588e61eacb737ddf0a3cd24f113b5a8634c517fcd2000000008b4830450221008d6df731df5d32267954bd7d2dda2302b74c6c2a6aa5c0ca64ecbabc1af03c75022010e55c571d65da7701ae2da1956c442df81bbf076cdbac25133f99d98a9ed34c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffe15557cd5ce258f479dfd6dc6514edf6d7ed5b21fcfa4a038fd69f06b83ac76e010000008b483045022023b3e0ab071eb11de2eb1cc3a67261b866f86bf6867d4558165f7c8c8aca2d86022100dc6e1f53a91de3efe8f63512850811f26284b62f850c70ca73ed5de8771fb451014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff01404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000010000000166d7577163c932b4f9690ca6a80b6e4eb001f0a2fa9023df5595602aae96ed8d000000008a4730440220262b42546302dfb654a229cefc86432b89628ff259dc87edd1154535b16a67e102207b4634c020a97c3e7bbd0d4d19da6aa2269ad9dded4026e896b213d73ca4b63f014104979b82d02226b3a4597523845754d44f13639e3bf2df5e82c6aab2bdc79687368b01b1ab8b19875ae3c90d661a3d0a33161dab29934edeb36aa01976be3baf8affffffff02404b4c00000000001976a9144854e695a02af0aeacb823ccbc272134561e0a1688ac40420f00000000001976a914abee93376d6b37b5c2940655a6fcaf1c8e74237988ac0000000001000000014e3f8ef2e91349a9059cb4f01e54ab2597c1387161d3da89919f7ea6acdbb371010000008c49304602210081f3183471a5ca22307c0800226f3ef9c353069e0773ac76bb580654d56aa523022100d4c56465bdc069060846f4fbf2f6b20520b2a80b08b168b31e66ddb9c694e240014104976c79848e18251612f8940875b2b08d06e6dc73b9840e8860c066b7e87432c477e9a59a453e71e6d76d5fe34058b800a098fc1740ce3012e8fc8a00c96af966ffffffff02c0e1e400000000001976a9144134e75a6fcb6042034aab5e18570cf1f844f54788ac404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
return block;
}
+
+std::ostream& operator<<(std::ostream& os, const arith_uint256& num)
+{
+ return os << num.ToString();
+}
+
+std::ostream& operator<<(std::ostream& os, const uint160& num)
+{
+ return os << num.ToString();
+}
+
+std::ostream& operator<<(std::ostream& os, const uint256& num)
+{
+ return os << num.ToString();
+}
diff --git a/src/test/util/setup_common.h b/src/test/util/setup_common.h
index b73acc1de5..30d4280fa5 100644
--- a/src/test/util/setup_common.h
+++ b/src/test/util/setup_common.h
@@ -10,9 +10,12 @@
#include <key.h>
#include <node/caches.h>
#include <node/context.h> // IWYU pragma: export
+#include <optional>
+#include <ostream>
#include <primitives/transaction.h>
#include <pubkey.h>
#include <stdexcept>
+#include <test/util/random.h>
#include <util/chaintype.h> // IWYU pragma: export
#include <util/check.h>
#include <util/fs.h>
@@ -28,6 +31,8 @@ class arith_uint256;
class CFeeRate;
class Chainstate;
class FastRandomContext;
+class uint160;
+class uint256;
/** This is connected to the logger. Can be used to redirect logs to any other log */
extern const std::function<void(const std::string&)> G_TEST_LOG_FUN;
@@ -38,15 +43,6 @@ extern const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUM
/** Retrieve the unit test name. */
extern const std::function<std::string()> G_TEST_GET_FULL_NAME;
-// Enable BOOST_CHECK_EQUAL for enum class types
-namespace std {
-template <typename T>
-std::ostream& operator<<(typename std::enable_if<std::is_enum<T>::value, std::ostream>::type& stream, const T& e)
-{
- return stream << static_cast<typename std::underlying_type<T>::type>(e);
-}
-} // namespace std
-
static constexpr CAmount CENT{1000000};
struct TestOpts {
@@ -65,6 +61,14 @@ struct BasicTestingSetup {
util::SignalInterrupt m_interrupt;
node::NodeContext m_node; // keep as first member to be destructed last
+ FastRandomContext m_rng;
+ /** Seed the global RNG state and m_rng for testing and log the seed value. This affects all randomness, except GetStrongRandBytes(). */
+ void SeedRandomForTest(SeedRand seed)
+ {
+ SeedRandomStateForTest(seed);
+ m_rng.Reseed(GetRandHash());
+ }
+
explicit BasicTestingSetup(const ChainType chainType = ChainType::MAIN, TestOpts = {});
~BasicTestingSetup();
@@ -241,10 +245,26 @@ std::unique_ptr<T> MakeNoLogFileContext(const ChainType chain_type = ChainType::
CBlock getBlock13b8a();
-// Make types usable in BOOST_CHECK_*
+// Make types usable in BOOST_CHECK_* @{
+namespace std {
+template <typename T> requires std::is_enum_v<T>
+inline std::ostream& operator<<(std::ostream& os, const T& e)
+{
+ return os << static_cast<std::underlying_type_t<T>>(e);
+}
+
+template <typename T>
+inline std::ostream& operator<<(std::ostream& os, const std::optional<T>& v)
+{
+ return v ? os << *v
+ : os << "std::nullopt";
+}
+} // namespace std
+
std::ostream& operator<<(std::ostream& os, const arith_uint256& num);
std::ostream& operator<<(std::ostream& os, const uint160& num);
std::ostream& operator<<(std::ostream& os, const uint256& num);
+// @}
/**
* BOOST_CHECK_EXCEPTION predicates to check the specific validation error.
diff --git a/src/test/util/transaction_utils.cpp b/src/test/util/transaction_utils.cpp
index 300caa577c..5727da4444 100644
--- a/src/test/util/transaction_utils.cpp
+++ b/src/test/util/transaction_utils.cpp
@@ -3,6 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <coins.h>
+#include <consensus/validation.h>
#include <script/signingprovider.h>
#include <test/util/transaction_utils.h>
@@ -69,3 +70,23 @@ std::vector<CMutableTransaction> SetupDummyInputs(FillableSigningProvider& keyst
return dummyTransactions;
}
+
+void BulkTransaction(CMutableTransaction& tx, int32_t target_weight)
+{
+ tx.vout.emplace_back(0, CScript() << OP_RETURN);
+ auto unpadded_weight{GetTransactionWeight(CTransaction(tx))};
+ assert(target_weight >= unpadded_weight);
+
+ // determine number of needed padding bytes by converting weight difference to vbytes
+ auto dummy_vbytes = (target_weight - unpadded_weight + (WITNESS_SCALE_FACTOR - 1)) / WITNESS_SCALE_FACTOR;
+ // compensate for the increase of the compact-size encoded script length
+ // (note that the length encoding of the unpadded output script needs one byte)
+ dummy_vbytes -= GetSizeOfCompactSize(dummy_vbytes) - 1;
+
+ // pad transaction by repeatedly appending a dummy opcode to the output script
+ tx.vout[0].scriptPubKey.insert(tx.vout[0].scriptPubKey.end(), dummy_vbytes, OP_1);
+
+ // actual weight should be at most 3 higher than target weight
+ assert(GetTransactionWeight(CTransaction(tx)) >= target_weight);
+ assert(GetTransactionWeight(CTransaction(tx)) <= target_weight + 3);
+}
diff --git a/src/test/util/transaction_utils.h b/src/test/util/transaction_utils.h
index 6f2faeec6c..80f2d1acbf 100644
--- a/src/test/util/transaction_utils.h
+++ b/src/test/util/transaction_utils.h
@@ -26,4 +26,8 @@ CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CSc
// the second nValues[2] and nValues[3] outputs paid to a TxoutType::PUBKEYHASH.
std::vector<CMutableTransaction> SetupDummyInputs(FillableSigningProvider& keystoreRet, CCoinsViewCache& coinsRet, const std::array<CAmount,4>& nValues);
+// bulk transaction to reach a certain target weight,
+// by appending a single output with padded output script
+void BulkTransaction(CMutableTransaction& tx, int32_t target_weight);
+
#endif // BITCOIN_TEST_UTIL_TRANSACTION_UTILS_H
diff --git a/src/test/util_string_tests.cpp b/src/test/util_string_tests.cpp
new file mode 100644
index 0000000000..8b974ffe6f
--- /dev/null
+++ b/src/test/util_string_tests.cpp
@@ -0,0 +1,86 @@
+// Copyright (c) 2024-present The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <util/string.h>
+
+#include <boost/test/unit_test.hpp>
+
+using namespace util;
+
+BOOST_AUTO_TEST_SUITE(util_string_tests)
+
+// Helper to allow compile-time sanity checks while providing the number of
+// args directly. Normally PassFmt<sizeof...(Args)> would be used.
+template <unsigned NumArgs>
+inline void PassFmt(util::ConstevalFormatString<NumArgs> fmt)
+{
+ // This was already executed at compile-time, but is executed again at run-time to avoid -Wunused.
+ decltype(fmt)::Detail_CheckNumFormatSpecifiers(fmt.fmt);
+}
+template <unsigned WrongNumArgs>
+inline void FailFmtWithError(std::string_view wrong_fmt, std::string_view error)
+{
+ using ErrType = const char*;
+ auto check_throw{[error](const ErrType& str) { return str == error; }};
+ BOOST_CHECK_EXCEPTION(util::ConstevalFormatString<WrongNumArgs>::Detail_CheckNumFormatSpecifiers(wrong_fmt), ErrType, check_throw);
+}
+
+BOOST_AUTO_TEST_CASE(ConstevalFormatString_NumSpec)
+{
+ PassFmt<0>("");
+ PassFmt<0>("%%");
+ PassFmt<1>("%s");
+ PassFmt<0>("%%s");
+ PassFmt<0>("s%%");
+ PassFmt<1>("%%%s");
+ PassFmt<1>("%s%%");
+ PassFmt<0>(" 1$s");
+ PassFmt<1>("%1$s");
+ PassFmt<1>("%1$s%1$s");
+ PassFmt<2>("%2$s");
+ PassFmt<2>("%2$s 4$s %2$s");
+ PassFmt<129>("%129$s 999$s %2$s");
+ PassFmt<1>("%02d");
+ PassFmt<1>("%+2s");
+ PassFmt<1>("%.6i");
+ PassFmt<1>("%5.2f");
+ PassFmt<1>("%#x");
+ PassFmt<1>("%1$5i");
+ PassFmt<1>("%1$-5i");
+ PassFmt<1>("%1$.5i");
+ // tinyformat accepts almost any "type" spec, even '%', or '_', or '\n'.
+ PassFmt<1>("%123%");
+ PassFmt<1>("%123%s");
+ PassFmt<1>("%_");
+ PassFmt<1>("%\n");
+
+ // The `*` specifier behavior is unsupported and can lead to runtime
+ // errors when used in a ConstevalFormatString. Please refer to the
+ // note in the ConstevalFormatString docs.
+ PassFmt<1>("%*c");
+ PassFmt<2>("%2$*3$d");
+ PassFmt<1>("%.*f");
+
+ auto err_mix{"Format specifiers must be all positional or all non-positional!"};
+ FailFmtWithError<1>("%s%1$s", err_mix);
+
+ auto err_num{"Format specifier count must match the argument count!"};
+ FailFmtWithError<1>("", err_num);
+ FailFmtWithError<0>("%s", err_num);
+ FailFmtWithError<2>("%s", err_num);
+ FailFmtWithError<0>("%1$s", err_num);
+ FailFmtWithError<2>("%1$s", err_num);
+
+ auto err_0_pos{"Positional format specifier must have position of at least 1"};
+ FailFmtWithError<1>("%$s", err_0_pos);
+ FailFmtWithError<1>("%$", err_0_pos);
+ FailFmtWithError<0>("%0$", err_0_pos);
+ FailFmtWithError<0>("%0$s", err_0_pos);
+
+ auto err_term{"Format specifier incorrectly terminated by end of string"};
+ FailFmtWithError<1>("%", err_term);
+ FailFmtWithError<1>("%1$", err_term);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp
index bf1fc1ea0a..1624fb8b5b 100644
--- a/src/test/util_tests.cpp
+++ b/src/test/util_tests.cpp
@@ -7,6 +7,7 @@
#include <hash.h> // For Hash()
#include <key.h> // For CKey
#include <script/parsing.h>
+#include <span.h>
#include <sync.h>
#include <test/util/random.h>
#include <test/util/setup_common.h>
@@ -45,6 +46,8 @@
#include <boost/test/unit_test.hpp>
using namespace std::literals;
+using namespace util::hex_literals;
+using util::ConstevalHexDigit;
using util::Join;
using util::RemovePrefix;
using util::RemovePrefixView;
@@ -136,46 +139,69 @@ BOOST_AUTO_TEST_CASE(util_criticalsection)
} while(0);
}
-static const unsigned char ParseHex_expected[65] = {
+constexpr char HEX_PARSE_INPUT[] = "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f";
+constexpr uint8_t HEX_PARSE_OUTPUT[] = {
0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
0x5f
};
+static_assert((sizeof(HEX_PARSE_INPUT) - 1) == 2 * sizeof(HEX_PARSE_OUTPUT));
BOOST_AUTO_TEST_CASE(parse_hex)
{
std::vector<unsigned char> result;
- std::vector<unsigned char> expected(ParseHex_expected, ParseHex_expected + sizeof(ParseHex_expected));
+
// Basic test vector
- result = ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
+ std::vector<unsigned char> expected(std::begin(HEX_PARSE_OUTPUT), std::end(HEX_PARSE_OUTPUT));
+ constexpr std::array<std::byte, 65> hex_literal_array{operator""_hex<util::detail::Hex(HEX_PARSE_INPUT)>()};
+ auto hex_literal_span{MakeUCharSpan(hex_literal_array)};
+ BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
+
+ const std::vector<std::byte> hex_literal_vector{operator""_hex_v<util::detail::Hex(HEX_PARSE_INPUT)>()};
+ hex_literal_span = MakeUCharSpan(hex_literal_vector);
+ BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
+
+ constexpr std::array<uint8_t, 65> hex_literal_array_uint8{operator""_hex_u8<util::detail::Hex(HEX_PARSE_INPUT)>()};
+ BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_array_uint8.begin(), hex_literal_array_uint8.end(), expected.begin(), expected.end());
+
+ result = operator""_hex_v_u8<util::detail::Hex(HEX_PARSE_INPUT)>();
BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
- result = TryParseHex<uint8_t>("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f").value();
+
+ result = ParseHex(HEX_PARSE_INPUT);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
+
+ result = TryParseHex<uint8_t>(HEX_PARSE_INPUT).value();
BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
// Spaces between bytes must be supported
+ expected = {0x12, 0x34, 0x56, 0x78};
result = ParseHex("12 34 56 78");
- BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
result = TryParseHex<uint8_t>("12 34 56 78").value();
- BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
// Leading space must be supported (used in BerkeleyEnvironment::Salvage)
+ expected = {0x89, 0x34, 0x56, 0x78};
result = ParseHex(" 89 34 56 78");
- BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
result = TryParseHex<uint8_t>(" 89 34 56 78").value();
- BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
// Mixed case and spaces are supported
+ expected = {0xff, 0xaa};
result = ParseHex(" Ff aA ");
- BOOST_CHECK(result.size() == 2 && result[0] == 0xff && result[1] == 0xaa);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
result = TryParseHex<uint8_t>(" Ff aA ").value();
- BOOST_CHECK(result.size() == 2 && result[0] == 0xff && result[1] == 0xaa);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
// Empty string is supported
- result = ParseHex("");
- BOOST_CHECK(result.size() == 0);
- result = TryParseHex<uint8_t>("").value();
- BOOST_CHECK(result.size() == 0);
+ static_assert(""_hex.empty());
+ static_assert(""_hex_u8.empty());
+ BOOST_CHECK_EQUAL(""_hex_v.size(), 0);
+ BOOST_CHECK_EQUAL(""_hex_v_u8.size(), 0);
+ BOOST_CHECK_EQUAL(ParseHex("").size(), 0);
+ BOOST_CHECK_EQUAL(TryParseHex<uint8_t>("").value().size(), 0);
// Spaces between nibbles is treated as invalid
BOOST_CHECK_EQUAL(ParseHex("AAF F").size(), 0);
@@ -198,25 +224,25 @@ BOOST_AUTO_TEST_CASE(parse_hex)
BOOST_CHECK(!TryParseHex("12 3").has_value());
}
-BOOST_AUTO_TEST_CASE(util_HexStr)
+BOOST_AUTO_TEST_CASE(consteval_hex_digit)
{
- BOOST_CHECK_EQUAL(
- HexStr(ParseHex_expected),
- "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
-
- BOOST_CHECK_EQUAL(
- HexStr(Span{ParseHex_expected}.last(0)),
- "");
+ BOOST_CHECK_EQUAL(ConstevalHexDigit('0'), 0);
+ BOOST_CHECK_EQUAL(ConstevalHexDigit('9'), 9);
+ BOOST_CHECK_EQUAL(ConstevalHexDigit('a'), 0xa);
+ BOOST_CHECK_EQUAL(ConstevalHexDigit('f'), 0xf);
+}
- BOOST_CHECK_EQUAL(
- HexStr(Span{ParseHex_expected}.first(0)),
- "");
+BOOST_AUTO_TEST_CASE(util_HexStr)
+{
+ BOOST_CHECK_EQUAL(HexStr(HEX_PARSE_OUTPUT), HEX_PARSE_INPUT);
+ BOOST_CHECK_EQUAL(HexStr(Span{HEX_PARSE_OUTPUT}.last(0)), "");
+ BOOST_CHECK_EQUAL(HexStr(Span{HEX_PARSE_OUTPUT}.first(0)), "");
{
- const std::vector<char> in_s{ParseHex_expected, ParseHex_expected + 5};
+ constexpr std::string_view out_exp{"04678afdb0"};
+ constexpr std::span in_s{HEX_PARSE_OUTPUT, out_exp.size() / 2};
const Span<const uint8_t> in_u{MakeUCharSpan(in_s)};
const Span<const std::byte> in_b{MakeByteSpan(in_s)};
- const std::string out_exp{"04678afdb0"};
BOOST_CHECK_EQUAL(HexStr(in_u), out_exp);
BOOST_CHECK_EQUAL(HexStr(in_s), out_exp);
@@ -432,31 +458,6 @@ BOOST_AUTO_TEST_CASE(util_IsHex)
BOOST_CHECK(!IsHex("0x0000"));
}
-BOOST_AUTO_TEST_CASE(util_IsHexNumber)
-{
- BOOST_CHECK(IsHexNumber("0x0"));
- BOOST_CHECK(IsHexNumber("0"));
- BOOST_CHECK(IsHexNumber("0x10"));
- BOOST_CHECK(IsHexNumber("10"));
- BOOST_CHECK(IsHexNumber("0xff"));
- BOOST_CHECK(IsHexNumber("ff"));
- BOOST_CHECK(IsHexNumber("0xFfa"));
- BOOST_CHECK(IsHexNumber("Ffa"));
- BOOST_CHECK(IsHexNumber("0x00112233445566778899aabbccddeeffAABBCCDDEEFF"));
- BOOST_CHECK(IsHexNumber("00112233445566778899aabbccddeeffAABBCCDDEEFF"));
-
- BOOST_CHECK(!IsHexNumber("")); // empty string not allowed
- BOOST_CHECK(!IsHexNumber("0x")); // empty string after prefix not allowed
- BOOST_CHECK(!IsHexNumber("0x0 ")); // no spaces at end,
- BOOST_CHECK(!IsHexNumber(" 0x0")); // or beginning,
- BOOST_CHECK(!IsHexNumber("0x 0")); // or middle,
- BOOST_CHECK(!IsHexNumber(" ")); // etc.
- BOOST_CHECK(!IsHexNumber("0x0ga")); // invalid character
- BOOST_CHECK(!IsHexNumber("x0")); // broken prefix
- BOOST_CHECK(!IsHexNumber("0x0x00")); // two prefixes not allowed
-
-}
-
BOOST_AUTO_TEST_CASE(util_seed_insecure_rand)
{
SeedRandomForTest(SeedRand::ZEROS);
@@ -473,7 +474,7 @@ BOOST_AUTO_TEST_CASE(util_seed_insecure_rand)
for (int i = 0; i < 10000; i++) {
uint32_t rval;
do{
- rval=InsecureRand32()&mask;
+ rval=m_rng.rand32()&mask;
}while(rval>=(uint32_t)mod);
count += rval==0;
}
diff --git a/src/test/validation_block_tests.cpp b/src/test/validation_block_tests.cpp
index 588ac60498..f5c4204c55 100644
--- a/src/test/validation_block_tests.cpp
+++ b/src/test/validation_block_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2018-2022 The Bitcoin Core developers
+// Copyright (c) 2018-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -101,7 +101,7 @@ std::shared_ptr<CBlock> MinerTestingSetup::FinalizeBlock(std::shared_ptr<CBlock>
// submit block header, so that miner can get the block height from the
// global state and the node has the topology of the chain
BlockValidationState ignored;
- BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlockHeaders({pblock->GetBlockHeader()}, true, ignored));
+ BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlockHeaders({{pblock->GetBlockHeader()}}, true, ignored));
return pblock;
}
@@ -133,8 +133,8 @@ void MinerTestingSetup::BuildChain(const uint256& root, int height, const unsign
{
if (height <= 0 || blocks.size() >= max_size) return;
- bool gen_invalid = InsecureRandRange(100) < invalid_rate;
- bool gen_fork = InsecureRandRange(100) < branch_rate;
+ bool gen_invalid = m_rng.randrange(100U) < invalid_rate;
+ bool gen_fork = m_rng.randrange(100U) < branch_rate;
const std::shared_ptr<const CBlock> pblock = gen_invalid ? BadBlock(root) : GoodBlock(root);
blocks.push_back(pblock);
diff --git a/src/test/validation_chainstate_tests.cpp b/src/test/validation_chainstate_tests.cpp
index 1c02066047..30c5982b17 100644
--- a/src/test/validation_chainstate_tests.cpp
+++ b/src/test/validation_chainstate_tests.cpp
@@ -36,11 +36,11 @@ BOOST_AUTO_TEST_CASE(validation_chainstate_resize_caches)
// Add a coin to the in-memory cache, upsize once, then downsize.
{
LOCK(::cs_main);
- const auto outpoint = AddTestCoin(c1.CoinsTip());
+ const auto outpoint = AddTestCoin(m_rng, c1.CoinsTip());
// Set a meaningless bestblock value in the coinsview cache - otherwise we won't
// flush during ResizecoinsCaches() and will subsequently hit an assertion.
- c1.CoinsTip().SetBestBlock(InsecureRand256());
+ c1.CoinsTip().SetBestBlock(m_rng.rand256());
BOOST_CHECK(c1.CoinsTip().HaveCoinInCache(outpoint));
diff --git a/src/test/validation_chainstatemanager_tests.cpp b/src/test/validation_chainstatemanager_tests.cpp
index cf819f8751..b4fcfbd853 100644
--- a/src/test/validation_chainstatemanager_tests.cpp
+++ b/src/test/validation_chainstatemanager_tests.cpp
@@ -5,6 +5,7 @@
#include <chainparams.h>
#include <consensus/validation.h>
#include <kernel/disconnected_transactions.h>
+#include <node/chainstatemanager_args.h>
#include <node/kernel_notifications.h>
#include <node/utxo_snapshot.h>
#include <random.h>
@@ -16,6 +17,8 @@
#include <test/util/setup_common.h>
#include <test/util/validation.h>
#include <uint256.h>
+#include <util/result.h>
+#include <util/vector.h>
#include <validation.h>
#include <validationinterface.h>
@@ -152,10 +155,10 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_rebalance_caches, TestChain100Setup)
manager.MaybeRebalanceCaches();
}
- BOOST_CHECK_CLOSE(c1.m_coinstip_cache_size_bytes, max_cache * 0.05, 1);
- BOOST_CHECK_CLOSE(c1.m_coinsdb_cache_size_bytes, max_cache * 0.05, 1);
- BOOST_CHECK_CLOSE(c2.m_coinstip_cache_size_bytes, max_cache * 0.95, 1);
- BOOST_CHECK_CLOSE(c2.m_coinsdb_cache_size_bytes, max_cache * 0.95, 1);
+ BOOST_CHECK_CLOSE(double(c1.m_coinstip_cache_size_bytes), max_cache * 0.05, 1);
+ BOOST_CHECK_CLOSE(double(c1.m_coinsdb_cache_size_bytes), max_cache * 0.05, 1);
+ BOOST_CHECK_CLOSE(double(c2.m_coinstip_cache_size_bytes), max_cache * 0.95, 1);
+ BOOST_CHECK_CLOSE(double(c2.m_coinsdb_cache_size_bytes), max_cache * 0.95, 1);
}
struct SnapshotTestSetup : TestChain100Setup {
@@ -715,10 +718,10 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_snapshot_completion_hash_mismatch, Sna
CCoinsViewCache& ibd_coins = WITH_LOCK(::cs_main,
return validation_chainstate.CoinsTip());
Coin badcoin;
- badcoin.out.nValue = InsecureRand32();
+ badcoin.out.nValue = m_rng.rand32();
badcoin.nHeight = 1;
- badcoin.out.scriptPubKey.assign(InsecureRandBits(6), 0);
- Txid txid = Txid::FromUint256(InsecureRand256());
+ badcoin.out.scriptPubKey.assign(m_rng.randbits(6), 0);
+ Txid txid = Txid::FromUint256(m_rng.rand256());
ibd_coins.AddCoin(COutPoint(txid, 0), std::move(badcoin), false);
fs::path snapshot_chainstate_dir = gArgs.GetDataDirNet() / "chainstate_snapshot";
@@ -769,4 +772,63 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_snapshot_completion_hash_mismatch, Sna
}
}
+/** Helper function to parse args into args_man and return the result of applying them to opts */
+template <typename Options>
+util::Result<Options> SetOptsFromArgs(ArgsManager& args_man, Options opts,
+ const std::vector<const char*>& args)
+{
+ const auto argv{Cat({"ignore"}, args)};
+ std::string error{};
+ if (!args_man.ParseParameters(argv.size(), argv.data(), error)) {
+ return util::Error{Untranslated("ParseParameters failed with error: " + error)};
+ }
+ const auto result{node::ApplyArgsManOptions(args_man, opts)};
+ if (!result) return util::Error{util::ErrorString(result)};
+ return opts;
+}
+
+BOOST_FIXTURE_TEST_CASE(chainstatemanager_args, BasicTestingSetup)
+{
+ //! Try to apply the provided args to a ChainstateManager::Options
+ auto get_opts = [&](const std::vector<const char*>& args) {
+ static kernel::Notifications notifications{};
+ static const ChainstateManager::Options options{
+ .chainparams = ::Params(),
+ .datadir = {},
+ .notifications = notifications};
+ return SetOptsFromArgs(*this->m_node.args, options, args);
+ };
+ //! Like get_opts, but requires the provided args to be valid and unwraps the result
+ auto get_valid_opts = [&](const std::vector<const char*>& args) {
+ const auto result{get_opts(args)};
+ BOOST_REQUIRE_MESSAGE(result, util::ErrorString(result).original);
+ return *result;
+ };
+
+ // test -assumevalid
+ BOOST_CHECK(!get_valid_opts({}).assumed_valid_block);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-assumevalid="}).assumed_valid_block, uint256::ZERO);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-assumevalid=0"}).assumed_valid_block, uint256::ZERO);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-noassumevalid"}).assumed_valid_block, uint256::ZERO);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-assumevalid=0x12"}).assumed_valid_block, uint256{0x12});
+
+ std::string assume_valid{"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"};
+ BOOST_CHECK_EQUAL(get_valid_opts({("-assumevalid=" + assume_valid).c_str()}).assumed_valid_block, uint256::FromHex(assume_valid));
+
+ BOOST_CHECK(!get_opts({"-assumevalid=xyz"})); // invalid hex characters
+ BOOST_CHECK(!get_opts({"-assumevalid=01234567890123456789012345678901234567890123456789012345678901234"})); // > 64 hex chars
+
+ // test -minimumchainwork
+ BOOST_CHECK(!get_valid_opts({}).minimum_chain_work);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-minimumchainwork=0"}).minimum_chain_work, arith_uint256());
+ BOOST_CHECK_EQUAL(get_valid_opts({"-nominimumchainwork"}).minimum_chain_work, arith_uint256());
+ BOOST_CHECK_EQUAL(get_valid_opts({"-minimumchainwork=0x1234"}).minimum_chain_work, arith_uint256{0x1234});
+
+ std::string minimum_chainwork{"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"};
+ BOOST_CHECK_EQUAL(get_valid_opts({("-minimumchainwork=" + minimum_chainwork).c_str()}).minimum_chain_work, UintToArith256(uint256::FromHex(minimum_chainwork).value()));
+
+ BOOST_CHECK(!get_opts({"-minimumchainwork=xyz"})); // invalid hex characters
+ BOOST_CHECK(!get_opts({"-minimumchainwork=01234567890123456789012345678901234567890123456789012345678901234"})); // > 64 hex chars
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/validation_flush_tests.cpp b/src/test/validation_flush_tests.cpp
index 7398091215..c325f7deb2 100644
--- a/src/test/validation_flush_tests.cpp
+++ b/src/test/validation_flush_tests.cpp
@@ -50,7 +50,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
// Add a bunch of coins to see that we at least flip over to CRITICAL.
for (int i{0}; i < 1000; ++i) {
- const COutPoint res = AddTestCoin(view);
+ const COutPoint res = AddTestCoin(m_rng, view);
BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE);
}
@@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
CoinsCacheSizeState::OK);
for (int i{0}; i < COINS_UNTIL_CRITICAL; ++i) {
- const COutPoint res = AddTestCoin(view);
+ const COutPoint res = AddTestCoin(m_rng, view);
print_view_mem_usage(view);
BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE);
@@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
// Adding some additional coins will push us over the edge to CRITICAL.
for (int i{0}; i < 4; ++i) {
- AddTestCoin(view);
+ AddTestCoin(m_rng, view);
print_view_mem_usage(view);
if (chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/0) ==
CoinsCacheSizeState::CRITICAL) {
@@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
CoinsCacheSizeState::OK);
for (int i{0}; i < 3; ++i) {
- AddTestCoin(view);
+ AddTestCoin(m_rng, view);
print_view_mem_usage(view);
BOOST_CHECK_EQUAL(
chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/ 1 << 19),
@@ -117,7 +117,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
// Adding another coin with the additional mempool room will put us >90%
// but not yet critical.
- AddTestCoin(view);
+ AddTestCoin(m_rng, view);
print_view_mem_usage(view);
// Only perform these checks on 64 bit hosts; I haven't done the math for 32.
@@ -133,7 +133,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
// Using the default max_* values permits way more coins to be added.
for (int i{0}; i < 1000; ++i) {
- AddTestCoin(view);
+ AddTestCoin(m_rng, view);
BOOST_CHECK_EQUAL(
chainstate.GetCoinsCacheSizeState(),
CoinsCacheSizeState::OK);
@@ -145,7 +145,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, 0),
CoinsCacheSizeState::CRITICAL);
- view.SetBestBlock(InsecureRand256());
+ view.SetBestBlock(m_rng.rand256());
BOOST_CHECK(view.Flush());
print_view_mem_usage(view);
diff --git a/src/test/versionbits_tests.cpp b/src/test/versionbits_tests.cpp
index 896840b0f3..29240a45f0 100644
--- a/src/test/versionbits_tests.cpp
+++ b/src/test/versionbits_tests.cpp
@@ -67,6 +67,7 @@ public:
class VersionBitsTester
{
+ FastRandomContext& m_rng;
// A fake blockchain
std::vector<CBlockIndex*> vpblock;
@@ -85,6 +86,8 @@ class VersionBitsTester
int num{1000};
public:
+ VersionBitsTester(FastRandomContext& rng) : m_rng{rng} {}
+
VersionBitsTester& Reset() {
// Have each group of tests be counted by the 1000s part, starting at 1000
num = num - (num % 1000) + 1000;
@@ -128,7 +131,7 @@ public:
{
const CBlockIndex* tip = Tip();
for (int i = 0; i < CHECKERS; i++) {
- if (InsecureRandBits(i) == 0) {
+ if (m_rng.randbits(i) == 0) {
BOOST_CHECK_MESSAGE(checker[i].GetStateSinceHeightFor(tip) == height, strprintf("Test %i for StateSinceHeight", num));
BOOST_CHECK_MESSAGE(checker_delayed[i].GetStateSinceHeightFor(tip) == height_delayed, strprintf("Test %i for StateSinceHeight (delayed)", num));
BOOST_CHECK_MESSAGE(checker_always[i].GetStateSinceHeightFor(tip) == 0, strprintf("Test %i for StateSinceHeight (always active)", num));
@@ -154,7 +157,7 @@ public:
const CBlockIndex* pindex = Tip();
for (int i = 0; i < CHECKERS; i++) {
- if (InsecureRandBits(i) == 0) {
+ if (m_rng.randbits(i) == 0) {
ThresholdState got = checker[i].GetStateFor(pindex);
ThresholdState got_delayed = checker_delayed[i].GetStateFor(pindex);
ThresholdState got_always = checker_always[i].GetStateFor(pindex);
@@ -190,7 +193,7 @@ BOOST_AUTO_TEST_CASE(versionbits_test)
{
for (int i = 0; i < 64; i++) {
// DEFINED -> STARTED after timeout reached -> FAILED
- VersionBitsTester().TestDefined().TestStateSinceHeight(0)
+ VersionBitsTester(m_rng).TestDefined().TestStateSinceHeight(0)
.Mine(1, TestTime(1), 0x100).TestDefined().TestStateSinceHeight(0)
.Mine(11, TestTime(11), 0x100).TestDefined().TestStateSinceHeight(0)
.Mine(989, TestTime(989), 0x100).TestDefined().TestStateSinceHeight(0)
@@ -256,8 +259,9 @@ BOOST_AUTO_TEST_CASE(versionbits_test)
}
}
+struct BlockVersionTest : BasicTestingSetup {
/** Check that ComputeBlockVersion will set the appropriate bit correctly */
-static void check_computeblockversion(VersionBitsCache& versionbitscache, const Consensus::Params& params, Consensus::DeploymentPos dep)
+void check_computeblockversion(VersionBitsCache& versionbitscache, const Consensus::Params& params, Consensus::DeploymentPos dep)
{
// Clear the cache every time
versionbitscache.Clear();
@@ -295,7 +299,7 @@ static void check_computeblockversion(VersionBitsCache& versionbitscache, const
// In the first chain, test that the bit is set by CBV until it has failed.
// In the second chain, test the bit is set by CBV while STARTED and
// LOCKED-IN, and then no longer set while ACTIVE.
- VersionBitsTester firstChain, secondChain;
+ VersionBitsTester firstChain{m_rng}, secondChain{m_rng};
int64_t nTime = nStartTime;
@@ -412,8 +416,9 @@ static void check_computeblockversion(VersionBitsCache& versionbitscache, const
// Check that we don't signal after activation
BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
}
+}; // struct BlockVersionTest
-BOOST_AUTO_TEST_CASE(versionbits_computeblockversion)
+BOOST_FIXTURE_TEST_CASE(versionbits_computeblockversion, BlockVersionTest)
{
VersionBitsCache vbcache;
diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp
index 4f79644c8d..58fc1bdf2a 100644
--- a/src/torcontrol.cpp
+++ b/src/torcontrol.cpp
@@ -110,7 +110,7 @@ void TorControlConnection::readcb(struct bufferevent *bev, void *ctx)
self->reply_handlers.front()(*self, self->message);
self->reply_handlers.pop_front();
} else {
- LogPrint(BCLog::TOR, "Received unexpected sync reply %i\n", self->message.code);
+ LogDebug(BCLog::TOR, "Received unexpected sync reply %i\n", self->message.code);
}
}
self->message.Clear();
@@ -129,13 +129,13 @@ void TorControlConnection::eventcb(struct bufferevent *bev, short what, void *ct
{
TorControlConnection *self = static_cast<TorControlConnection*>(ctx);
if (what & BEV_EVENT_CONNECTED) {
- LogPrint(BCLog::TOR, "Successfully connected!\n");
+ LogDebug(BCLog::TOR, "Successfully connected!\n");
self->connected(*self);
} else if (what & (BEV_EVENT_EOF|BEV_EVENT_ERROR)) {
if (what & BEV_EVENT_ERROR) {
- LogPrint(BCLog::TOR, "Error connecting to Tor control socket\n");
+ LogDebug(BCLog::TOR, "Error connecting to Tor control socket\n");
} else {
- LogPrint(BCLog::TOR, "End of stream\n");
+ LogDebug(BCLog::TOR, "End of stream\n");
}
self->Disconnect();
self->disconnected(*self);
@@ -334,7 +334,7 @@ TorController::TorController(struct event_base* _base, const std::string& tor_co
// Read service private key if cached
std::pair<bool,std::string> pkf = ReadBinaryFile(GetPrivateKeyFile());
if (pkf.first) {
- LogPrint(BCLog::TOR, "Reading cached private key from %s\n", fs::PathToString(GetPrivateKeyFile()));
+ LogDebug(BCLog::TOR, "Reading cached private key from %s\n", fs::PathToString(GetPrivateKeyFile()));
private_key = pkf.second;
}
}
@@ -375,7 +375,7 @@ void TorController::get_socks_cb(TorControlConnection& _conn, const TorControlRe
}
}
if (!socks_location.empty()) {
- LogPrint(BCLog::TOR, "Get SOCKS port command yielded %s\n", socks_location);
+ LogDebug(BCLog::TOR, "Get SOCKS port command yielded %s\n", socks_location);
} else {
LogPrintf("tor: Get SOCKS port command returned nothing\n");
}
@@ -396,7 +396,7 @@ void TorController::get_socks_cb(TorControlConnection& _conn, const TorControlRe
}
Assume(resolved.IsValid());
- LogPrint(BCLog::TOR, "Configuring onion proxy for %s\n", resolved.ToStringAddrPort());
+ LogDebug(BCLog::TOR, "Configuring onion proxy for %s\n", resolved.ToStringAddrPort());
Proxy addrOnion = Proxy(resolved, true);
SetProxy(NET_ONION, addrOnion);
@@ -420,7 +420,7 @@ void TorController::get_socks_cb(TorControlConnection& _conn, const TorControlRe
void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint(BCLog::TOR, "ADD_ONION successful\n");
+ LogDebug(BCLog::TOR, "ADD_ONION successful\n");
for (const std::string &s : reply.lines) {
std::map<std::string,std::string> m = ParseTorReplyMapping(s);
std::map<std::string,std::string>::iterator i;
@@ -439,7 +439,7 @@ void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlRe
service = LookupNumeric(std::string(service_id+".onion"), Params().GetDefaultPort());
LogInfo("Got tor service ID %s, advertising service %s\n", service_id, service.ToStringAddrPort());
if (WriteBinaryFile(GetPrivateKeyFile(), private_key)) {
- LogPrint(BCLog::TOR, "Cached service private key to %s\n", fs::PathToString(GetPrivateKeyFile()));
+ LogDebug(BCLog::TOR, "Cached service private key to %s\n", fs::PathToString(GetPrivateKeyFile()));
} else {
LogPrintf("tor: Error writing service private key to %s\n", fs::PathToString(GetPrivateKeyFile()));
}
@@ -455,7 +455,7 @@ void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlRe
void TorController::auth_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint(BCLog::TOR, "Authentication successful\n");
+ LogDebug(BCLog::TOR, "Authentication successful\n");
// Now that we know Tor is running setup the proxy for onion addresses
// if -onion isn't set to something else.
@@ -506,7 +506,7 @@ static std::vector<uint8_t> ComputeResponse(const std::string &key, const std::v
void TorController::authchallenge_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint(BCLog::TOR, "SAFECOOKIE authentication challenge successful\n");
+ LogDebug(BCLog::TOR, "SAFECOOKIE authentication challenge successful\n");
std::pair<std::string,std::string> l = SplitTorReplyLine(reply.lines[0]);
if (l.first == "AUTHCHALLENGE") {
std::map<std::string,std::string> m = ParseTorReplyMapping(l.second);
@@ -516,7 +516,7 @@ void TorController::authchallenge_cb(TorControlConnection& _conn, const TorContr
}
std::vector<uint8_t> serverHash = ParseHex(m["SERVERHASH"]);
std::vector<uint8_t> serverNonce = ParseHex(m["SERVERNONCE"]);
- LogPrint(BCLog::TOR, "AUTHCHALLENGE ServerHash %s ServerNonce %s\n", HexStr(serverHash), HexStr(serverNonce));
+ LogDebug(BCLog::TOR, "AUTHCHALLENGE ServerHash %s ServerNonce %s\n", HexStr(serverHash), HexStr(serverNonce));
if (serverNonce.size() != 32) {
LogPrintf("tor: ServerNonce is not 32 bytes, as required by spec\n");
return;
@@ -563,12 +563,12 @@ void TorController::protocolinfo_cb(TorControlConnection& _conn, const TorContro
std::map<std::string,std::string> m = ParseTorReplyMapping(l.second);
std::map<std::string,std::string>::iterator i;
if ((i = m.find("Tor")) != m.end()) {
- LogPrint(BCLog::TOR, "Connected to Tor version %s\n", i->second);
+ LogDebug(BCLog::TOR, "Connected to Tor version %s\n", i->second);
}
}
}
for (const std::string &s : methods) {
- LogPrint(BCLog::TOR, "Supported authentication method: %s\n", s);
+ LogDebug(BCLog::TOR, "Supported authentication method: %s\n", s);
}
// Prefer NULL, otherwise SAFECOOKIE. If a password is provided, use HASHEDPASSWORD
/* Authentication:
@@ -578,18 +578,18 @@ void TorController::protocolinfo_cb(TorControlConnection& _conn, const TorContro
std::string torpassword = gArgs.GetArg("-torpassword", "");
if (!torpassword.empty()) {
if (methods.count("HASHEDPASSWORD")) {
- LogPrint(BCLog::TOR, "Using HASHEDPASSWORD authentication\n");
+ LogDebug(BCLog::TOR, "Using HASHEDPASSWORD authentication\n");
ReplaceAll(torpassword, "\"", "\\\"");
_conn.Command("AUTHENTICATE \"" + torpassword + "\"", std::bind(&TorController::auth_cb, this, std::placeholders::_1, std::placeholders::_2));
} else {
LogPrintf("tor: Password provided with -torpassword, but HASHEDPASSWORD authentication is not available\n");
}
} else if (methods.count("NULL")) {
- LogPrint(BCLog::TOR, "Using NULL authentication\n");
+ LogDebug(BCLog::TOR, "Using NULL authentication\n");
_conn.Command("AUTHENTICATE", std::bind(&TorController::auth_cb, this, std::placeholders::_1, std::placeholders::_2));
} else if (methods.count("SAFECOOKIE")) {
// Cookie: hexdump -e '32/1 "%02x""\n"' ~/.tor/control_auth_cookie
- LogPrint(BCLog::TOR, "Using SAFECOOKIE authentication, reading cookie authentication from %s\n", cookiefile);
+ LogDebug(BCLog::TOR, "Using SAFECOOKIE authentication, reading cookie authentication from %s\n", cookiefile);
std::pair<bool,std::string> status_cookie = ReadBinaryFile(fs::PathFromString(cookiefile), TOR_COOKIE_SIZE);
if (status_cookie.first && status_cookie.second.size() == TOR_COOKIE_SIZE) {
// _conn.Command("AUTHENTICATE " + HexStr(status_cookie.second), std::bind(&TorController::auth_cb, this, std::placeholders::_1, std::placeholders::_2));
@@ -631,7 +631,7 @@ void TorController::disconnected_cb(TorControlConnection& _conn)
if (!reconnect)
return;
- LogPrint(BCLog::TOR, "Not connected to Tor control port %s, trying to reconnect\n", m_tor_control_center);
+ LogDebug(BCLog::TOR, "Not connected to Tor control port %s, trying to reconnect\n", m_tor_control_center);
// Single-shot timer for reconnect. Use exponential backoff.
struct timeval time = MillisToTimeval(int64_t(reconnect_timeout * 1000.0));
diff --git a/src/txdb.cpp b/src/txdb.cpp
index 3865692b6a..9b43a2b03e 100644
--- a/src/txdb.cpp
+++ b/src/txdb.cpp
@@ -126,7 +126,7 @@ bool CCoinsViewDB::BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashB
count++;
it = cursor.NextAndMaybeErase(*it);
if (batch.SizeEstimate() > m_options.batch_write_bytes) {
- LogPrint(BCLog::COINDB, "Writing partial batch of %.2f MiB\n", batch.SizeEstimate() * (1.0 / 1048576.0));
+ LogDebug(BCLog::COINDB, "Writing partial batch of %.2f MiB\n", batch.SizeEstimate() * (1.0 / 1048576.0));
m_db->WriteBatch(batch);
batch.Clear();
if (m_options.simulate_crash_ratio) {
@@ -143,9 +143,9 @@ bool CCoinsViewDB::BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashB
batch.Erase(DB_HEAD_BLOCKS);
batch.Write(DB_BEST_BLOCK, hashBlock);
- LogPrint(BCLog::COINDB, "Writing final batch of %.2f MiB\n", batch.SizeEstimate() * (1.0 / 1048576.0));
+ LogDebug(BCLog::COINDB, "Writing final batch of %.2f MiB\n", batch.SizeEstimate() * (1.0 / 1048576.0));
bool ret = m_db->WriteBatch(batch);
- LogPrint(BCLog::COINDB, "Committed %u changed transaction outputs (out of %u) to coin database...\n", (unsigned int)changed, (unsigned int)count);
+ LogDebug(BCLog::COINDB, "Committed %u changed transaction outputs (out of %u) to coin database...\n", (unsigned int)changed, (unsigned int)count);
return ret;
}
diff --git a/src/txdb.h b/src/txdb.h
index e0acb09e98..412d6c6009 100644
--- a/src/txdb.h
+++ b/src/txdb.h
@@ -25,8 +25,6 @@ class uint256;
static const int64_t nDefaultDbCache = 450;
//! -dbbatchsize default (bytes)
static const int64_t nDefaultDbBatchSize = 16 << 20;
-//! max. -dbcache (MiB)
-static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 16384 : 1024;
//! min. -dbcache (MiB)
static const int64_t nMinDbCache = 4;
//! Max memory allocated to block tree DB specific cache, if no -txindex (MiB)
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index b523c5fe09..f8f5ec0360 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -661,7 +661,7 @@ void CTxMemPool::check(const CCoinsViewCache& active_coins_tip, int64_t spendhei
AssertLockHeld(::cs_main);
LOCK(cs);
- LogPrint(BCLog::MEMPOOL, "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size());
+ LogDebug(BCLog::MEMPOOL, "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size());
uint64_t checkTotal = 0;
CAmount check_total_fee{0};
@@ -1036,7 +1036,7 @@ void CTxMemPool::RemoveUnbroadcastTx(const uint256& txid, const bool unchecked)
if (m_unbroadcast_txids.erase(txid))
{
- LogPrint(BCLog::MEMPOOL, "Removed %i from set of unbroadcast txns%s\n", txid.GetHex(), (unchecked ? " before confirmation that txn was sent out" : ""));
+ LogDebug(BCLog::MEMPOOL, "Removed %i from set of unbroadcast txns%s\n", txid.GetHex(), (unchecked ? " before confirmation that txn was sent out" : ""));
}
}
@@ -1164,7 +1164,7 @@ void CTxMemPool::TrimToSize(size_t sizelimit, std::vector<COutPoint>* pvNoSpends
}
if (maxFeeRateRemoved > CFeeRate(0)) {
- LogPrint(BCLog::MEMPOOL, "Removed %u txn, rolling minimum fee bumped to %s\n", nTxnRemoved, maxFeeRateRemoved.ToString());
+ LogDebug(BCLog::MEMPOOL, "Removed %u txn, rolling minimum fee bumped to %s\n", nTxnRemoved, maxFeeRateRemoved.ToString());
}
}
diff --git a/src/txorphanage.cpp b/src/txorphanage.cpp
index faab208333..35a215c88a 100644
--- a/src/txorphanage.cpp
+++ b/src/txorphanage.cpp
@@ -29,7 +29,7 @@ bool TxOrphanage::AddTx(const CTransactionRef& tx, NodeId peer)
unsigned int sz = GetTransactionWeight(*tx);
if (sz > MAX_STANDARD_TX_WEIGHT)
{
- LogPrint(BCLog::TXPACKAGES, "ignoring large orphan tx (size: %u, txid: %s, wtxid: %s)\n", sz, hash.ToString(), wtxid.ToString());
+ LogDebug(BCLog::TXPACKAGES, "ignoring large orphan tx (size: %u, txid: %s, wtxid: %s)\n", sz, hash.ToString(), wtxid.ToString());
return false;
}
@@ -40,7 +40,7 @@ bool TxOrphanage::AddTx(const CTransactionRef& tx, NodeId peer)
m_outpoint_to_orphan_it[txin.prevout].insert(ret.first);
}
- LogPrint(BCLog::TXPACKAGES, "stored orphan tx %s (wtxid=%s), weight: %u (mapsz %u outsz %u)\n", hash.ToString(), wtxid.ToString(), sz,
+ LogDebug(BCLog::TXPACKAGES, "stored orphan tx %s (wtxid=%s), weight: %u (mapsz %u outsz %u)\n", hash.ToString(), wtxid.ToString(), sz,
m_orphans.size(), m_outpoint_to_orphan_it.size());
return true;
}
@@ -72,7 +72,7 @@ int TxOrphanage::EraseTx(const Wtxid& wtxid)
const auto& txid = it->second.tx->GetHash();
// Time spent in orphanage = difference between current and entry time.
// Entry time is equal to ORPHAN_TX_EXPIRE_TIME earlier than entry's expiry.
- LogPrint(BCLog::TXPACKAGES, " removed orphan tx %s (wtxid=%s) after %ds\n", txid.ToString(), wtxid.ToString(),
+ LogDebug(BCLog::TXPACKAGES, " removed orphan tx %s (wtxid=%s) after %ds\n", txid.ToString(), wtxid.ToString(),
Ticks<std::chrono::seconds>(NodeClock::now() + ORPHAN_TX_EXPIRE_TIME - it->second.nTimeExpire));
m_orphan_list.pop_back();
@@ -94,7 +94,7 @@ void TxOrphanage::EraseForPeer(NodeId peer)
nErased += EraseTx(wtxid);
}
}
- if (nErased > 0) LogPrint(BCLog::TXPACKAGES, "Erased %d orphan transaction(s) from peer=%d\n", nErased, peer);
+ if (nErased > 0) LogDebug(BCLog::TXPACKAGES, "Erased %d orphan transaction(s) from peer=%d\n", nErased, peer);
}
void TxOrphanage::LimitOrphans(unsigned int max_orphans, FastRandomContext& rng)
@@ -117,7 +117,7 @@ void TxOrphanage::LimitOrphans(unsigned int max_orphans, FastRandomContext& rng)
}
// Sweep again 5 minutes after the next entry that expires in order to batch the linear scan.
m_next_sweep = nMinExpTime + ORPHAN_TX_EXPIRE_INTERVAL;
- if (nErased > 0) LogPrint(BCLog::TXPACKAGES, "Erased %d orphan tx due to expiration\n", nErased);
+ if (nErased > 0) LogDebug(BCLog::TXPACKAGES, "Erased %d orphan tx due to expiration\n", nErased);
}
while (m_orphans.size() > max_orphans)
{
@@ -126,7 +126,7 @@ void TxOrphanage::LimitOrphans(unsigned int max_orphans, FastRandomContext& rng)
EraseTx(m_orphan_list[randompos]->second.tx->GetWitnessHash());
++nEvicted;
}
- if (nEvicted > 0) LogPrint(BCLog::TXPACKAGES, "orphanage overflow, removed %u tx\n", nEvicted);
+ if (nEvicted > 0) LogDebug(BCLog::TXPACKAGES, "orphanage overflow, removed %u tx\n", nEvicted);
}
void TxOrphanage::AddChildrenToWorkSet(const CTransaction& tx)
@@ -140,7 +140,7 @@ void TxOrphanage::AddChildrenToWorkSet(const CTransaction& tx)
std::set<Wtxid>& orphan_work_set = m_peer_work_set.try_emplace(elem->second.fromPeer).first->second;
// Add this tx to the work set
orphan_work_set.insert(elem->first);
- LogPrint(BCLog::TXPACKAGES, "added %s (wtxid=%s) to peer %d workset\n",
+ LogDebug(BCLog::TXPACKAGES, "added %s (wtxid=%s) to peer %d workset\n",
tx.GetHash().ToString(), tx.GetWitnessHash().ToString(), elem->second.fromPeer);
}
}
@@ -204,7 +204,7 @@ void TxOrphanage::EraseForBlock(const CBlock& block)
for (const auto& orphanHash : vOrphanErase) {
nErased += EraseTx(orphanHash);
}
- LogPrint(BCLog::TXPACKAGES, "Erased %d orphan transaction(s) included or conflicted by block\n", nErased);
+ LogDebug(BCLog::TXPACKAGES, "Erased %d orphan transaction(s) included or conflicted by block\n", nErased);
}
}
diff --git a/src/uint256.h b/src/uint256.h
index cf008765bd..8223787041 100644
--- a/src/uint256.h
+++ b/src/uint256.h
@@ -9,6 +9,7 @@
#include <crypto/common.h>
#include <span.h>
#include <util/strencodings.h>
+#include <util/string.h>
#include <algorithm>
#include <array>
@@ -17,6 +18,7 @@
#include <cstring>
#include <optional>
#include <string>
+#include <string_view>
/** Template base class for fixed-sized opaque blobs. */
template<unsigned int BITS>
@@ -125,20 +127,11 @@ public:
template <unsigned int BITS>
consteval base_blob<BITS>::base_blob(std::string_view hex_str)
{
- // Non-lookup table version of HexDigit().
- auto from_hex = [](const char c) -> int8_t {
- if (c >= '0' && c <= '9') return c - '0';
- if (c >= 'a' && c <= 'f') return c - 'a' + 0xA;
- if (c >= 'A' && c <= 'F') return c - 'A' + 0xA;
-
- assert(false); // Reached if ctor is called with an invalid hex digit.
- };
-
- assert(hex_str.length() == m_data.size() * 2); // 2 hex digits per byte.
+ if (hex_str.length() != m_data.size() * 2) throw "Hex string must fit exactly";
auto str_it = hex_str.rbegin();
for (auto& elem : m_data) {
- auto lo = from_hex(*(str_it++));
- elem = (from_hex(*(str_it++)) << 4) | lo;
+ auto lo = util::ConstevalHexDigit(*(str_it++));
+ elem = (util::ConstevalHexDigit(*(str_it++)) << 4) | lo;
}
}
@@ -157,6 +150,25 @@ std::optional<uintN_t> FromHex(std::string_view str)
rv.SetHexDeprecated(str);
return rv;
}
+/**
+ * @brief Like FromHex(std::string_view str), but allows an "0x" prefix
+ * and pads the input with leading zeroes if it is shorter than
+ * the expected length of uintN_t::size()*2.
+ *
+ * Designed to be used when dealing with user input.
+ */
+template <class uintN_t>
+std::optional<uintN_t> FromUserHex(std::string_view input)
+{
+ input = util::RemovePrefixView(input, "0x");
+ constexpr auto expected_size{uintN_t::size() * 2};
+ if (input.size() < expected_size) {
+ auto padded = std::string(expected_size, '0');
+ std::copy(input.begin(), input.end(), padded.begin() + expected_size - input.size());
+ return FromHex<uintN_t>(padded);
+ }
+ return FromHex<uintN_t>(input);
+}
} // namespace detail
/** 160-bit opaque blob.
@@ -178,6 +190,7 @@ public:
class uint256 : public base_blob<256> {
public:
static std::optional<uint256> FromHex(std::string_view str) { return detail::FromHex<uint256>(str); }
+ static std::optional<uint256> FromUserHex(std::string_view str) { return detail::FromUserHex<uint256>(str); }
constexpr uint256() = default;
consteval explicit uint256(std::string_view hex_str) : base_blob<256>(hex_str) {}
constexpr explicit uint256(uint8_t v) : base_blob<256>(v) {}
@@ -186,14 +199,4 @@ public:
static const uint256 ONE;
};
-/* uint256 from std::string_view, containing byte-reversed hex encoding.
- * DEPRECATED. Unlike FromHex this accepts any invalid input, thus it is fragile and deprecated!
- */
-inline uint256 uint256S(std::string_view str)
-{
- uint256 rv;
- rv.SetHexDeprecated(str);
- return rv;
-}
-
#endif // BITCOIN_UINT256_H
diff --git a/src/univalue/.gitignore b/src/univalue/.gitignore
deleted file mode 100644
index 19e42f814a..0000000000
--- a/src/univalue/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-.deps/
-INSTALL
-Makefile
-Makefile.in
-aclocal.m4
-autom4te.cache/
-compile
-config.log
-config.status
-config.guess
-config.sub
-configure
-depcomp
-install-sh
-missing
-stamp-h1
-univalue-config.h*
-test-driver
-libtool
-ltmain.sh
-test-suite.log
-
-*.a
-*.la
-*.lo
-*.logs
-*.o
-*.pc
-*.trs
-
-.dirstamp
-.libs
diff --git a/src/univalue/CMakeLists.txt b/src/univalue/CMakeLists.txt
new file mode 100644
index 0000000000..96733fe077
--- /dev/null
+++ b/src/univalue/CMakeLists.txt
@@ -0,0 +1,41 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(univalue STATIC EXCLUDE_FROM_ALL
+ lib/univalue.cpp
+ lib/univalue_get.cpp
+ lib/univalue_read.cpp
+ lib/univalue_write.cpp
+)
+target_include_directories(univalue
+ PUBLIC
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+)
+target_link_libraries(univalue PRIVATE core_interface)
+
+if(BUILD_TESTS)
+ add_executable(unitester test/unitester.cpp)
+ target_compile_definitions(unitester
+ PRIVATE
+ JSON_TEST_SRC=\"${CMAKE_CURRENT_SOURCE_DIR}/test\"
+ )
+ target_link_libraries(unitester
+ PRIVATE
+ core_interface
+ univalue
+ )
+ add_test(NAME univalue_test
+ COMMAND unitester
+ )
+
+ add_executable(object test/object.cpp)
+ target_link_libraries(object
+ PRIVATE
+ core_interface
+ univalue
+ )
+ add_test(NAME univalue_object_test
+ COMMAND object
+ )
+endif()
diff --git a/src/univalue/lib/.gitignore b/src/univalue/lib/.gitignore
deleted file mode 100644
index ee7fc2851c..0000000000
--- a/src/univalue/lib/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-gen
-.libs
diff --git a/src/univalue/sources.mk b/src/univalue/sources.mk
deleted file mode 100644
index 5e4d9c3831..0000000000
--- a/src/univalue/sources.mk
+++ /dev/null
@@ -1,86 +0,0 @@
-# - All Variables ending in _HEADERS or _SOURCES confuse automake, so the
-# _INT postfix is applied.
-# - Convenience variables, for example a UNIVALUE_TEST_DIR should not be used
-# as they interfere with automatic dependency generation
-# - The %reldir% is the relative path from the Makefile.am.
-
-UNIVALUE_INCLUDE_DIR_INT = %reldir%/include
-
-UNIVALUE_DIST_HEADERS_INT =
-UNIVALUE_DIST_HEADERS_INT += %reldir%/include/univalue.h
-UNIVALUE_DIST_HEADERS_INT += %reldir%/include/univalue_utffilter.h
-UNIVALUE_DIST_HEADERS_INT += %reldir%/include/univalue_escapes.h
-
-UNIVALUE_LIB_SOURCES_INT =
-UNIVALUE_LIB_SOURCES_INT += %reldir%/lib/univalue.cpp
-UNIVALUE_LIB_SOURCES_INT += %reldir%/lib/univalue_get.cpp
-UNIVALUE_LIB_SOURCES_INT += %reldir%/lib/univalue_read.cpp
-UNIVALUE_LIB_SOURCES_INT += %reldir%/lib/univalue_write.cpp
-
-UNIVALUE_TEST_DATA_DIR_INT = %reldir%/test
-
-UNIVALUE_TEST_UNITESTER_INT =
-UNIVALUE_TEST_UNITESTER_INT += %reldir%/test/unitester.cpp
-
-UNIVALUE_TEST_JSON_INT =
-UNIVALUE_TEST_JSON_INT += %reldir%/test/test_json.cpp
-
-UNIVALUE_TEST_OBJECT_INT =
-UNIVALUE_TEST_OBJECT_INT += %reldir%/test/object.cpp
-
-UNIVALUE_TEST_FILES_INT =
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail1.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail2.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail3.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail4.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail5.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail6.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail7.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail8.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail9.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail10.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail11.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail12.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail13.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail14.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail15.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail16.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail17.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail18.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail19.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail20.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail21.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail22.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail23.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail24.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail25.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail26.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail27.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail28.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail29.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail30.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail31.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail32.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail33.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail34.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail35.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail36.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail37.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail38.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail39.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail40.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail41.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail42.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail44.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail45.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/pass1.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/pass2.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/pass3.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/pass4.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round1.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round2.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round3.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round4.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round5.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round6.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round7.json
diff --git a/src/univalue/test/.gitignore b/src/univalue/test/.gitignore
deleted file mode 100644
index 5812c96b14..0000000000
--- a/src/univalue/test/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-
-object
-unitester
-test_json
-
-*.trs
-*.log
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
new file mode 100644
index 0000000000..26c6271f9b
--- /dev/null
+++ b/src/util/CMakeLists.txt
@@ -0,0 +1,45 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(bitcoin_util STATIC EXCLUDE_FROM_ALL
+ asmap.cpp
+ batchpriority.cpp
+ bip32.cpp
+ bytevectorhash.cpp
+ chaintype.cpp
+ check.cpp
+ exception.cpp
+ feefrac.cpp
+ fs.cpp
+ fs_helpers.cpp
+ hasher.cpp
+ moneystr.cpp
+ rbf.cpp
+ readwritefile.cpp
+ serfloat.cpp
+ signalinterrupt.cpp
+ sock.cpp
+ strencodings.cpp
+ string.cpp
+ syserror.cpp
+ thread.cpp
+ threadinterrupt.cpp
+ threadnames.cpp
+ time.cpp
+ tokenpipe.cpp
+ ../logging.cpp
+ ../random.cpp
+ ../randomenv.cpp
+ ../streams.cpp
+ ../support/lockedpool.cpp
+ ../sync.cpp
+)
+
+target_link_libraries(bitcoin_util
+ PRIVATE
+ core_interface
+ bitcoin_clientversion
+ bitcoin_crypto
+ $<$<PLATFORM_ID:Windows>:ws2_32>
+)
diff --git a/src/util/strencodings.cpp b/src/util/strencodings.cpp
index e030262a32..15cb40aba1 100644
--- a/src/util/strencodings.cpp
+++ b/src/util/strencodings.cpp
@@ -46,16 +46,6 @@ bool IsHex(std::string_view str)
return (str.size() > 0) && (str.size()%2 == 0);
}
-bool IsHexNumber(std::string_view str)
-{
- if (str.substr(0, 2) == "0x") str.remove_prefix(2);
- for (char c : str) {
- if (HexDigit(c) < 0) return false;
- }
- // Return false for empty string or "0x".
- return str.size() > 0;
-}
-
template <typename Byte>
std::optional<std::vector<Byte>> TryParseHex(std::string_view str)
{
diff --git a/src/util/strencodings.h b/src/util/strencodings.h
index e5c2d3ddf2..1543de03ab 100644
--- a/src/util/strencodings.h
+++ b/src/util/strencodings.h
@@ -13,6 +13,8 @@
#include <span.h>
#include <util/string.h>
+#include <array>
+#include <bit>
#include <charconv>
#include <cstddef>
#include <cstdint>
@@ -70,10 +72,6 @@ std::vector<Byte> ParseHex(std::string_view hex_str)
/* Returns true if each character in str is a hex character, and has an even
* number of hex digits.*/
bool IsHex(std::string_view str);
-/**
-* Return true if the string is a hex number, optionally prefixed with "0x"
-*/
-bool IsHexNumber(std::string_view str);
std::optional<std::vector<unsigned char>> DecodeBase64(std::string_view str);
std::string EncodeBase64(Span<const unsigned char> input);
inline std::string EncodeBase64(Span<const std::byte> input) { return EncodeBase64(MakeUCharSpan(input)); }
@@ -369,4 +367,79 @@ std::string Capitalize(std::string str);
*/
std::optional<uint64_t> ParseByteUnits(std::string_view str, ByteUnit default_multiplier);
+namespace util {
+/** consteval version of HexDigit() without the lookup table. */
+consteval uint8_t ConstevalHexDigit(const char c)
+{
+ if (c >= '0' && c <= '9') return c - '0';
+ if (c >= 'a' && c <= 'f') return c - 'a' + 0xa;
+
+ throw "Only lowercase hex digits are allowed, for consistency";
+}
+
+/**
+ * ""_hex is a compile-time user-defined literal returning a
+ * `std::array<std::byte>`, equivalent to ParseHex(). Variants provided:
+ *
+ * - ""_hex_v: Returns `std::vector<std::byte>`, useful for heap allocation or
+ * variable-length serialization.
+ *
+ * - ""_hex_u8: Returns `std::array<uint8_t>`, for cases where `std::byte` is
+ * incompatible.
+ *
+ * - ""_hex_v_u8: Returns `std::vector<uint8_t>`, combining heap allocation with
+ * `uint8_t`.
+ *
+ * @warning It could be necessary to use vector instead of array variants when
+ * serializing, or vice versa, because vectors are assumed to be variable-
+ * length and serialized with a size prefix, while arrays are considered fixed
+ * length and serialized with no prefix.
+ *
+ * @warning It may be preferable to use vector variants to save stack space when
+ * declaring local variables if hex strings are large. Alternatively variables
+ * could be declared constexpr to avoid using stack space.
+ *
+ * @warning Avoid `uint8_t` variants when not necessary, as the codebase
+ * migrates to use `std::byte` instead of `unsigned char` and `uint8_t`.
+ *
+ * @note One reason ""_hex uses `std::array` instead of `std::vector` like
+ * ParseHex() does is because heap-based containers cannot cross the compile-
+ * time/runtime barrier.
+ */
+inline namespace hex_literals {
+namespace detail {
+
+template <size_t N>
+struct Hex {
+ std::array<std::byte, N / 2> bytes{};
+ consteval Hex(const char (&hex_str)[N])
+ // 2 hex digits required per byte + implicit null terminator
+ requires(N % 2 == 1)
+ {
+ if (hex_str[N - 1]) throw "null terminator required";
+ for (std::size_t i = 0; i < bytes.size(); ++i) {
+ bytes[i] = static_cast<std::byte>(
+ (ConstevalHexDigit(hex_str[2 * i]) << 4) |
+ ConstevalHexDigit(hex_str[2 * i + 1]));
+ }
+ }
+};
+
+} // namespace detail
+
+template <util::detail::Hex str>
+constexpr auto operator""_hex() { return str.bytes; }
+
+template <util::detail::Hex str>
+constexpr auto operator""_hex_u8() { return std::bit_cast<std::array<uint8_t, str.bytes.size()>>(str.bytes); }
+
+template <util::detail::Hex str>
+constexpr auto operator""_hex_v() { return std::vector<std::byte>{str.bytes.begin(), str.bytes.end()}; }
+
+template <util::detail::Hex str>
+inline auto operator""_hex_v_u8() { return std::vector<uint8_t>{UCharCast(str.bytes.data()), UCharCast(str.bytes.data() + str.bytes.size())}; }
+
+} // inline namespace hex_literals
+} // namespace util
+
#endif // BITCOIN_UTIL_STRENCODINGS_H
diff --git a/src/util/string.h b/src/util/string.h
index 30c0a0d6c1..c5183d6c80 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2019-2022 The Bitcoin Core developers
+// Copyright (c) 2019-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -6,6 +6,7 @@
#define BITCOIN_UTIL_STRING_H
#include <span.h>
+#include <tinyformat.h>
#include <array>
#include <cstdint>
@@ -17,6 +18,67 @@
#include <vector>
namespace util {
+/**
+ * @brief A wrapper for a compile-time partially validated format string
+ *
+ * This struct can be used to enforce partial compile-time validation of format
+ * strings, to reduce the likelihood of tinyformat throwing exceptions at
+ * run-time. Validation is partial to try and prevent the most common errors
+ * while avoiding re-implementing the entire parsing logic.
+ *
+ * @note Counting of `*` dynamic width and precision fields (such as `%*c`,
+ * `%2$*3$d`, `%.*f`) is not implemented to minimize code complexity as long as
+ * they are not used in the codebase. Usage of these fields is not counted and
+ * can lead to run-time exceptions. Code wanting to use the `*` specifier can
+ * side-step this struct and call tinyformat directly.
+ */
+template <unsigned num_params>
+struct ConstevalFormatString {
+ const char* const fmt;
+ consteval ConstevalFormatString(const char* str) : fmt{str} { Detail_CheckNumFormatSpecifiers(fmt); }
+ constexpr static void Detail_CheckNumFormatSpecifiers(std::string_view str)
+ {
+ unsigned count_normal{0}; // Number of "normal" specifiers, like %s
+ unsigned count_pos{0}; // Max number in positional specifier, like %8$s
+ for (auto it{str.begin()}; it < str.end();) {
+ if (*it != '%') {
+ ++it;
+ continue;
+ }
+
+ if (++it >= str.end()) throw "Format specifier incorrectly terminated by end of string";
+ if (*it == '%') {
+ // Percent escape: %%
+ ++it;
+ continue;
+ }
+
+ unsigned maybe_num{0};
+ while ('0' <= *it && *it <= '9') {
+ maybe_num *= 10;
+ maybe_num += *it - '0';
+ ++it;
+ };
+
+ if (*it == '$') {
+ // Positional specifier, like %8$s
+ if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
+ count_pos = std::max(count_pos, maybe_num);
+ if (++it >= str.end()) throw "Format specifier incorrectly terminated by end of string";
+ } else {
+ // Non-positional specifier, like %s
+ ++count_normal;
+ ++it;
+ }
+ // The remainder "[flags][width][.precision][length]type" of the
+ // specifier is not checked. Parsing continues with the next '%'.
+ }
+ if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
+ unsigned count{count_normal | count_pos};
+ if (num_params != count) throw "Format specifier count must match the argument count!";
+ }
+};
+
void ReplaceAll(std::string& in_out, const std::string& search, const std::string& substitute);
/** Split a string on any char found in separators, returning a vector.
@@ -173,4 +235,12 @@ template <typename T1, size_t PREFIX_LEN>
}
} // namespace util
+namespace tinyformat {
+template <typename... Args>
+std::string format(util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args)
+{
+ return format(fmt.fmt, args...);
+}
+} // namespace tinyformat
+
#endif // BITCOIN_UTIL_STRING_H
diff --git a/src/validation.cpp b/src/validation.cpp
index bf2b4b315e..8e4ea8eda2 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -70,6 +70,7 @@
#include <numeric>
#include <optional>
#include <ranges>
+#include <span>
#include <string>
#include <tuple>
#include <utility>
@@ -107,13 +108,6 @@ const std::vector<std::string> CHECKLEVEL_DOC {
* */
static constexpr int PRUNE_LOCK_BUFFER{10};
-/**
- * Maximum number of seconds that the timestamp of the first
- * block of a difficulty adjustment period is allowed to
- * be earlier than the last block of the previous period (BIP94).
- */
-static constexpr int64_t MAX_TIMEWARP = 600;
-
GlobalMutex g_best_block_mutex;
std::condition_variable g_best_block_cv;
uint256 g_best_block;
@@ -276,7 +270,7 @@ static void LimitMempoolSize(CTxMemPool& pool, CCoinsViewCache& coins_cache)
AssertLockHeld(pool.cs);
int expired = pool.Expire(GetTime<std::chrono::seconds>() - pool.m_opts.expiry);
if (expired != 0) {
- LogPrint(BCLog::MEMPOOL, "Expired %i transactions from the memory pool\n", expired);
+ LogDebug(BCLog::MEMPOOL, "Expired %i transactions from the memory pool\n", expired);
}
std::vector<COutPoint> vNoSpendsRemaining;
@@ -1226,7 +1220,7 @@ bool MemPoolAccept::PackageMempoolChecks(const std::vector<CTransactionRef>& txn
"package RBF failed: " + err_tup.value().second, "");
}
- LogPrint(BCLog::TXPACKAGES, "package RBF checks passed: parent %s (wtxid=%s), child %s (wtxid=%s)\n",
+ LogDebug(BCLog::TXPACKAGES, "package RBF checks passed: parent %s (wtxid=%s), child %s (wtxid=%s)\n",
txns.front()->GetHash().ToString(), txns.front()->GetWitnessHash().ToString(),
txns.back()->GetHash().ToString(), txns.back()->GetWitnessHash().ToString());
@@ -1309,7 +1303,7 @@ bool MemPoolAccept::Finalize(const ATMPArgs& args, Workspace& ws)
// Remove conflicting transactions from the mempool
for (CTxMemPool::txiter it : m_subpackage.m_all_conflicts)
{
- LogPrint(BCLog::MEMPOOL, "replacing mempool tx %s (wtxid=%s, fees=%s, vsize=%s). New tx %s (wtxid=%s, fees=%s, vsize=%s)\n",
+ LogDebug(BCLog::MEMPOOL, "replacing mempool tx %s (wtxid=%s, fees=%s, vsize=%s). New tx %s (wtxid=%s, fees=%s, vsize=%s)\n",
it->GetTx().GetHash().ToString(),
it->GetTx().GetWitnessHash().ToString(),
it->GetFee(),
@@ -1412,7 +1406,7 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
[](const auto& ws) { return ws.m_ptx->GetWitnessHash(); });
if (!m_subpackage.m_replaced_transactions.empty()) {
- LogPrint(BCLog::MEMPOOL, "replaced %u mempool transactions with %u new one(s) for %s additional fees, %d delta bytes\n",
+ LogDebug(BCLog::MEMPOOL, "replaced %u mempool transactions with %u new one(s) for %s additional fees, %d delta bytes\n",
m_subpackage.m_replaced_transactions.size(), workspaces.size(),
m_subpackage.m_total_modified_fees - m_subpackage.m_conflicting_fees,
m_subpackage.m_total_vsize - static_cast<int>(m_subpackage.m_conflicting_size));
@@ -1500,7 +1494,7 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
}
if (!m_subpackage.m_replaced_transactions.empty()) {
- LogPrint(BCLog::MEMPOOL, "replaced %u mempool transactions with 1 new transaction for %s additional fees, %d delta bytes\n",
+ LogDebug(BCLog::MEMPOOL, "replaced %u mempool transactions with 1 new transaction for %s additional fees, %d delta bytes\n",
m_subpackage.m_replaced_transactions.size(),
ws.m_modified_fees - m_subpackage.m_conflicting_fees,
ws.m_vsize - static_cast<int>(m_subpackage.m_conflicting_size));
@@ -2493,7 +2487,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
const auto time_1{SteadyClock::now()};
m_chainman.time_check += time_1 - time_start;
- LogPrint(BCLog::BENCH, " - Sanity checks: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, " - Sanity checks: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_1 - time_start),
Ticks<SecondsDouble>(m_chainman.time_check),
Ticks<MillisecondsDouble>(m_chainman.time_check) / m_chainman.num_blocks_total);
@@ -2595,7 +2589,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
const auto time_2{SteadyClock::now()};
m_chainman.time_forks += time_2 - time_1;
- LogPrint(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_2 - time_1),
Ticks<SecondsDouble>(m_chainman.time_forks),
Ticks<MillisecondsDouble>(m_chainman.time_forks) / m_chainman.num_blocks_total);
@@ -2686,7 +2680,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
}
const auto time_3{SteadyClock::now()};
m_chainman.time_connect += time_3 - time_2;
- LogPrint(BCLog::BENCH, " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs (%.2fms/blk)]\n", (unsigned)block.vtx.size(),
+ LogDebug(BCLog::BENCH, " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs (%.2fms/blk)]\n", (unsigned)block.vtx.size(),
Ticks<MillisecondsDouble>(time_3 - time_2), Ticks<MillisecondsDouble>(time_3 - time_2) / block.vtx.size(),
nInputs <= 1 ? 0 : Ticks<MillisecondsDouble>(time_3 - time_2) / (nInputs - 1),
Ticks<SecondsDouble>(m_chainman.time_connect),
@@ -2704,7 +2698,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
}
const auto time_4{SteadyClock::now()};
m_chainman.time_verify += time_4 - time_2;
- LogPrint(BCLog::BENCH, " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs (%.2fms/blk)]\n", nInputs - 1,
+ LogDebug(BCLog::BENCH, " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs (%.2fms/blk)]\n", nInputs - 1,
Ticks<MillisecondsDouble>(time_4 - time_2),
nInputs <= 1 ? 0 : Ticks<MillisecondsDouble>(time_4 - time_2) / (nInputs - 1),
Ticks<SecondsDouble>(m_chainman.time_verify),
@@ -2719,7 +2713,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
const auto time_5{SteadyClock::now()};
m_chainman.time_undo += time_5 - time_4;
- LogPrint(BCLog::BENCH, " - Write undo data: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, " - Write undo data: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_5 - time_4),
Ticks<SecondsDouble>(m_chainman.time_undo),
Ticks<MillisecondsDouble>(m_chainman.time_undo) / m_chainman.num_blocks_total);
@@ -2734,7 +2728,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
const auto time_6{SteadyClock::now()};
m_chainman.time_index += time_6 - time_5;
- LogPrint(BCLog::BENCH, " - Index writing: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, " - Index writing: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_6 - time_5),
Ticks<SecondsDouble>(m_chainman.time_index),
Ticks<MillisecondsDouble>(m_chainman.time_index) / m_chainman.num_blocks_total);
@@ -2820,7 +2814,7 @@ bool Chainstate::FlushStateToDisk(
}
if (limiting_lock) {
- LogPrint(BCLog::PRUNE, "%s limited pruning to height %d\n", limiting_lock.value(), last_prune);
+ LogDebug(BCLog::PRUNE, "%s limited pruning to height %d\n", limiting_lock.value(), last_prune);
}
if (nManualPruneHeight > 0) {
@@ -3057,7 +3051,7 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
bool flushed = view.Flush();
assert(flushed);
}
- LogPrint(BCLog::BENCH, "- Disconnect block: %.2fms\n",
+ LogDebug(BCLog::BENCH, "- Disconnect block: %.2fms\n",
Ticks<MillisecondsDouble>(SteadyClock::now() - time_start));
{
@@ -3067,7 +3061,7 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
if (prune_lock.second.height_first <= max_height_first) continue;
prune_lock.second.height_first = max_height_first;
- LogPrint(BCLog::PRUNE, "%s prune lock moved back to %d\n", prune_lock.first, max_height_first);
+ LogDebug(BCLog::PRUNE, "%s prune lock moved back to %d\n", prune_lock.first, max_height_first);
}
}
@@ -3157,7 +3151,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
}
pthisBlock = pblockNew;
} else {
- LogPrint(BCLog::BENCH, " - Using cached block\n");
+ LogDebug(BCLog::BENCH, " - Using cached block\n");
pthisBlock = pblock;
}
const CBlock& blockConnecting = *pthisBlock;
@@ -3166,7 +3160,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
SteadyClock::time_point time_3;
// When adding aggregate statistics in the future, keep in mind that
// num_blocks_total may be zero until the ConnectBlock() call below.
- LogPrint(BCLog::BENCH, " - Load block from disk: %.2fms\n",
+ LogDebug(BCLog::BENCH, " - Load block from disk: %.2fms\n",
Ticks<MillisecondsDouble>(time_2 - time_1));
{
CCoinsViewCache view(&CoinsTip());
@@ -3183,7 +3177,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
time_3 = SteadyClock::now();
m_chainman.time_connect_total += time_3 - time_2;
assert(m_chainman.num_blocks_total > 0);
- LogPrint(BCLog::BENCH, " - Connect total: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, " - Connect total: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_3 - time_2),
Ticks<SecondsDouble>(m_chainman.time_connect_total),
Ticks<MillisecondsDouble>(m_chainman.time_connect_total) / m_chainman.num_blocks_total);
@@ -3192,7 +3186,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
}
const auto time_4{SteadyClock::now()};
m_chainman.time_flush += time_4 - time_3;
- LogPrint(BCLog::BENCH, " - Flush: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, " - Flush: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_4 - time_3),
Ticks<SecondsDouble>(m_chainman.time_flush),
Ticks<MillisecondsDouble>(m_chainman.time_flush) / m_chainman.num_blocks_total);
@@ -3202,7 +3196,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
}
const auto time_5{SteadyClock::now()};
m_chainman.time_chainstate += time_5 - time_4;
- LogPrint(BCLog::BENCH, " - Writing chainstate: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, " - Writing chainstate: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_5 - time_4),
Ticks<SecondsDouble>(m_chainman.time_chainstate),
Ticks<MillisecondsDouble>(m_chainman.time_chainstate) / m_chainman.num_blocks_total);
@@ -3218,11 +3212,11 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
const auto time_6{SteadyClock::now()};
m_chainman.time_post_connect += time_6 - time_5;
m_chainman.time_total += time_6 - time_1;
- LogPrint(BCLog::BENCH, " - Connect postprocess: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, " - Connect postprocess: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_6 - time_5),
Ticks<SecondsDouble>(m_chainman.time_post_connect),
Ticks<MillisecondsDouble>(m_chainman.time_post_connect) / m_chainman.num_blocks_total);
- LogPrint(BCLog::BENCH, "- Connect block: %.2fms [%.2fs (%.2fms/blk)]\n",
+ LogDebug(BCLog::BENCH, "- Connect block: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_6 - time_1),
Ticks<SecondsDouble>(m_chainman.time_total),
Ticks<MillisecondsDouble>(m_chainman.time_total) / m_chainman.num_blocks_total);
@@ -3581,8 +3575,8 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
//
// This cannot be done while holding cs_main (within
// MaybeCompleteSnapshotValidation) or a cs_main deadlock will occur.
- if (m_chainman.restart_indexes) {
- m_chainman.restart_indexes();
+ if (m_chainman.snapshot_download_completed) {
+ m_chainman.snapshot_download_completed();
}
break;
}
@@ -4143,7 +4137,7 @@ bool IsBlockMutated(const CBlock& block, bool check_witness_root)
return false;
}
-arith_uint256 CalculateClaimedHeadersWork(const std::vector<CBlockHeader>& headers)
+arith_uint256 CalculateClaimedHeadersWork(std::span<const CBlockHeader> headers)
{
arith_uint256 total_work{0};
for (const CBlockHeader& header : headers) {
@@ -4189,7 +4183,7 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidatio
if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast())
return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "time-too-old", "block's timestamp is too early");
- // Testnet4 only: Check timestamp against prev for difficulty-adjustment
+ // Testnet4 and regtest only: Check timestamp against prev for difficulty-adjustment
// blocks to prevent timewarp attacks (see https://github.com/bitcoin/bitcoin/pull/15482).
if (consensusParams.enforce_BIP94) {
// Check timestamp for the first block of each difficulty adjustment
@@ -4294,14 +4288,14 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
if (ppindex)
*ppindex = pindex;
if (pindex->nStatus & BLOCK_FAILED_MASK) {
- LogPrint(BCLog::VALIDATION, "%s: block %s is marked invalid\n", __func__, hash.ToString());
+ LogDebug(BCLog::VALIDATION, "%s: block %s is marked invalid\n", __func__, hash.ToString());
return state.Invalid(BlockValidationResult::BLOCK_CACHED_INVALID, "duplicate");
}
return true;
}
if (!CheckBlockHeader(block, state, GetConsensus())) {
- LogPrint(BCLog::VALIDATION, "%s: Consensus::CheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
+ LogDebug(BCLog::VALIDATION, "%s: Consensus::CheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
return false;
}
@@ -4309,16 +4303,16 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
CBlockIndex* pindexPrev = nullptr;
BlockMap::iterator mi{m_blockman.m_block_index.find(block.hashPrevBlock)};
if (mi == m_blockman.m_block_index.end()) {
- LogPrint(BCLog::VALIDATION, "header %s has prev block not found: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
+ LogDebug(BCLog::VALIDATION, "header %s has prev block not found: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
return state.Invalid(BlockValidationResult::BLOCK_MISSING_PREV, "prev-blk-not-found");
}
pindexPrev = &((*mi).second);
if (pindexPrev->nStatus & BLOCK_FAILED_MASK) {
- LogPrint(BCLog::VALIDATION, "header %s has prev block invalid: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
+ LogDebug(BCLog::VALIDATION, "header %s has prev block invalid: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
return state.Invalid(BlockValidationResult::BLOCK_INVALID_PREV, "bad-prevblk");
}
if (!ContextualCheckBlockHeader(block, state, m_blockman, *this, pindexPrev)) {
- LogPrint(BCLog::VALIDATION, "%s: Consensus::ContextualCheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
+ LogDebug(BCLog::VALIDATION, "%s: Consensus::ContextualCheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
return false;
}
@@ -4355,14 +4349,14 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
m_blockman.m_dirty_blockindex.insert(invalid_walk);
invalid_walk = invalid_walk->pprev;
}
- LogPrint(BCLog::VALIDATION, "header %s has prev block invalid: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
+ LogDebug(BCLog::VALIDATION, "header %s has prev block invalid: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
return state.Invalid(BlockValidationResult::BLOCK_INVALID_PREV, "bad-prevblk");
}
}
}
}
if (!min_pow_checked) {
- LogPrint(BCLog::VALIDATION, "%s: not adding new block header %s, missing anti-dos proof-of-work validation\n", __func__, hash.ToString());
+ LogDebug(BCLog::VALIDATION, "%s: not adding new block header %s, missing anti-dos proof-of-work validation\n", __func__, hash.ToString());
return state.Invalid(BlockValidationResult::BLOCK_HEADER_LOW_WORK, "too-little-chainwork");
}
CBlockIndex* pindex{m_blockman.AddToBlockIndex(block, m_best_header)};
@@ -4391,7 +4385,7 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
}
// Exposed wrapper for AcceptBlockHeader
-bool ChainstateManager::ProcessNewBlockHeaders(const std::vector<CBlockHeader>& headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex)
+bool ChainstateManager::ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex)
{
AssertLockNotHeld(cs_main);
{
@@ -5091,7 +5085,7 @@ void ChainstateManager::LoadExternalBlockFile(
LOCK(cs_main);
// detect out of order blocks, and store them for later
if (hash != params.GetConsensus().hashGenesisBlock && !m_blockman.LookupBlockIndex(header.hashPrevBlock)) {
- LogPrint(BCLog::REINDEX, "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(),
+ LogDebug(BCLog::REINDEX, "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(),
header.hashPrevBlock.ToString());
if (dbp && blocks_with_unknown_parent) {
blocks_with_unknown_parent->emplace(header.hashPrevBlock, *dbp);
@@ -5116,7 +5110,7 @@ void ChainstateManager::LoadExternalBlockFile(
break;
}
} else if (hash != params.GetConsensus().hashGenesisBlock && pindex->nHeight % 1000 == 0) {
- LogPrint(BCLog::REINDEX, "Block Import: already had block %s at height %d\n", hash.ToString(), pindex->nHeight);
+ LogDebug(BCLog::REINDEX, "Block Import: already had block %s at height %d\n", hash.ToString(), pindex->nHeight);
}
}
@@ -5147,7 +5141,7 @@ void ChainstateManager::LoadExternalBlockFile(
for (auto c : GetAll()) {
BlockValidationState state;
if (!c->ActivateBestChain(state, pblock)) {
- LogPrint(BCLog::REINDEX, "failed to activate chain (%s)\n", state.ToString());
+ LogDebug(BCLog::REINDEX, "failed to activate chain (%s)\n", state.ToString());
activation_failure = true;
break;
}
@@ -5172,7 +5166,7 @@ void ChainstateManager::LoadExternalBlockFile(
std::multimap<uint256, FlatFilePos>::iterator it = range.first;
std::shared_ptr<CBlock> pblockrecursive = std::make_shared<CBlock>();
if (m_blockman.ReadBlockFromDisk(*pblockrecursive, it->second)) {
- LogPrint(BCLog::REINDEX, "%s: Processing out of order child %s of %s\n", __func__, pblockrecursive->GetHash().ToString(),
+ LogDebug(BCLog::REINDEX, "%s: Processing out of order child %s of %s\n", __func__, pblockrecursive->GetHash().ToString(),
head.ToString());
LOCK(cs_main);
BlockValidationState dummy;
@@ -5198,7 +5192,7 @@ void ChainstateManager::LoadExternalBlockFile(
// the reindex process is not the place to attempt to clean and/or compact the block files. if so desired, a studious node operator
// may use knowledge of the fact that the block files are not entirely pristine in order to prepare a set of pristine, and
// perhaps ordered, block files for later reindexing.
- LogPrint(BCLog::REINDEX, "%s: unexpected data at file offset 0x%x - %s. continuing\n", __func__, (nRewind - 1), e.what());
+ LogDebug(BCLog::REINDEX, "%s: unexpected data at file offset 0x%x - %s. continuing\n", __func__, (nRewind - 1), e.what());
}
}
} catch (const std::runtime_error& e) {
diff --git a/src/validation.h b/src/validation.h
index f905d6e624..6bc8a14de9 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -39,9 +39,9 @@
#include <memory>
#include <optional>
#include <set>
+#include <span>
#include <stdint.h>
#include <string>
-#include <thread>
#include <type_traits>
#include <utility>
#include <vector>
@@ -407,7 +407,7 @@ bool HasValidProofOfWork(const std::vector<CBlockHeader>& headers, const Consens
bool IsBlockMutated(const CBlock& block, bool check_witness_root);
/** Return the sum of the claimed work on a given set of headers. No verification of PoW is done. */
-arith_uint256 CalculateClaimedHeadersWork(const std::vector<CBlockHeader>& headers);
+arith_uint256 CalculateClaimedHeadersWork(std::span<const CBlockHeader> headers);
enum class VerifyDBResult {
SUCCESS,
@@ -914,7 +914,7 @@ private:
//! Internal helper for ActivateSnapshot().
//!
//! De-serialization of a snapshot that is created with
- //! CreateUTXOSnapshot() in rpc/blockchain.cpp.
+ //! the dumptxoutset RPC.
//! To reduce space the serialization format of the snapshot avoids
//! duplication of tx hashes. The code takes advantage of the guarantee by
//! leveldb that keys are lexicographically sorted.
@@ -976,7 +976,7 @@ public:
//! Function to restart active indexes; set dynamically to avoid a circular
//! dependency on `base/index.cpp`.
- std::function<void()> restart_indexes = std::function<void()>();
+ std::function<void()> snapshot_download_completed = std::function<void()>();
const CChainParams& GetParams() const { return m_options.chainparams; }
const Consensus::Params& GetConsensus() const { return m_options.chainparams.GetConsensus(); }
@@ -1007,7 +1007,6 @@ public:
const util::SignalInterrupt& m_interrupt;
const Options m_options;
- std::thread m_thread_load;
//! A single BlockManager instance is shared across each constructed
//! chainstate to avoid duplicating block metadata.
node::BlockManager m_blockman;
@@ -1217,12 +1216,12 @@ public:
* May not be called in a
* validationinterface callback.
*
- * @param[in] block The block headers themselves
+ * @param[in] headers The block headers themselves
* @param[in] min_pow_checked True if proof-of-work anti-DoS checks have been done by caller for headers chain
* @param[out] state This may be set to an Error state if any error occurred processing them
* @param[out] ppindex If set, the pointer will be set to point to the last new block index object for the given headers
*/
- bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& block, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
+ bool ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
/**
* Sufficiently validate a block for disk storage (and store on disk).
diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp
index 0ebcf926ca..e8ff1d78e3 100644
--- a/src/validationinterface.cpp
+++ b/src/validationinterface.cpp
@@ -167,7 +167,7 @@ void ValidationSignals::SyncWithValidationInterfaceQueue()
} while (0)
#define LOG_EVENT(fmt, ...) \
- LogPrint(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
+ LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
void ValidationSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
// Dependencies exist that require UpdatedBlockTip events to be delivered in the order in which
diff --git a/src/wallet/CMakeLists.txt b/src/wallet/CMakeLists.txt
new file mode 100644
index 0000000000..121e6e3c83
--- /dev/null
+++ b/src/wallet/CMakeLists.txt
@@ -0,0 +1,59 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+# Wallet functionality used by bitcoind and bitcoin-wallet executables.
+add_library(bitcoin_wallet STATIC EXCLUDE_FROM_ALL
+ coincontrol.cpp
+ coinselection.cpp
+ context.cpp
+ crypter.cpp
+ db.cpp
+ dump.cpp
+ external_signer_scriptpubkeyman.cpp
+ feebumper.cpp
+ fees.cpp
+ interfaces.cpp
+ load.cpp
+ migrate.cpp
+ receive.cpp
+ rpc/addresses.cpp
+ rpc/backup.cpp
+ rpc/coins.cpp
+ rpc/encrypt.cpp
+ rpc/signmessage.cpp
+ rpc/spend.cpp
+ rpc/transactions.cpp
+ rpc/util.cpp
+ rpc/wallet.cpp
+ scriptpubkeyman.cpp
+ spend.cpp
+ transaction.cpp
+ wallet.cpp
+ walletdb.cpp
+ walletutil.cpp
+)
+target_link_libraries(bitcoin_wallet
+ PRIVATE
+ core_interface
+ bitcoin_common
+ univalue
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:USDT::headers>
+)
+
+if(NOT USE_SQLITE AND NOT USE_BDB)
+ message(FATAL_ERROR "Wallet functionality requested but no BDB or SQLite support available.")
+endif()
+if(USE_SQLITE)
+ target_sources(bitcoin_wallet PRIVATE sqlite.cpp)
+ target_link_libraries(bitcoin_wallet
+ PRIVATE
+ $<TARGET_NAME_IF_EXISTS:unofficial::sqlite3::sqlite3>
+ $<TARGET_NAME_IF_EXISTS:SQLite::SQLite3>
+ )
+endif()
+if(USE_BDB)
+ target_sources(bitcoin_wallet PRIVATE bdb.cpp salvage.cpp)
+ target_link_libraries(bitcoin_wallet PUBLIC BerkeleyDB::BerkeleyDB)
+endif()
diff --git a/src/wallet/bdb.cpp b/src/wallet/bdb.cpp
index d82d8d4513..79851dff33 100644
--- a/src/wallet/bdb.cpp
+++ b/src/wallet/bdb.cpp
@@ -211,7 +211,7 @@ BerkeleyEnvironment::BerkeleyEnvironment() : m_use_shared_memory(false)
{
Reset();
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::MakeMock\n");
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::MakeMock\n");
dbenv->set_cachesize(1, 0, 1);
dbenv->set_lg_bsize(10485760 * 4);
@@ -605,7 +605,7 @@ void BerkeleyEnvironment::Flush(bool fShutdown)
{
const auto start{SteadyClock::now()};
// Flush log data to the actual data file on all files that are not in use
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: [%s] Flush(%s)%s\n", strPath, fShutdown ? "true" : "false", fDbEnvInit ? "" : " database not started");
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: [%s] Flush(%s)%s\n", strPath, fShutdown ? "true" : "false", fDbEnvInit ? "" : " database not started");
if (!fDbEnvInit)
return;
{
@@ -616,22 +616,22 @@ void BerkeleyEnvironment::Flush(bool fShutdown)
int nRefCount = db_it.second.get().m_refcount;
if (nRefCount < 0) continue;
const std::string strFile = fs::PathToString(filename);
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: Flushing %s (refcount = %d)...\n", strFile, nRefCount);
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: Flushing %s (refcount = %d)...\n", strFile, nRefCount);
if (nRefCount == 0) {
// Move log data to the dat file
CloseDb(filename);
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s checkpoint\n", strFile);
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s checkpoint\n", strFile);
dbenv->txn_checkpoint(0, 0, 0);
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s detach\n", strFile);
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s detach\n", strFile);
if (!fMockDb)
dbenv->lsn_reset(strFile.c_str(), 0);
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s closed\n", strFile);
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s closed\n", strFile);
nRefCount = -1;
} else {
no_dbs_accessed = false;
}
}
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: Flush(%s)%s took %15dms\n", fShutdown ? "true" : "false", fDbEnvInit ? "" : " database not started", Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: Flush(%s)%s took %15dms\n", fShutdown ? "true" : "false", fDbEnvInit ? "" : " database not started", Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
if (fShutdown) {
char** listp;
if (no_dbs_accessed) {
@@ -660,7 +660,7 @@ bool BerkeleyDatabase::PeriodicFlush()
if (m_refcount < 0) return false;
const std::string strFile = fs::PathToString(m_filename);
- LogPrint(BCLog::WALLETDB, "Flushing %s\n", strFile);
+ LogDebug(BCLog::WALLETDB, "Flushing %s\n", strFile);
const auto start{SteadyClock::now()};
// Flush wallet file so it's self contained
@@ -668,7 +668,7 @@ bool BerkeleyDatabase::PeriodicFlush()
env->CheckpointLSN(strFile);
m_refcount = -1;
- LogPrint(BCLog::WALLETDB, "Flushed %s %dms\n", strFile, Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
+ LogDebug(BCLog::WALLETDB, "Flushed %s %dms\n", strFile, Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
return true;
}
diff --git a/src/wallet/coinselection.cpp b/src/wallet/coinselection.cpp
index b6fee37c95..cee558088f 100644
--- a/src/wallet/coinselection.cpp
+++ b/src/wallet/coinselection.cpp
@@ -740,7 +740,7 @@ util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, c
log_message += strprintf("%s ", FormatMoney(applicable_groups[i].m_value));
}
}
- LogPrint(BCLog::SELECTCOINS, "%stotal %s\n", log_message, FormatMoney(nBest));
+ LogDebug(BCLog::SELECTCOINS, "%stotal %s\n", log_message, FormatMoney(nBest));
}
}
Assume(result.GetWeight() <= max_selection_weight);
diff --git a/src/wallet/crypter.cpp b/src/wallet/crypter.cpp
index 57a19fb5f2..ffb1d29e16 100644
--- a/src/wallet/crypter.cpp
+++ b/src/wallet/crypter.cpp
@@ -8,10 +8,11 @@
#include <crypto/aes.h>
#include <crypto/sha512.h>
+#include <type_traits>
#include <vector>
namespace wallet {
-int CCrypter::BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, const SecureString& strKeyData, int count, unsigned char *key,unsigned char *iv) const
+int CCrypter::BytesToKeySHA512AES(const std::span<const unsigned char> salt, const SecureString& key_data, int count, unsigned char* key, unsigned char* iv) const
{
// This mimics the behavior of openssl's EVP_BytesToKey with an aes256cbc
// cipher and sha512 message digest. Because sha512's output size (64b) is
@@ -24,8 +25,8 @@ int CCrypter::BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, cons
unsigned char buf[CSHA512::OUTPUT_SIZE];
CSHA512 di;
- di.Write((const unsigned char*)strKeyData.data(), strKeyData.size());
- di.Write(chSalt.data(), chSalt.size());
+ di.Write(UCharCast(key_data.data()), key_data.size());
+ di.Write(salt.data(), salt.size());
di.Finalize(buf);
for(int i = 0; i != count - 1; i++)
@@ -37,14 +38,16 @@ int CCrypter::BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, cons
return WALLET_CRYPTO_KEY_SIZE;
}
-bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
+bool CCrypter::SetKeyFromPassphrase(const SecureString& key_data, const std::span<const unsigned char> salt, const unsigned int rounds, const unsigned int derivation_method)
{
- if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE)
+ if (rounds < 1 || salt.size() != WALLET_CRYPTO_SALT_SIZE) {
return false;
+ }
int i = 0;
- if (nDerivationMethod == 0)
- i = BytesToKeySHA512AES(chSalt, strKeyData, nRounds, vchKey.data(), vchIV.data());
+ if (derivation_method == 0) {
+ i = BytesToKeySHA512AES(salt, key_data, rounds, vchKey.data(), vchIV.data());
+ }
if (i != (int)WALLET_CRYPTO_KEY_SIZE)
{
@@ -57,13 +60,14 @@ bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::v
return true;
}
-bool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV)
+bool CCrypter::SetKey(const CKeyingMaterial& new_key, const std::span<const unsigned char> new_iv)
{
- if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_IV_SIZE)
+ if (new_key.size() != WALLET_CRYPTO_KEY_SIZE || new_iv.size() != WALLET_CRYPTO_IV_SIZE) {
return false;
+ }
- memcpy(vchKey.data(), chNewKey.data(), chNewKey.size());
- memcpy(vchIV.data(), chNewIV.data(), chNewIV.size());
+ memcpy(vchKey.data(), new_key.data(), new_key.size());
+ memcpy(vchIV.data(), new_iv.data(), new_iv.size());
fKeySet = true;
return true;
@@ -87,21 +91,20 @@ bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned
return true;
}
-bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext) const
+bool CCrypter::Decrypt(const std::span<const unsigned char> ciphertext, CKeyingMaterial& plaintext) const
{
if (!fKeySet)
return false;
// plaintext will always be equal to or lesser than length of ciphertext
- int nLen = vchCiphertext.size();
-
- vchPlaintext.resize(nLen);
+ plaintext.resize(ciphertext.size());
AES256CBCDecrypt dec(vchKey.data(), vchIV.data(), true);
- nLen = dec.Decrypt(vchCiphertext.data(), vchCiphertext.size(), vchPlaintext.data());
- if(nLen == 0)
+ int len = dec.Decrypt(ciphertext.data(), ciphertext.size(), plaintext.data());
+ if (len == 0) {
return false;
- vchPlaintext.resize(nLen);
+ }
+ plaintext.resize(len);
return true;
}
@@ -115,26 +118,29 @@ bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vch
return cKeyCrypter.Encrypt(vchPlaintext, vchCiphertext);
}
-bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext)
+bool DecryptSecret(const CKeyingMaterial& master_key, const std::span<const unsigned char> ciphertext, const uint256& iv, CKeyingMaterial& plaintext)
{
- CCrypter cKeyCrypter;
- std::vector<unsigned char> chIV(WALLET_CRYPTO_IV_SIZE);
- memcpy(chIV.data(), &nIV, WALLET_CRYPTO_IV_SIZE);
- if(!cKeyCrypter.SetKey(vMasterKey, chIV))
+ CCrypter key_crypter;
+ static_assert(WALLET_CRYPTO_IV_SIZE <= std::remove_reference_t<decltype(iv)>::size());
+ const std::span iv_prefix{iv.data(), WALLET_CRYPTO_IV_SIZE};
+ if (!key_crypter.SetKey(master_key, iv_prefix)) {
return false;
- return cKeyCrypter.Decrypt(vchCiphertext, vchPlaintext);
+ }
+ return key_crypter.Decrypt(ciphertext, plaintext);
}
-bool DecryptKey(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key)
+bool DecryptKey(const CKeyingMaterial& master_key, const std::span<const unsigned char> crypted_secret, const CPubKey& pub_key, CKey& key)
{
- CKeyingMaterial vchSecret;
- if(!DecryptSecret(vMasterKey, vchCryptedSecret, vchPubKey.GetHash(), vchSecret))
+ CKeyingMaterial secret;
+ if (!DecryptSecret(master_key, crypted_secret, pub_key.GetHash(), secret)) {
return false;
+ }
- if (vchSecret.size() != 32)
+ if (secret.size() != 32) {
return false;
+ }
- key.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed());
- return key.VerifyPubKey(vchPubKey);
+ key.Set(secret.begin(), secret.end(), pub_key.IsCompressed());
+ return key.VerifyPubKey(pub_key);
}
} // namespace wallet
diff --git a/src/wallet/crypter.h b/src/wallet/crypter.h
index b776a9c497..944858fb3f 100644
--- a/src/wallet/crypter.h
+++ b/src/wallet/crypter.h
@@ -75,13 +75,13 @@ private:
std::vector<unsigned char, secure_allocator<unsigned char>> vchIV;
bool fKeySet;
- int BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, const SecureString& strKeyData, int count, unsigned char *key,unsigned char *iv) const;
+ int BytesToKeySHA512AES(std::span<const unsigned char> salt, const SecureString& key_data, int count, unsigned char* key, unsigned char* iv) const;
public:
- bool SetKeyFromPassphrase(const SecureString &strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod);
+ bool SetKeyFromPassphrase(const SecureString& key_data, std::span<const unsigned char> salt, const unsigned int rounds, const unsigned int derivation_method);
bool Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext) const;
- bool Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext) const;
- bool SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV);
+ bool Decrypt(std::span<const unsigned char> ciphertext, CKeyingMaterial& plaintext) const;
+ bool SetKey(const CKeyingMaterial& new_key, std::span<const unsigned char> new_iv);
void CleanKey()
{
@@ -104,8 +104,8 @@ public:
};
bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext);
-bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext);
-bool DecryptKey(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key);
+bool DecryptSecret(const CKeyingMaterial& master_key, std::span<const unsigned char> ciphertext, const uint256& iv, CKeyingMaterial& plaintext);
+bool DecryptKey(const CKeyingMaterial& master_key, std::span<const unsigned char> crypted_secret, const CPubKey& pub_key, CKey& key);
} // namespace wallet
#endif // BITCOIN_WALLET_CRYPTER_H
diff --git a/src/wallet/db.cpp b/src/wallet/db.cpp
index 400b9dc44f..1c007ba949 100644
--- a/src/wallet/db.cpp
+++ b/src/wallet/db.cpp
@@ -9,6 +9,7 @@
#include <util/fs.h>
#include <wallet/db.h>
+#include <algorithm>
#include <exception>
#include <fstream>
#include <string>
@@ -16,8 +17,8 @@
#include <vector>
namespace wallet {
-bool operator<(BytePrefix a, Span<const std::byte> b) { return a.prefix < b.subspan(0, std::min(a.prefix.size(), b.size())); }
-bool operator<(Span<const std::byte> a, BytePrefix b) { return a.subspan(0, std::min(a.size(), b.prefix.size())) < b.prefix; }
+bool operator<(BytePrefix a, Span<const std::byte> b) { return std::ranges::lexicographical_compare(a.prefix, b.subspan(0, std::min(a.prefix.size(), b.size()))); }
+bool operator<(Span<const std::byte> a, BytePrefix b) { return std::ranges::lexicographical_compare(a.subspan(0, std::min(a.size(), b.prefix.size())), b.prefix); }
std::vector<std::pair<fs::path, std::string>> ListDatabases(const fs::path& wallet_dir)
{
diff --git a/src/wallet/load.cpp b/src/wallet/load.cpp
index e26347d437..81f5e30082 100644
--- a/src/wallet/load.cpp
+++ b/src/wallet/load.cpp
@@ -69,7 +69,7 @@ bool VerifyWallets(WalletContext& context)
// Pass write=false because no need to write file and probably
// better not to. If unnamed wallet needs to be added next startup
// and the setting is empty, this code will just run again.
- chain.updateRwSetting("wallet", wallets, /* write= */ false);
+ chain.overwriteRwSetting("wallet", wallets, /*write=*/false);
}
}
@@ -77,6 +77,11 @@ bool VerifyWallets(WalletContext& context)
std::set<fs::path> wallet_paths;
for (const auto& wallet : chain.getSettingsList("wallet")) {
+ if (!wallet.isStr()) {
+ chain.initError(_("Invalid value detected for '-wallet' or '-nowallet'. "
+ "'-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets"));
+ return false;
+ }
const auto& wallet_file = wallet.get_str();
const fs::path path = fsbridge::AbsPathJoin(GetWalletDir(), fs::PathFromString(wallet_file));
@@ -110,6 +115,11 @@ bool LoadWallets(WalletContext& context)
try {
std::set<fs::path> wallet_paths;
for (const auto& wallet : chain.getSettingsList("wallet")) {
+ if (!wallet.isStr()) {
+ chain.initError(_("Invalid value detected for '-wallet' or '-nowallet'. "
+ "'-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets"));
+ return false;
+ }
const auto& name = wallet.get_str();
if (!wallet_paths.insert(fs::PathFromString(name)).second) {
continue;
diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp
index 0d0e86ed24..20d09b1d9a 100644
--- a/src/wallet/rpc/backup.cpp
+++ b/src/wallet/rpc/backup.cpp
@@ -471,7 +471,7 @@ RPCHelpMan importpubkey()
pwallet->ImportScriptPubKeys(strLabel, script_pub_keys, /*have_solving_data=*/true, /*apply_label=*/true, /*timestamp=*/1);
- pwallet->ImportPubKeys({pubKey.GetID()}, {{pubKey.GetID(), pubKey}} , /*key_origins=*/{}, /*add_keypool=*/false, /*internal=*/false, /*timestamp=*/1);
+ pwallet->ImportPubKeys({{pubKey.GetID(), false}}, {{pubKey.GetID(), pubKey}} , /*key_origins=*/{}, /*add_keypool=*/false, /*timestamp=*/1);
}
if (fRescan)
{
@@ -916,7 +916,7 @@ static std::string RecurseImportData(const CScript& script, ImportData& import_d
NONFATAL_UNREACHABLE();
}
-static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<CKeyID>& ordered_pubkeys)
+static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys)
{
UniValue warnings(UniValue::VARR);
@@ -982,7 +982,7 @@ static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CP
for (size_t i = 0; i < pubKeys.size(); ++i) {
CPubKey pubkey = HexToPubKey(pubKeys[i].get_str());
pubkey_map.emplace(pubkey.GetID(), pubkey);
- ordered_pubkeys.push_back(pubkey.GetID());
+ ordered_pubkeys.emplace_back(pubkey.GetID(), internal);
}
for (size_t i = 0; i < keys.size(); ++i) {
const auto& str = keys[i].get_str();
@@ -1055,28 +1055,36 @@ static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CP
return warnings;
}
-static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<CKeyID>& ordered_pubkeys)
+static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys)
{
UniValue warnings(UniValue::VARR);
const std::string& descriptor = data["desc"].get_str();
FlatSigningProvider keys;
std::string error;
- auto parsed_desc = Parse(descriptor, keys, error, /* require_checksum = */ true);
- if (!parsed_desc) {
+ auto parsed_descs = Parse(descriptor, keys, error, /* require_checksum = */ true);
+ if (parsed_descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
- if (parsed_desc->GetOutputType() == OutputType::BECH32M) {
+ if (parsed_descs.at(0)->GetOutputType() == OutputType::BECH32M) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Bech32m descriptors cannot be imported into legacy wallets");
}
- have_solving_data = parsed_desc->IsSolvable();
+ std::optional<bool> internal;
+ if (data.exists("internal")) {
+ if (parsed_descs.size() > 1) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot have multipath descriptor while also specifying \'internal\'");
+ }
+ internal = data["internal"].get_bool();
+ }
+
+ have_solving_data = parsed_descs.at(0)->IsSolvable();
const bool watch_only = data.exists("watchonly") ? data["watchonly"].get_bool() : false;
int64_t range_start = 0, range_end = 0;
- if (!parsed_desc->IsRange() && data.exists("range")) {
+ if (!parsed_descs.at(0)->IsRange() && data.exists("range")) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor");
- } else if (parsed_desc->IsRange()) {
+ } else if (parsed_descs.at(0)->IsRange()) {
if (!data.exists("range")) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Descriptor is ranged, please specify the range");
}
@@ -1085,25 +1093,34 @@ static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID
const UniValue& priv_keys = data.exists("keys") ? data["keys"].get_array() : UniValue();
- // Expand all descriptors to get public keys and scripts, and private keys if available.
- for (int i = range_start; i <= range_end; ++i) {
- FlatSigningProvider out_keys;
- std::vector<CScript> scripts_temp;
- parsed_desc->Expand(i, keys, scripts_temp, out_keys);
- std::copy(scripts_temp.begin(), scripts_temp.end(), std::inserter(script_pub_keys, script_pub_keys.end()));
- for (const auto& key_pair : out_keys.pubkeys) {
- ordered_pubkeys.push_back(key_pair.first);
- }
+ for (size_t j = 0; j < parsed_descs.size(); ++j) {
+ const auto& parsed_desc = parsed_descs.at(j);
+ bool desc_internal = internal.has_value() && internal.value();
+ if (parsed_descs.size() == 2) {
+ desc_internal = j == 1;
+ } else if (parsed_descs.size() > 2) {
+ CHECK_NONFATAL(!desc_internal);
+ }
+ // Expand all descriptors to get public keys and scripts, and private keys if available.
+ for (int i = range_start; i <= range_end; ++i) {
+ FlatSigningProvider out_keys;
+ std::vector<CScript> scripts_temp;
+ parsed_desc->Expand(i, keys, scripts_temp, out_keys);
+ std::copy(scripts_temp.begin(), scripts_temp.end(), std::inserter(script_pub_keys, script_pub_keys.end()));
+ for (const auto& key_pair : out_keys.pubkeys) {
+ ordered_pubkeys.emplace_back(key_pair.first, desc_internal);
+ }
- for (const auto& x : out_keys.scripts) {
- import_data.import_scripts.emplace(x.second);
- }
+ for (const auto& x : out_keys.scripts) {
+ import_data.import_scripts.emplace(x.second);
+ }
- parsed_desc->ExpandPrivate(i, keys, out_keys);
+ parsed_desc->ExpandPrivate(i, keys, out_keys);
- std::copy(out_keys.pubkeys.begin(), out_keys.pubkeys.end(), std::inserter(pubkey_map, pubkey_map.end()));
- std::copy(out_keys.keys.begin(), out_keys.keys.end(), std::inserter(privkey_map, privkey_map.end()));
- import_data.key_origins.insert(out_keys.origins.begin(), out_keys.origins.end());
+ std::copy(out_keys.pubkeys.begin(), out_keys.pubkeys.end(), std::inserter(pubkey_map, pubkey_map.end()));
+ std::copy(out_keys.keys.begin(), out_keys.keys.end(), std::inserter(privkey_map, privkey_map.end()));
+ import_data.key_origins.insert(out_keys.origins.begin(), out_keys.origins.end());
+ }
}
for (size_t i = 0; i < priv_keys.size(); ++i) {
@@ -1167,7 +1184,7 @@ static UniValue ProcessImport(CWallet& wallet, const UniValue& data, const int64
std::map<CKeyID, CPubKey> pubkey_map;
std::map<CKeyID, CKey> privkey_map;
std::set<CScript> script_pub_keys;
- std::vector<CKeyID> ordered_pubkeys;
+ std::vector<std::pair<CKeyID, bool>> ordered_pubkeys;
bool have_solving_data;
if (data.exists("scriptPubKey") && data.exists("desc")) {
@@ -1200,7 +1217,7 @@ static UniValue ProcessImport(CWallet& wallet, const UniValue& data, const int64
if (!wallet.ImportPrivKeys(privkey_map, timestamp)) {
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding key to wallet");
}
- if (!wallet.ImportPubKeys(ordered_pubkeys, pubkey_map, import_data.key_origins, add_keypool, internal, timestamp)) {
+ if (!wallet.ImportPubKeys(ordered_pubkeys, pubkey_map, import_data.key_origins, add_keypool, timestamp)) {
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding address to wallet");
}
if (!wallet.ImportScriptPubKeys(label, script_pub_keys, have_solving_data, !internal, timestamp)) {
@@ -1447,22 +1464,28 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
const std::string& descriptor = data["desc"].get_str();
const bool active = data.exists("active") ? data["active"].get_bool() : false;
- const bool internal = data.exists("internal") ? data["internal"].get_bool() : false;
const std::string label{LabelFromValue(data["label"])};
// Parse descriptor string
FlatSigningProvider keys;
std::string error;
- auto parsed_desc = Parse(descriptor, keys, error, /* require_checksum = */ true);
- if (!parsed_desc) {
+ auto parsed_descs = Parse(descriptor, keys, error, /* require_checksum = */ true);
+ if (parsed_descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
+ std::optional<bool> internal;
+ if (data.exists("internal")) {
+ if (parsed_descs.size() > 1) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot have multipath descriptor while also specifying \'internal\'");
+ }
+ internal = data["internal"].get_bool();
+ }
// Range check
int64_t range_start = 0, range_end = 1, next_index = 0;
- if (!parsed_desc->IsRange() && data.exists("range")) {
+ if (!parsed_descs.at(0)->IsRange() && data.exists("range")) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor");
- } else if (parsed_desc->IsRange()) {
+ } else if (parsed_descs.at(0)->IsRange()) {
if (data.exists("range")) {
auto range = ParseDescriptorRange(data["range"]);
range_start = range.first;
@@ -1484,10 +1507,15 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
}
// Active descriptors must be ranged
- if (active && !parsed_desc->IsRange()) {
+ if (active && !parsed_descs.at(0)->IsRange()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Active descriptors must be ranged");
}
+ // Multipath descriptors should not have a label
+ if (parsed_descs.size() > 1 && data.exists("label")) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Multipath descriptors should not have a label");
+ }
+
// Ranged descriptors should not have a label
if (data.exists("range") && data.exists("label")) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Ranged descriptors should not have a label");
@@ -1499,7 +1527,7 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
}
// Combo descriptor check
- if (active && !parsed_desc->IsSingleType()) {
+ if (active && !parsed_descs.at(0)->IsSingleType()) {
throw JSONRPCError(RPC_WALLET_ERROR, "Combo descriptors cannot be set to active");
}
@@ -1508,61 +1536,70 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import private keys to a wallet with private keys disabled");
}
- // Need to ExpandPrivate to check if private keys are available for all pubkeys
- FlatSigningProvider expand_keys;
- std::vector<CScript> scripts;
- if (!parsed_desc->Expand(0, keys, scripts, expand_keys)) {
- throw JSONRPCError(RPC_WALLET_ERROR, "Cannot expand descriptor. Probably because of hardened derivations without private keys provided");
- }
- parsed_desc->ExpandPrivate(0, keys, expand_keys);
-
- // Check if all private keys are provided
- bool have_all_privkeys = !expand_keys.keys.empty();
- for (const auto& entry : expand_keys.origins) {
- const CKeyID& key_id = entry.first;
- CKey key;
- if (!expand_keys.GetKey(key_id, key)) {
- have_all_privkeys = false;
- break;
+ for (size_t j = 0; j < parsed_descs.size(); ++j) {
+ auto parsed_desc = std::move(parsed_descs[j]);
+ bool desc_internal = internal.has_value() && internal.value();
+ if (parsed_descs.size() == 2) {
+ desc_internal = j == 1;
+ } else if (parsed_descs.size() > 2) {
+ CHECK_NONFATAL(!desc_internal);
+ }
+ // Need to ExpandPrivate to check if private keys are available for all pubkeys
+ FlatSigningProvider expand_keys;
+ std::vector<CScript> scripts;
+ if (!parsed_desc->Expand(0, keys, scripts, expand_keys)) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "Cannot expand descriptor. Probably because of hardened derivations without private keys provided");
+ }
+ parsed_desc->ExpandPrivate(0, keys, expand_keys);
+
+ // Check if all private keys are provided
+ bool have_all_privkeys = !expand_keys.keys.empty();
+ for (const auto& entry : expand_keys.origins) {
+ const CKeyID& key_id = entry.first;
+ CKey key;
+ if (!expand_keys.GetKey(key_id, key)) {
+ have_all_privkeys = false;
+ break;
+ }
}
- }
- // If private keys are enabled, check some things.
- if (!wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
- if (keys.keys.empty()) {
- throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import descriptor without private keys to a wallet with private keys enabled");
- }
- if (!have_all_privkeys) {
- warnings.push_back("Not all private keys provided. Some wallet functionality may return unexpected errors");
- }
- }
+ // If private keys are enabled, check some things.
+ if (!wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
+ if (keys.keys.empty()) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import descriptor without private keys to a wallet with private keys enabled");
+ }
+ if (!have_all_privkeys) {
+ warnings.push_back("Not all private keys provided. Some wallet functionality may return unexpected errors");
+ }
+ }
- WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
+ WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
- // Check if the wallet already contains the descriptor
- auto existing_spk_manager = wallet.GetDescriptorScriptPubKeyMan(w_desc);
- if (existing_spk_manager) {
- if (!existing_spk_manager->CanUpdateToWalletDescriptor(w_desc, error)) {
- throw JSONRPCError(RPC_INVALID_PARAMETER, error);
+ // Check if the wallet already contains the descriptor
+ auto existing_spk_manager = wallet.GetDescriptorScriptPubKeyMan(w_desc);
+ if (existing_spk_manager) {
+ if (!existing_spk_manager->CanUpdateToWalletDescriptor(w_desc, error)) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, error);
+ }
}
- }
- // Add descriptor to the wallet
- auto spk_manager = wallet.AddWalletDescriptor(w_desc, keys, label, internal);
- if (spk_manager == nullptr) {
- throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s'", descriptor));
- }
+ // Add descriptor to the wallet
+ auto spk_manager = wallet.AddWalletDescriptor(w_desc, keys, label, desc_internal);
+ if (spk_manager == nullptr) {
+ throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s'", descriptor));
+ }
- // Set descriptor as active if necessary
- if (active) {
- if (!w_desc.descriptor->GetOutputType()) {
- warnings.push_back("Unknown output type, cannot set descriptor to active.");
+ // Set descriptor as active if necessary
+ if (active) {
+ if (!w_desc.descriptor->GetOutputType()) {
+ warnings.push_back("Unknown output type, cannot set descriptor to active.");
+ } else {
+ wallet.AddActiveScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), desc_internal);
+ }
} else {
- wallet.AddActiveScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), internal);
- }
- } else {
- if (w_desc.descriptor->GetOutputType()) {
- wallet.DeactivateScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), internal);
+ if (w_desc.descriptor->GetOutputType()) {
+ wallet.DeactivateScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), desc_internal);
+ }
}
}
@@ -1579,6 +1616,7 @@ RPCHelpMan importdescriptors()
{
return RPCHelpMan{"importdescriptors",
"\nImport descriptors. This will trigger a rescan of the blockchain based on the earliest timestamp of all descriptors being imported. Requires a new wallet backup.\n"
+ "When importing descriptors with multipath key expressions, if the multipath specifier contains exactly two elements, the descriptor produced from the second elements will be imported as an internal descriptor.\n"
"\nNote: This call can take over an hour to complete if using an early timestamp; during that time, other rpc calls\n"
"may report that the imported keys, addresses or scripts exist but related transactions are still missing.\n"
"The rescan is significantly faster if block filters are available (using startup option \"-blockfilterindex=1\").\n",
diff --git a/src/wallet/rpc/spend.cpp b/src/wallet/rpc/spend.cpp
index 601d8e4fa7..bea9b2eec1 100644
--- a/src/wallet/rpc/spend.cpp
+++ b/src/wallet/rpc/spend.cpp
@@ -661,11 +661,13 @@ CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransact
FlatSigningProvider desc_out;
std::string error;
std::vector<CScript> scripts_temp;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, desc_out, error, true);
- if (!desc) {
+ auto descs = Parse(desc_str, desc_out, error, true);
+ if (descs.empty()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Unable to parse descriptor '%s': %s", desc_str, error));
}
- desc->Expand(0, desc_out, scripts_temp, desc_out);
+ for (auto& desc : descs) {
+ desc->Expand(0, desc_out, scripts_temp, desc_out);
+ }
coinControl.m_external_provider.Merge(std::move(desc_out));
}
}
diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp
index ae61696dd0..46ec5dc1ac 100644
--- a/src/wallet/scriptpubkeyman.cpp
+++ b/src/wallet/scriptpubkeyman.cpp
@@ -1642,13 +1642,13 @@ bool LegacyScriptPubKeyMan::ImportPrivKeys(const std::map<CKeyID, CKey>& privkey
return true;
}
-bool LegacyScriptPubKeyMan::ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp)
+bool LegacyScriptPubKeyMan::ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp)
{
WalletBatch batch(m_storage.GetDatabase());
for (const auto& entry : key_origins) {
AddKeyOriginWithDB(batch, entry.second.first, entry.second.second);
}
- for (const CKeyID& id : ordered_pubkeys) {
+ for (const auto& [id, internal] : ordered_pubkeys) {
auto entry = pubkey_map.find(id);
if (entry == pubkey_map.end()) {
continue;
@@ -1831,8 +1831,9 @@ std::optional<MigrationData> LegacyDataSPKM::MigrateToDescriptor()
std::string desc_str = "combo(" + origin_str + HexStr(key.GetPubKey()) + ")";
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ std::vector<std::unique_ptr<Descriptor>> descs = Parse(desc_str, keys, error, false);
+ CHECK_NONFATAL(descs.size() == 1); // It shouldn't be possible to have an invalid or multipath descriptor
+ WalletDescriptor w_desc(std::move(descs.at(0)), creation_time, 0, 0, 0);
// Make the DescriptorScriptPubKeyMan and get the scriptPubKeys
auto desc_spk_man = std::make_unique<DescriptorScriptPubKeyMan>(m_storage, w_desc, /*keypool_size=*/0);
@@ -1875,9 +1876,10 @@ std::optional<MigrationData> LegacyDataSPKM::MigrateToDescriptor()
std::string desc_str = "combo(" + xpub + "/0h/" + ToString(i) + "h/*h)";
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
+ std::vector<std::unique_ptr<Descriptor>> descs = Parse(desc_str, keys, error, false);
+ CHECK_NONFATAL(descs.size() == 1); // It shouldn't be possible to have an invalid or multipath descriptor
uint32_t chain_counter = std::max((i == 1 ? chain.nInternalChainCounter : chain.nExternalChainCounter), (uint32_t)0);
- WalletDescriptor w_desc(std::move(desc), 0, 0, chain_counter, 0);
+ WalletDescriptor w_desc(std::move(descs.at(0)), 0, 0, chain_counter, 0);
// Make the DescriptorScriptPubKeyMan and get the scriptPubKeys
auto desc_spk_man = std::make_unique<DescriptorScriptPubKeyMan>(m_storage, w_desc, /*keypool_size=*/0);
diff --git a/src/wallet/scriptpubkeyman.h b/src/wallet/scriptpubkeyman.h
index 6659cbf52b..ba3562c638 100644
--- a/src/wallet/scriptpubkeyman.h
+++ b/src/wallet/scriptpubkeyman.h
@@ -519,7 +519,7 @@ public:
bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
- bool ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
+ bool ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
bool ImportScriptPubKeys(const std::set<CScript>& script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
/* Returns true if the wallet can generate new keys */
diff --git a/src/wallet/test/CMakeLists.txt b/src/wallet/test/CMakeLists.txt
new file mode 100644
index 0000000000..7332674242
--- /dev/null
+++ b/src/wallet/test/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+# Do not use generator expressions in test sources because the
+# SOURCES property is processed to gather test suite macros.
+target_sources(test_bitcoin
+ PRIVATE
+ init_test_fixture.cpp
+ wallet_test_fixture.cpp
+ coinselector_tests.cpp
+ feebumper_tests.cpp
+ group_outputs_tests.cpp
+ init_tests.cpp
+ ismine_tests.cpp
+ psbt_wallet_tests.cpp
+ rpc_util_tests.cpp
+ scriptpubkeyman_tests.cpp
+ spend_tests.cpp
+ wallet_crypto_tests.cpp
+ wallet_tests.cpp
+ wallet_transaction_tests.cpp
+ walletdb_tests.cpp
+ walletload_tests.cpp
+)
+if(USE_BDB)
+ target_sources(test_bitcoin
+ PRIVATE
+ db_tests.cpp
+ )
+endif()
+target_link_libraries(test_bitcoin bitcoin_wallet)
diff --git a/src/wallet/test/fuzz/CMakeLists.txt b/src/wallet/test/fuzz/CMakeLists.txt
new file mode 100644
index 0000000000..c30671db48
--- /dev/null
+++ b/src/wallet/test/fuzz/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+target_sources(fuzz
+ PRIVATE
+ coincontrol.cpp
+ coinselection.cpp
+ crypter.cpp
+ fees.cpp
+ $<$<BOOL:${USE_SQLITE}>:${CMAKE_CURRENT_LIST_DIR}/notifications.cpp>
+ parse_iso8601.cpp
+ $<$<BOOL:${USE_SQLITE}>:${CMAKE_CURRENT_LIST_DIR}/scriptpubkeyman.cpp>
+ wallet_bdb_parser.cpp
+)
+target_link_libraries(fuzz bitcoin_wallet)
diff --git a/src/wallet/test/fuzz/coinselection.cpp b/src/wallet/test/fuzz/coinselection.cpp
index 209c87fd42..31fa00c0a2 100644
--- a/src/wallet/test/fuzz/coinselection.cpp
+++ b/src/wallet/test/fuzz/coinselection.cpp
@@ -252,7 +252,7 @@ FUZZ_TARGET(coinselection)
GroupCoins(fuzzed_data_provider, utxo_pool, coin_params, /*positive_only=*/false, group_all);
for (const OutputGroup& group : group_all) {
- const CoinEligibilityFilter filter(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<uint64_t>());
+ const CoinEligibilityFilter filter{fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
(void)group.EligibleForSpending(filter);
}
diff --git a/src/wallet/test/fuzz/crypter.cpp b/src/wallet/test/fuzz/crypter.cpp
index 4d6dd43c5f..7869f5f39c 100644
--- a/src/wallet/test/fuzz/crypter.cpp
+++ b/src/wallet/test/fuzz/crypter.cpp
@@ -35,11 +35,11 @@ FUZZ_TARGET(crypter, .init = initialize_crypter)
const unsigned int derivation_method = fuzzed_data_provider.ConsumeBool() ? 0 : fuzzed_data_provider.ConsumeIntegral<unsigned int>();
- // Limiting the value of nRounds since it is otherwise uselessly expensive and causes a timeout when fuzzing.
- crypt.SetKeyFromPassphrase(/*strKeyData=*/secure_string,
- /*chSalt=*/ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_SALT_SIZE),
- /*nRounds=*/fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, 25000),
- /*nDerivationMethod=*/derivation_method);
+ // Limiting the value of rounds since it is otherwise uselessly expensive and causes a timeout when fuzzing.
+ crypt.SetKeyFromPassphrase(/*key_data=*/secure_string,
+ /*salt=*/ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_SALT_SIZE),
+ /*rounds=*/fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, 25000),
+ /*derivation_method=*/derivation_method);
}
LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 100)
diff --git a/src/wallet/test/fuzz/notifications.cpp b/src/wallet/test/fuzz/notifications.cpp
index 792079e6c6..a7015f6685 100644
--- a/src/wallet/test/fuzz/notifications.cpp
+++ b/src/wallet/test/fuzz/notifications.cpp
@@ -68,7 +68,7 @@ void ImportDescriptors(CWallet& wallet, const std::string& seed_insecure)
FlatSigningProvider keys;
std::string error;
- auto parsed_desc = Parse(descriptor, keys, error, /*require_checksum=*/false);
+ auto parsed_desc = std::move(Parse(descriptor, keys, error, /*require_checksum=*/false).at(0));
assert(parsed_desc);
assert(error.empty());
assert(parsed_desc->IsRange());
diff --git a/src/wallet/test/fuzz/scriptpubkeyman.cpp b/src/wallet/test/fuzz/scriptpubkeyman.cpp
index 315efa0dca..091d42f6cf 100644
--- a/src/wallet/test/fuzz/scriptpubkeyman.cpp
+++ b/src/wallet/test/fuzz/scriptpubkeyman.cpp
@@ -69,10 +69,10 @@ static std::optional<std::pair<WalletDescriptor, FlatSigningProvider>> CreateWal
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> parsed_desc{Parse(desc_str.value(), keys, error, false)};
- if (!parsed_desc) return std::nullopt;
+ std::vector<std::unique_ptr<Descriptor>> parsed_descs = Parse(desc_str.value(), keys, error, false);
+ if (parsed_descs.empty()) return std::nullopt;
- WalletDescriptor w_desc{std::move(parsed_desc), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/1, /*next_index=*/1};
+ WalletDescriptor w_desc{std::move(parsed_descs.at(0)), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/1, /*next_index=*/1};
return std::make_pair(w_desc, keys);
}
@@ -186,7 +186,10 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
auto psbt{*opt_psbt};
const PrecomputedTransactionData txdata{PrecomputePSBTData(psbt)};
const int sighash_type{fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 150)};
- (void)spk_manager->FillPSBT(psbt, txdata, sighash_type, fuzzed_data_provider.ConsumeBool(), fuzzed_data_provider.ConsumeBool(), nullptr, fuzzed_data_provider.ConsumeBool());
+ auto sign = fuzzed_data_provider.ConsumeBool();
+ auto bip32derivs = fuzzed_data_provider.ConsumeBool();
+ auto finalize = fuzzed_data_provider.ConsumeBool();
+ (void)spk_manager->FillPSBT(psbt, txdata, sighash_type, sign, bip32derivs, nullptr, finalize);
}
);
}
diff --git a/src/wallet/test/fuzz/wallet_bdb_parser.cpp b/src/wallet/test/fuzz/wallet_bdb_parser.cpp
index 6fbd695fc5..5ec24faede 100644
--- a/src/wallet/test/fuzz/wallet_bdb_parser.cpp
+++ b/src/wallet/test/fuzz/wallet_bdb_parser.cpp
@@ -18,6 +18,13 @@
#include <fstream>
#include <iostream>
+// There is an inconsistency in BDB on Windows.
+// See: https://github.com/bitcoin/bitcoin/pull/26606#issuecomment-2322763212
+#undef USE_BDB_NON_MSVC
+#if defined(USE_BDB) && !defined(_MSC_VER)
+#define USE_BDB_NON_MSVC
+#endif
+
using wallet::DatabaseOptions;
using wallet::DatabaseStatus;
@@ -50,7 +57,7 @@ FUZZ_TARGET(wallet_bdb_parser, .init = initialize_wallet_bdb_parser)
}
g_setup->m_args.ForceSetArg("-dumpfile", fs::PathToString(bdb_ro_dumpfile));
-#ifdef USE_BDB
+#ifdef USE_BDB_NON_MSVC
bool bdb_ro_err = false;
bool bdb_ro_strict_err = false;
#endif
@@ -58,7 +65,7 @@ FUZZ_TARGET(wallet_bdb_parser, .init = initialize_wallet_bdb_parser)
if (db) {
assert(DumpWallet(g_setup->m_args, *db, error));
} else {
-#ifdef USE_BDB
+#ifdef USE_BDB_NON_MSVC
bdb_ro_err = true;
#endif
if (error.original.starts_with("AutoFile::ignore: end of file") ||
@@ -90,7 +97,7 @@ FUZZ_TARGET(wallet_bdb_parser, .init = initialize_wallet_bdb_parser)
error.original == "Subdatabase has an unexpected name" ||
error.original == "Unsupported BDB data file version number" ||
error.original == "BDB builtin encryption is not supported") {
-#ifdef USE_BDB
+#ifdef USE_BDB_NON_MSVC
bdb_ro_strict_err = true;
#endif
} else {
@@ -98,7 +105,7 @@ FUZZ_TARGET(wallet_bdb_parser, .init = initialize_wallet_bdb_parser)
}
}
-#ifdef USE_BDB
+#ifdef USE_BDB_NON_MSVC
// Try opening with BDB
fs::path bdb_dumpfile{g_setup->m_args.GetDataDirNet() / "fuzzed_dumpfile_bdb.dump"};
if (fs::exists(bdb_dumpfile)) { // Writing into an existing dump file will throw an exception
diff --git a/src/wallet/test/ismine_tests.cpp b/src/wallet/test/ismine_tests.cpp
index dfad0e2126..8deab74fac 100644
--- a/src/wallet/test/ismine_tests.cpp
+++ b/src/wallet/test/ismine_tests.cpp
@@ -15,6 +15,7 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
namespace wallet {
BOOST_FIXTURE_TEST_SUITE(ismine_tests, BasicTestingSetup)
@@ -25,13 +26,14 @@ wallet::ScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string&
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> parsed_desc = Parse(desc_str, keys, error, false);
- BOOST_CHECK(success == (parsed_desc != nullptr));
+ auto parsed_descs = Parse(desc_str, keys, error, false);
+ BOOST_CHECK(success == (!parsed_descs.empty()));
if (!success) return nullptr;
+ auto& desc = parsed_descs.at(0);
const int64_t range_start = 0, range_end = 1, next_index = 0, timestamp = 1;
- WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
+ WalletDescriptor w_desc(std::move(desc), timestamp, range_start, range_end, next_index);
LOCK(keystore.cs_wallet);
@@ -682,7 +684,7 @@ BOOST_AUTO_TEST_CASE(ismine_standard)
BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
scriptPubKey.clear();
- scriptPubKey << OP_0 << ToByteVector(ParseHex("aabb"));
+ scriptPubKey << OP_0 << "aabb"_hex_v_u8;
result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
BOOST_CHECK_EQUAL(result, ISMINE_NO);
@@ -697,7 +699,7 @@ BOOST_AUTO_TEST_CASE(ismine_standard)
BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
scriptPubKey.clear();
- scriptPubKey << OP_16 << ToByteVector(ParseHex("aabb"));
+ scriptPubKey << OP_16 << "aabb"_hex_v_u8;
result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
BOOST_CHECK_EQUAL(result, ISMINE_NO);
diff --git a/src/wallet/test/psbt_wallet_tests.cpp b/src/wallet/test/psbt_wallet_tests.cpp
index b5a3b22c54..09057114a0 100644
--- a/src/wallet/test/psbt_wallet_tests.cpp
+++ b/src/wallet/test/psbt_wallet_tests.cpp
@@ -12,6 +12,8 @@
#include <test/util/setup_common.h>
#include <wallet/test/wallet_test_fixture.h>
+using namespace util::hex_literals;
+
namespace wallet {
BOOST_FIXTURE_TEST_SUITE(psbt_wallet_tests, WalletTestingSetup)
@@ -21,8 +23,9 @@ static void import_descriptor(CWallet& wallet, const std::string& descriptor)
AssertLockHeld(wallet.cs_wallet);
FlatSigningProvider provider;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse(descriptor, provider, error, /* require_checksum=*/ false);
- assert(desc);
+ auto descs = Parse(descriptor, provider, error, /* require_checksum=*/ false);
+ assert(descs.size() == 1);
+ auto& desc = descs.at(0);
WalletDescriptor w_desc(std::move(desc), 0, 0, 10, 0);
wallet.AddWalletDescriptor(w_desc, provider, "", false);
}
@@ -34,14 +37,14 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test)
// Create prevtxs and add to wallet
DataStream s_prev_tx1{
- ParseHex("0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"),
+ "0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"_hex,
};
CTransactionRef prev_tx1;
s_prev_tx1 >> TX_WITH_WITNESS(prev_tx1);
m_wallet.mapWallet.emplace(std::piecewise_construct, std::forward_as_tuple(prev_tx1->GetHash()), std::forward_as_tuple(prev_tx1, TxStateInactive{}));
DataStream s_prev_tx2{
- ParseHex("0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000"),
+ "0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000"_hex,
};
CTransactionRef prev_tx2;
s_prev_tx2 >> TX_WITH_WITNESS(prev_tx2);
@@ -55,7 +58,7 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test)
// Call FillPSBT
PartiallySignedTransaction psbtx;
DataStream ssData{
- ParseHex("70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000"),
+ "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000"_hex,
};
ssData >> psbtx;
diff --git a/src/wallet/test/util.cpp b/src/wallet/test/util.cpp
index ec6c9e6f3f..43fd91fe60 100644
--- a/src/wallet/test/util.cpp
+++ b/src/wallet/test/util.cpp
@@ -31,8 +31,9 @@ std::unique_ptr<CWallet> CreateSyncedWallet(interfaces::Chain& chain, CChain& cc
FlatSigningProvider provider;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
- assert(desc);
+ auto descs = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
+ assert(descs.size() == 1);
+ auto& desc = descs.at(0);
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
if (!wallet->AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
}
diff --git a/src/wallet/test/wallet_crypto_tests.cpp b/src/wallet/test/wallet_crypto_tests.cpp
index d5e75bb892..7c74c31308 100644
--- a/src/wallet/test/wallet_crypto_tests.cpp
+++ b/src/wallet/test/wallet_crypto_tests.cpp
@@ -11,64 +11,71 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
+
namespace wallet {
BOOST_FIXTURE_TEST_SUITE(wallet_crypto_tests, BasicTestingSetup)
class TestCrypter
{
public:
-static void TestPassphraseSingle(const std::vector<unsigned char>& vchSalt, const SecureString& passphrase, uint32_t rounds,
- const std::vector<unsigned char>& correctKey = std::vector<unsigned char>(),
- const std::vector<unsigned char>& correctIV=std::vector<unsigned char>())
+static void TestPassphraseSingle(const std::span<const unsigned char> salt, const SecureString& passphrase, uint32_t rounds,
+ const std::span<const unsigned char> correct_key = {},
+ const std::span<const unsigned char> correct_iv = {})
{
CCrypter crypt;
- crypt.SetKeyFromPassphrase(passphrase, vchSalt, rounds, 0);
-
- if(!correctKey.empty())
- BOOST_CHECK_MESSAGE(memcmp(crypt.vchKey.data(), correctKey.data(), crypt.vchKey.size()) == 0, \
- HexStr(crypt.vchKey) + std::string(" != ") + HexStr(correctKey));
- if(!correctIV.empty())
- BOOST_CHECK_MESSAGE(memcmp(crypt.vchIV.data(), correctIV.data(), crypt.vchIV.size()) == 0,
- HexStr(crypt.vchIV) + std::string(" != ") + HexStr(correctIV));
+ crypt.SetKeyFromPassphrase(passphrase, salt, rounds, 0);
+
+ if (!correct_key.empty()) {
+ BOOST_CHECK_MESSAGE(memcmp(crypt.vchKey.data(), correct_key.data(), crypt.vchKey.size()) == 0,
+ HexStr(crypt.vchKey) + std::string(" != ") + HexStr(correct_key));
+ }
+ if (!correct_iv.empty()) {
+ BOOST_CHECK_MESSAGE(memcmp(crypt.vchIV.data(), correct_iv.data(), crypt.vchIV.size()) == 0,
+ HexStr(crypt.vchIV) + std::string(" != ") + HexStr(correct_iv));
+ }
}
-static void TestPassphrase(const std::vector<unsigned char>& vchSalt, const SecureString& passphrase, uint32_t rounds,
- const std::vector<unsigned char>& correctKey = std::vector<unsigned char>(),
- const std::vector<unsigned char>& correctIV=std::vector<unsigned char>())
+static void TestPassphrase(const std::span<const unsigned char> salt, const SecureString& passphrase, uint32_t rounds,
+ const std::span<const unsigned char> correct_key = {},
+ const std::span<const unsigned char> correct_iv = {})
{
- TestPassphraseSingle(vchSalt, passphrase, rounds, correctKey, correctIV);
- for(SecureString::const_iterator i(passphrase.begin()); i != passphrase.end(); ++i)
- TestPassphraseSingle(vchSalt, SecureString(i, passphrase.end()), rounds);
+ TestPassphraseSingle(salt, passphrase, rounds, correct_key, correct_iv);
+ for (SecureString::const_iterator it{passphrase.begin()}; it != passphrase.end(); ++it) {
+ TestPassphraseSingle(salt, SecureString{it, passphrase.end()}, rounds);
+ }
}
-static void TestDecrypt(const CCrypter& crypt, const std::vector<unsigned char>& vchCiphertext, \
- const std::vector<unsigned char>& vchPlaintext = std::vector<unsigned char>())
+static void TestDecrypt(const CCrypter& crypt, const std::span<const unsigned char> ciphertext,
+ const std::span<const unsigned char> correct_plaintext = {})
{
- CKeyingMaterial vchDecrypted;
- crypt.Decrypt(vchCiphertext, vchDecrypted);
- if (vchPlaintext.size())
- BOOST_CHECK(CKeyingMaterial(vchPlaintext.begin(), vchPlaintext.end()) == vchDecrypted);
+ CKeyingMaterial decrypted;
+ crypt.Decrypt(ciphertext, decrypted);
+ if (!correct_plaintext.empty()) {
+ BOOST_CHECK_EQUAL_COLLECTIONS(decrypted.begin(), decrypted.end(), correct_plaintext.begin(), correct_plaintext.end());
+ }
}
-static void TestEncryptSingle(const CCrypter& crypt, const CKeyingMaterial& vchPlaintext,
- const std::vector<unsigned char>& vchCiphertextCorrect = std::vector<unsigned char>())
+static void TestEncryptSingle(const CCrypter& crypt, const CKeyingMaterial& plaintext,
+ const std::span<const unsigned char> correct_ciphertext = {})
{
- std::vector<unsigned char> vchCiphertext;
- crypt.Encrypt(vchPlaintext, vchCiphertext);
+ std::vector<unsigned char> ciphertext;
+ crypt.Encrypt(plaintext, ciphertext);
- if (!vchCiphertextCorrect.empty())
- BOOST_CHECK(vchCiphertext == vchCiphertextCorrect);
+ if (!correct_ciphertext.empty()) {
+ BOOST_CHECK_EQUAL_COLLECTIONS(ciphertext.begin(), ciphertext.end(), correct_ciphertext.begin(), correct_ciphertext.end());
+ }
- const std::vector<unsigned char> vchPlaintext2(vchPlaintext.begin(), vchPlaintext.end());
- TestDecrypt(crypt, vchCiphertext, vchPlaintext2);
+ TestDecrypt(crypt, ciphertext, /*correct_plaintext=*/plaintext);
}
-static void TestEncrypt(const CCrypter& crypt, const std::vector<unsigned char>& vchPlaintextIn, \
- const std::vector<unsigned char>& vchCiphertextCorrect = std::vector<unsigned char>())
+static void TestEncrypt(const CCrypter& crypt, const std::span<const unsigned char> plaintext,
+ const std::span<const unsigned char> correct_ciphertext = {})
{
- TestEncryptSingle(crypt, CKeyingMaterial(vchPlaintextIn.begin(), vchPlaintextIn.end()), vchCiphertextCorrect);
- for(std::vector<unsigned char>::const_iterator i(vchPlaintextIn.begin()); i != vchPlaintextIn.end(); ++i)
- TestEncryptSingle(crypt, CKeyingMaterial(i, vchPlaintextIn.end()));
+ TestEncryptSingle(crypt, CKeyingMaterial{plaintext.begin(), plaintext.end()}, correct_ciphertext);
+ for (auto it{plaintext.begin()}; it != plaintext.end(); ++it) {
+ TestEncryptSingle(crypt, CKeyingMaterial{it, plaintext.end()});
+ }
}
};
@@ -76,47 +83,45 @@ static void TestEncrypt(const CCrypter& crypt, const std::vector<unsigned char>&
BOOST_AUTO_TEST_CASE(passphrase) {
// These are expensive.
- TestCrypter::TestPassphrase(ParseHex("0000deadbeef0000"), "test", 25000, \
- ParseHex("fc7aba077ad5f4c3a0988d8daa4810d0d4a0e3bcb53af662998898f33df0556a"), \
- ParseHex("cf2f2691526dd1aa220896fb8bf7c369"));
+ TestCrypter::TestPassphrase("0000deadbeef0000"_hex_u8, "test", 25000,
+ "fc7aba077ad5f4c3a0988d8daa4810d0d4a0e3bcb53af662998898f33df0556a"_hex_u8,
+ "cf2f2691526dd1aa220896fb8bf7c369"_hex_u8);
std::string hash(GetRandHash().ToString());
std::vector<unsigned char> vchSalt(8);
GetRandBytes(vchSalt);
- uint32_t rounds = InsecureRand32();
+ uint32_t rounds = m_rng.rand32();
if (rounds > 30000)
rounds = 30000;
TestCrypter::TestPassphrase(vchSalt, SecureString(hash.begin(), hash.end()), rounds);
}
BOOST_AUTO_TEST_CASE(encrypt) {
- std::vector<unsigned char> vchSalt = ParseHex("0000deadbeef0000");
- BOOST_CHECK(vchSalt.size() == WALLET_CRYPTO_SALT_SIZE);
+ constexpr std::array<uint8_t, WALLET_CRYPTO_SALT_SIZE> salt{"0000deadbeef0000"_hex_u8};
CCrypter crypt;
- crypt.SetKeyFromPassphrase("passphrase", vchSalt, 25000, 0);
- TestCrypter::TestEncrypt(crypt, ParseHex("22bcade09ac03ff6386914359cfe885cfeb5f77ff0d670f102f619687453b29d"));
+ crypt.SetKeyFromPassphrase("passphrase", salt, 25000, 0);
+ TestCrypter::TestEncrypt(crypt, "22bcade09ac03ff6386914359cfe885cfeb5f77ff0d670f102f619687453b29d"_hex_u8);
for (int i = 0; i != 100; i++)
{
uint256 hash(GetRandHash());
- TestCrypter::TestEncrypt(crypt, std::vector<unsigned char>(hash.begin(), hash.end()));
+ TestCrypter::TestEncrypt(crypt, std::span<unsigned char>{hash.begin(), hash.end()});
}
}
BOOST_AUTO_TEST_CASE(decrypt) {
- std::vector<unsigned char> vchSalt = ParseHex("0000deadbeef0000");
- BOOST_CHECK(vchSalt.size() == WALLET_CRYPTO_SALT_SIZE);
+ constexpr std::array<uint8_t, WALLET_CRYPTO_SALT_SIZE> salt{"0000deadbeef0000"_hex_u8};
CCrypter crypt;
- crypt.SetKeyFromPassphrase("passphrase", vchSalt, 25000, 0);
+ crypt.SetKeyFromPassphrase("passphrase", salt, 25000, 0);
// Some corner cases the came up while testing
- TestCrypter::TestDecrypt(crypt,ParseHex("795643ce39d736088367822cdc50535ec6f103715e3e48f4f3b1a60a08ef59ca"));
- TestCrypter::TestDecrypt(crypt,ParseHex("de096f4a8f9bd97db012aa9d90d74de8cdea779c3ee8bc7633d8b5d6da703486"));
- TestCrypter::TestDecrypt(crypt,ParseHex("32d0a8974e3afd9c6c3ebf4d66aa4e6419f8c173de25947f98cf8b7ace49449c"));
- TestCrypter::TestDecrypt(crypt,ParseHex("e7c055cca2faa78cb9ac22c9357a90b4778ded9b2cc220a14cea49f931e596ea"));
- TestCrypter::TestDecrypt(crypt,ParseHex("b88efddd668a6801d19516d6830da4ae9811988ccbaf40df8fbb72f3f4d335fd"));
- TestCrypter::TestDecrypt(crypt,ParseHex("8cae76aa6a43694e961ebcb28c8ca8f8540b84153d72865e8561ddd93fa7bfa9"));
+ TestCrypter::TestDecrypt(crypt,"795643ce39d736088367822cdc50535ec6f103715e3e48f4f3b1a60a08ef59ca"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"de096f4a8f9bd97db012aa9d90d74de8cdea779c3ee8bc7633d8b5d6da703486"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"32d0a8974e3afd9c6c3ebf4d66aa4e6419f8c173de25947f98cf8b7ace49449c"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"e7c055cca2faa78cb9ac22c9357a90b4778ded9b2cc220a14cea49f931e596ea"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"b88efddd668a6801d19516d6830da4ae9811988ccbaf40df8fbb72f3f4d335fd"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"8cae76aa6a43694e961ebcb28c8ca8f8540b84153d72865e8561ddd93fa7bfa9"_hex_u8);
for (int i = 0; i != 100; i++)
{
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
index 44ffddb168..5a520cbfe9 100644
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -65,8 +65,9 @@ static void AddKey(CWallet& wallet, const CKey& key)
LOCK(wallet.cs_wallet);
FlatSigningProvider provider;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
- assert(desc);
+ auto descs = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
+ assert(descs.size() == 1);
+ auto& desc = descs.at(0);
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
if (!wallet.AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
}
@@ -329,6 +330,40 @@ BOOST_FIXTURE_TEST_CASE(importwallet_rescan, TestChain100Setup)
}
}
+// This test verifies that wallet settings can be added and removed
+// concurrently, ensuring no race conditions occur during either process.
+BOOST_FIXTURE_TEST_CASE(write_wallet_settings_concurrently, TestingSetup)
+{
+ WalletContext context;
+ context.chain = m_node.chain.get();
+ const auto NUM_WALLETS{5};
+
+ // Since we're counting the number of wallets, ensure we start without any.
+ BOOST_REQUIRE(context.chain->getRwSetting("wallet").isNull());
+
+ const auto& check_concurrent_wallet = [&](const auto& settings_function, int num_expected_wallets) {
+ std::vector<std::thread> threads;
+ threads.reserve(NUM_WALLETS);
+ for (auto i{0}; i < NUM_WALLETS; ++i) threads.emplace_back(settings_function, i);
+ for (auto& t : threads) t.join();
+
+ auto wallets = context.chain->getRwSetting("wallet");
+ BOOST_CHECK_EQUAL(wallets.getValues().size(), num_expected_wallets);
+ };
+
+ // Add NUM_WALLETS wallets concurrently, ensure we end up with NUM_WALLETS stored.
+ check_concurrent_wallet([&context](int i) {
+ Assert(AddWalletSetting(*context.chain, strprintf("wallet_%d", i)));
+ },
+ /*num_expected_wallets=*/NUM_WALLETS);
+
+ // Remove NUM_WALLETS wallets concurrently, ensure we end up with 0 wallets.
+ check_concurrent_wallet([&context](int i) {
+ Assert(RemoveWalletSetting(*context.chain, strprintf("wallet_%d", i)));
+ },
+ /*num_expected_wallets=*/0);
+}
+
// Check that GetImmatureCredit() returns a newly calculated value instead of
// the cached value after a MarkDirty() call.
//
@@ -945,7 +980,7 @@ BOOST_FIXTURE_TEST_CASE(wallet_sync_tx_invalid_state_test, TestingSetup)
CMutableTransaction mtx;
mtx.vout.emplace_back(COIN, GetScriptForDestination(op_dest));
- mtx.vin.emplace_back(Txid::FromUint256(g_insecure_rand_ctx.rand256()), 0);
+ mtx.vin.emplace_back(Txid::FromUint256(m_rng.rand256()), 0);
const auto& tx_id_to_spend = wallet.AddToWallet(MakeTransactionRef(mtx), TxStateInMempool{})->GetHash();
{
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index 5584b43520..83e96adf07 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -93,25 +93,30 @@ namespace wallet {
bool AddWalletSetting(interfaces::Chain& chain, const std::string& wallet_name)
{
- common::SettingsValue setting_value = chain.getRwSetting("wallet");
- if (!setting_value.isArray()) setting_value.setArray();
- for (const common::SettingsValue& value : setting_value.getValues()) {
- if (value.isStr() && value.get_str() == wallet_name) return true;
- }
- setting_value.push_back(wallet_name);
- return chain.updateRwSetting("wallet", setting_value);
+ const auto update_function = [&wallet_name](common::SettingsValue& setting_value) {
+ if (!setting_value.isArray()) setting_value.setArray();
+ for (const auto& value : setting_value.getValues()) {
+ if (value.isStr() && value.get_str() == wallet_name) return interfaces::SettingsAction::SKIP_WRITE;
+ }
+ setting_value.push_back(wallet_name);
+ return interfaces::SettingsAction::WRITE;
+ };
+ return chain.updateRwSetting("wallet", update_function);
}
bool RemoveWalletSetting(interfaces::Chain& chain, const std::string& wallet_name)
{
- common::SettingsValue setting_value = chain.getRwSetting("wallet");
- if (!setting_value.isArray()) return true;
- common::SettingsValue new_value(common::SettingsValue::VARR);
- for (const common::SettingsValue& value : setting_value.getValues()) {
- if (!value.isStr() || value.get_str() != wallet_name) new_value.push_back(value);
- }
- if (new_value.size() == setting_value.size()) return true;
- return chain.updateRwSetting("wallet", new_value);
+ const auto update_function = [&wallet_name](common::SettingsValue& setting_value) {
+ if (!setting_value.isArray()) return interfaces::SettingsAction::SKIP_WRITE;
+ common::SettingsValue new_value(common::SettingsValue::VARR);
+ for (const auto& value : setting_value.getValues()) {
+ if (!value.isStr() || value.get_str() != wallet_name) new_value.push_back(value);
+ }
+ if (new_value.size() == setting_value.size()) return interfaces::SettingsAction::SKIP_WRITE;
+ setting_value = std::move(new_value);
+ return interfaces::SettingsAction::WRITE;
+ };
+ return chain.updateRwSetting("wallet", update_function);
}
static void UpdateWalletSetting(interfaces::Chain& chain,
@@ -1039,21 +1044,20 @@ bool CWallet::IsSpentKey(const CScript& scriptPubKey) const
return true;
}
- LegacyScriptPubKeyMan* spk_man = GetLegacyScriptPubKeyMan();
- if (!spk_man) return false;
-
- for (const auto& keyid : GetAffectedKeys(scriptPubKey, *spk_man)) {
- WitnessV0KeyHash wpkh_dest(keyid);
- if (IsAddressPreviouslySpent(wpkh_dest)) {
- return true;
- }
- ScriptHash sh_wpkh_dest(GetScriptForDestination(wpkh_dest));
- if (IsAddressPreviouslySpent(sh_wpkh_dest)) {
- return true;
- }
- PKHash pkh_dest(keyid);
- if (IsAddressPreviouslySpent(pkh_dest)) {
- return true;
+ if (LegacyScriptPubKeyMan* spk_man = GetLegacyScriptPubKeyMan()) {
+ for (const auto& keyid : GetAffectedKeys(scriptPubKey, *spk_man)) {
+ WitnessV0KeyHash wpkh_dest(keyid);
+ if (IsAddressPreviouslySpent(wpkh_dest)) {
+ return true;
+ }
+ ScriptHash sh_wpkh_dest(GetScriptForDestination(wpkh_dest));
+ if (IsAddressPreviouslySpent(sh_wpkh_dest)) {
+ return true;
+ }
+ PKHash pkh_dest(keyid);
+ if (IsAddressPreviouslySpent(pkh_dest)) {
+ return true;
+ }
}
}
return false;
@@ -1776,14 +1780,14 @@ bool CWallet::ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const in
return spk_man->ImportPrivKeys(privkey_map, timestamp);
}
-bool CWallet::ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp)
+bool CWallet::ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp)
{
auto spk_man = GetLegacyScriptPubKeyMan();
if (!spk_man) {
return false;
}
LOCK(spk_man->cs_KeyStore);
- return spk_man->ImportPubKeys(ordered_pubkeys, pubkey_map, key_origins, add_keypool, internal, timestamp);
+ return spk_man->ImportPubKeys(ordered_pubkeys, pubkey_map, key_origins, add_keypool, timestamp);
}
bool CWallet::ImportScriptPubKeys(const std::string& label, const std::set<CScript>& script_pub_keys, const bool have_solving_data, const bool apply_label, const int64_t timestamp)
@@ -1917,14 +1921,14 @@ CWallet::ScanResult CWallet::ScanForWalletTransactions(const uint256& start_bloc
auto matches_block{fast_rescan_filter->MatchesBlock(block_hash)};
if (matches_block.has_value()) {
if (*matches_block) {
- LogPrint(BCLog::SCAN, "Fast rescan: inspect block %d [%s] (filter matched)\n", block_height, block_hash.ToString());
+ LogDebug(BCLog::SCAN, "Fast rescan: inspect block %d [%s] (filter matched)\n", block_height, block_hash.ToString());
} else {
result.last_scanned_block = block_hash;
result.last_scanned_height = block_height;
fetch_block = false;
}
} else {
- LogPrint(BCLog::SCAN, "Fast rescan: inspect block %d [%s] (WARNING: block filter not found!)\n", block_height, block_hash.ToString());
+ LogDebug(BCLog::SCAN, "Fast rescan: inspect block %d [%s] (WARNING: block filter not found!)\n", block_height, block_hash.ToString());
}
}
@@ -3776,10 +3780,11 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
const std::string& desc_str = desc_val.getValStr();
FlatSigningProvider keys;
std::string desc_error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, desc_error, false);
- if (desc == nullptr) {
+ auto descs = Parse(desc_str, keys, desc_error, false);
+ if (descs.empty()) {
throw std::runtime_error(std::string(__func__) + ": Invalid descriptor \"" + desc_str + "\" (" + desc_error + ")");
}
+ auto& desc = descs.at(0);
if (!desc->GetOutputType()) {
continue;
}
@@ -4314,12 +4319,12 @@ bool DoMigration(CWallet& wallet, WalletContext& context, bilingual_str& error,
// Parse the descriptor
FlatSigningProvider keys;
std::string parse_err;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, parse_err, /* require_checksum */ true);
- assert(desc); // It shouldn't be possible to have the LegacyScriptPubKeyMan make an invalid descriptor
- assert(!desc->IsRange()); // It shouldn't be possible to have LegacyScriptPubKeyMan make a ranged watchonly descriptor
+ std::vector<std::unique_ptr<Descriptor>> descs = Parse(desc_str, keys, parse_err, /* require_checksum */ true);
+ assert(descs.size() == 1); // It shouldn't be possible to have the LegacyScriptPubKeyMan make an invalid descriptor or a multipath descriptors
+ assert(!descs.at(0)->IsRange()); // It shouldn't be possible to have LegacyScriptPubKeyMan make a ranged watchonly descriptor
// Add to the wallet
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ WalletDescriptor w_desc(std::move(descs.at(0)), creation_time, 0, 0, 0);
data->watchonly_wallet->AddWalletDescriptor(w_desc, keys, "", false);
}
@@ -4351,12 +4356,12 @@ bool DoMigration(CWallet& wallet, WalletContext& context, bilingual_str& error,
// Parse the descriptor
FlatSigningProvider keys;
std::string parse_err;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, parse_err, /* require_checksum */ true);
- assert(desc); // It shouldn't be possible to have the LegacyScriptPubKeyMan make an invalid descriptor
- assert(!desc->IsRange()); // It shouldn't be possible to have LegacyScriptPubKeyMan make a ranged watchonly descriptor
+ std::vector<std::unique_ptr<Descriptor>> descs = Parse(desc_str, keys, parse_err, /* require_checksum */ true);
+ assert(descs.size() == 1); // It shouldn't be possible to have the LegacyScriptPubKeyMan make an invalid descriptor or a multipath descriptors
+ assert(!descs.at(0)->IsRange()); // It shouldn't be possible to have LegacyScriptPubKeyMan make a ranged watchonly descriptor
// Add to the wallet
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ WalletDescriptor w_desc(std::move(descs.at(0)), creation_time, 0, 0, 0);
data->solvable_wallet->AddWalletDescriptor(w_desc, keys, "", false);
}
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index 3ea1cf48b2..485eed11fa 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -683,7 +683,7 @@ public:
bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
- bool ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
+ bool ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool ImportScriptPubKeys(const std::string& label, const std::set<CScript>& script_pub_keys, const bool have_solving_data, const bool apply_label, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
/** Updates wallet birth time if 'time' is below it */
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
index 18d6e1407e..47b84f7e6a 100644
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -1247,19 +1247,19 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet)
static bool RunWithinTxn(WalletBatch& batch, std::string_view process_desc, const std::function<bool(WalletBatch&)>& func)
{
if (!batch.TxnBegin()) {
- LogPrint(BCLog::WALLETDB, "Error: cannot create db txn for %s\n", process_desc);
+ LogDebug(BCLog::WALLETDB, "Error: cannot create db txn for %s\n", process_desc);
return false;
}
// Run procedure
if (!func(batch)) {
- LogPrint(BCLog::WALLETDB, "Error: %s failed\n", process_desc);
+ LogDebug(BCLog::WALLETDB, "Error: %s failed\n", process_desc);
batch.TxnAbort();
return false;
}
if (!batch.TxnCommit()) {
- LogPrint(BCLog::WALLETDB, "Error: cannot commit db txn for %s\n", process_desc);
+ LogDebug(BCLog::WALLETDB, "Error: cannot commit db txn for %s\n", process_desc);
return false;
}
diff --git a/src/wallet/walletutil.cpp b/src/wallet/walletutil.cpp
index 0de2617d45..53e65d0194 100644
--- a/src/wallet/walletutil.cpp
+++ b/src/wallet/walletutil.cpp
@@ -94,8 +94,8 @@ WalletDescriptor GenerateWalletDescriptor(const CExtPubKey& master_key, const Ou
// Make the descriptor
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ std::vector<std::unique_ptr<Descriptor>> desc = Parse(desc_str, keys, error, false);
+ WalletDescriptor w_desc(std::move(desc.at(0)), creation_time, 0, 0, 0);
return w_desc;
}
diff --git a/src/wallet/walletutil.h b/src/wallet/walletutil.h
index 96cb35b926..ef9d93eb07 100644
--- a/src/wallet/walletutil.h
+++ b/src/wallet/walletutil.h
@@ -96,10 +96,14 @@ public:
{
std::string error;
FlatSigningProvider keys;
- descriptor = Parse(str, keys, error, true);
- if (!descriptor) {
+ auto descs = Parse(str, keys, error, true);
+ if (descs.empty()) {
throw std::ios_base::failure("Invalid descriptor: " + error);
}
+ if (descs.size() > 1) {
+ throw std::ios_base::failure("Can't load a multipath descriptor from databases");
+ }
+ descriptor = std::move(descs.at(0));
id = DescriptorID(*descriptor);
}
diff --git a/src/zmq/CMakeLists.txt b/src/zmq/CMakeLists.txt
new file mode 100644
index 0000000000..8ecb236b46
--- /dev/null
+++ b/src/zmq/CMakeLists.txt
@@ -0,0 +1,24 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(bitcoin_zmq STATIC EXCLUDE_FROM_ALL
+ zmqabstractnotifier.cpp
+ zmqnotificationinterface.cpp
+ zmqpublishnotifier.cpp
+ zmqrpc.cpp
+ zmqutil.cpp
+)
+target_compile_definitions(bitcoin_zmq
+ INTERFACE
+ ENABLE_ZMQ=1
+ PRIVATE
+ $<$<AND:$<PLATFORM_ID:Windows>,$<CXX_COMPILER_ID:GNU>>:ZMQ_STATIC>
+)
+target_link_libraries(bitcoin_zmq
+ PRIVATE
+ core_interface
+ univalue
+ $<TARGET_NAME_IF_EXISTS:libzmq>
+ $<TARGET_NAME_IF_EXISTS:PkgConfig::libzmq>
+)
diff --git a/src/zmq/zmqnotificationinterface.cpp b/src/zmq/zmqnotificationinterface.cpp
index 44cbacda64..0039f55698 100644
--- a/src/zmq/zmqnotificationinterface.cpp
+++ b/src/zmq/zmqnotificationinterface.cpp
@@ -88,9 +88,9 @@ bool CZMQNotificationInterface::Initialize()
{
int major = 0, minor = 0, patch = 0;
zmq_version(&major, &minor, &patch);
- LogPrint(BCLog::ZMQ, "version %d.%d.%d\n", major, minor, patch);
+ LogDebug(BCLog::ZMQ, "version %d.%d.%d\n", major, minor, patch);
- LogPrint(BCLog::ZMQ, "Initialize notification interface\n");
+ LogDebug(BCLog::ZMQ, "Initialize notification interface\n");
assert(!pcontext);
pcontext = zmq_ctx_new();
@@ -103,9 +103,9 @@ bool CZMQNotificationInterface::Initialize()
for (auto& notifier : notifiers) {
if (notifier->Initialize(pcontext)) {
- LogPrint(BCLog::ZMQ, "Notifier %s ready (address = %s)\n", notifier->GetType(), notifier->GetAddress());
+ LogDebug(BCLog::ZMQ, "Notifier %s ready (address = %s)\n", notifier->GetType(), notifier->GetAddress());
} else {
- LogPrint(BCLog::ZMQ, "Notifier %s failed (address = %s)\n", notifier->GetType(), notifier->GetAddress());
+ LogDebug(BCLog::ZMQ, "Notifier %s failed (address = %s)\n", notifier->GetType(), notifier->GetAddress());
return false;
}
}
@@ -116,11 +116,11 @@ bool CZMQNotificationInterface::Initialize()
// Called during shutdown sequence
void CZMQNotificationInterface::Shutdown()
{
- LogPrint(BCLog::ZMQ, "Shutdown notification interface\n");
+ LogDebug(BCLog::ZMQ, "Shutdown notification interface\n");
if (pcontext)
{
for (auto& notifier : notifiers) {
- LogPrint(BCLog::ZMQ, "Shutdown notifier %s at %s\n", notifier->GetType(), notifier->GetAddress());
+ LogDebug(BCLog::ZMQ, "Shutdown notifier %s at %s\n", notifier->GetType(), notifier->GetAddress());
notifier->Shutdown();
}
zmq_ctx_term(pcontext);
diff --git a/src/zmq/zmqpublishnotifier.cpp b/src/zmq/zmqpublishnotifier.cpp
index 608870c489..c0a04d28a6 100644
--- a/src/zmq/zmqpublishnotifier.cpp
+++ b/src/zmq/zmqpublishnotifier.cpp
@@ -118,7 +118,7 @@ bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
return false;
}
- LogPrint(BCLog::ZMQ, "Outbound message high water mark for %s at %s is %d\n", type, address, outbound_message_high_water_mark);
+ LogDebug(BCLog::ZMQ, "Outbound message high water mark for %s at %s is %d\n", type, address, outbound_message_high_water_mark);
int rc = zmq_setsockopt(psocket, ZMQ_SNDHWM, &outbound_message_high_water_mark, sizeof(outbound_message_high_water_mark));
if (rc != 0)
@@ -159,8 +159,8 @@ bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
}
else
{
- LogPrint(BCLog::ZMQ, "Reusing socket for address %s\n", address);
- LogPrint(BCLog::ZMQ, "Outbound message high water mark for %s at %s is %d\n", type, address, outbound_message_high_water_mark);
+ LogDebug(BCLog::ZMQ, "Reusing socket for address %s\n", address);
+ LogDebug(BCLog::ZMQ, "Outbound message high water mark for %s at %s is %d\n", type, address, outbound_message_high_water_mark);
psocket = i->second->psocket;
mapPublishNotifiers.insert(std::make_pair(address, this));
@@ -191,7 +191,7 @@ void CZMQAbstractPublishNotifier::Shutdown()
if (count == 1)
{
- LogPrint(BCLog::ZMQ, "Close socket at address %s\n", address);
+ LogDebug(BCLog::ZMQ, "Close socket at address %s\n", address);
int linger = 0;
zmq_setsockopt(psocket, ZMQ_LINGER, &linger, sizeof(linger));
zmq_close(psocket);
@@ -220,7 +220,7 @@ bool CZMQAbstractPublishNotifier::SendZmqMessage(const char *command, const void
bool CZMQPublishHashBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
{
uint256 hash = pindex->GetBlockHash();
- LogPrint(BCLog::ZMQ, "Publish hashblock %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish hashblock %s to %s\n", hash.GetHex(), this->address);
uint8_t data[32];
for (unsigned int i = 0; i < 32; i++) {
data[31 - i] = hash.begin()[i];
@@ -231,7 +231,7 @@ bool CZMQPublishHashBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
bool CZMQPublishHashTransactionNotifier::NotifyTransaction(const CTransaction &transaction)
{
uint256 hash = transaction.GetHash();
- LogPrint(BCLog::ZMQ, "Publish hashtx %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish hashtx %s to %s\n", hash.GetHex(), this->address);
uint8_t data[32];
for (unsigned int i = 0; i < 32; i++) {
data[31 - i] = hash.begin()[i];
@@ -241,7 +241,7 @@ bool CZMQPublishHashTransactionNotifier::NotifyTransaction(const CTransaction &t
bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
{
- LogPrint(BCLog::ZMQ, "Publish rawblock %s to %s\n", pindex->GetBlockHash().GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish rawblock %s to %s\n", pindex->GetBlockHash().GetHex(), this->address);
std::vector<uint8_t> block{};
if (!m_get_block_by_index(block, *pindex)) {
@@ -255,7 +255,7 @@ bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
bool CZMQPublishRawTransactionNotifier::NotifyTransaction(const CTransaction &transaction)
{
uint256 hash = transaction.GetHash();
- LogPrint(BCLog::ZMQ, "Publish rawtx %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish rawtx %s to %s\n", hash.GetHex(), this->address);
DataStream ss;
ss << TX_WITH_WITNESS(transaction);
return SendZmqMessage(MSG_RAWTX, &(*ss.begin()), ss.size());
@@ -277,27 +277,27 @@ static bool SendSequenceMsg(CZMQAbstractPublishNotifier& notifier, uint256 hash,
bool CZMQPublishSequenceNotifier::NotifyBlockConnect(const CBlockIndex *pindex)
{
uint256 hash = pindex->GetBlockHash();
- LogPrint(BCLog::ZMQ, "Publish sequence block connect %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish sequence block connect %s to %s\n", hash.GetHex(), this->address);
return SendSequenceMsg(*this, hash, /* Block (C)onnect */ 'C');
}
bool CZMQPublishSequenceNotifier::NotifyBlockDisconnect(const CBlockIndex *pindex)
{
uint256 hash = pindex->GetBlockHash();
- LogPrint(BCLog::ZMQ, "Publish sequence block disconnect %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish sequence block disconnect %s to %s\n", hash.GetHex(), this->address);
return SendSequenceMsg(*this, hash, /* Block (D)isconnect */ 'D');
}
bool CZMQPublishSequenceNotifier::NotifyTransactionAcceptance(const CTransaction &transaction, uint64_t mempool_sequence)
{
uint256 hash = transaction.GetHash();
- LogPrint(BCLog::ZMQ, "Publish hashtx mempool acceptance %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish hashtx mempool acceptance %s to %s\n", hash.GetHex(), this->address);
return SendSequenceMsg(*this, hash, /* Mempool (A)cceptance */ 'A', mempool_sequence);
}
bool CZMQPublishSequenceNotifier::NotifyTransactionRemoval(const CTransaction &transaction, uint64_t mempool_sequence)
{
uint256 hash = transaction.GetHash();
- LogPrint(BCLog::ZMQ, "Publish hashtx mempool removal %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish hashtx mempool removal %s to %s\n", hash.GetHex(), this->address);
return SendSequenceMsg(*this, hash, /* Mempool (R)emoval */ 'R', mempool_sequence);
}
diff --git a/src/zmq/zmqutil.cpp b/src/zmq/zmqutil.cpp
index 3c6d1b9ab5..842928ed1e 100644
--- a/src/zmq/zmqutil.cpp
+++ b/src/zmq/zmqutil.cpp
@@ -12,5 +12,5 @@
void zmqError(const std::string& str)
{
- LogPrint(BCLog::ZMQ, "Error: %s, msg: %s\n", str, zmq_strerror(errno));
+ LogDebug(BCLog::ZMQ, "Error: %s, msg: %s\n", str, zmq_strerror(errno));
}